Esta estratégia faz uma comparação detalhada e visual entre uma dada estratégia e os retornos de compra e retenção do título negociado.
A lógica central desta estratégia consiste em traçar quatro elementos-chave para comparação entre a estratégia dada e a estratégia buy & hold:
Ao comparar os quatro elementos acima, podemos ter uma compreensão intuitiva sobre se a nossa estratégia supera ou supera uma simples estratégia de compra e retenção.
Em comparação com uma simples comparação dos retornos de compra e retenção, esta estratégia tem as seguintes vantagens:
Métricas de comparação mais abrangentes e detalhadas, incluindo comparações por barra e comparações estatísticas globais, para que saibamos claramente quando e onde a nossa estratégia vence ou perde para comprar e manter.
Gráficos visuais intuitivos que traçam a estratégia P/L, buy & hold P/L e a diferença entre eles.
Intervalo de datas de comparação personalizável onde podemos nos concentrar em comparar nossa estratégia vs buy & hold em períodos específicos.
É simples e fácil de usar. A lógica de comparação é incorporada para que nós só precisemos substituir a seção de script estratégico com o nosso próprio. Não é necessário codificar a lógica de comparação nós mesmos.
Esta estratégia baseia-se principalmente nas métricas de retorno de compra e retenção integradas da plataforma de negociação para comparação. Qualquer viés com esse índice de referência afetará o resultado final. Além disso, podem existir falhas nos cálculos estatísticos desta estratégia que não refletem com precisão a comparação.
Se a plataforma de negociação introduz alterações significativas na métrica de compra e retenção, a lógica de comparação deve também ser ajustada.
Esta estratégia pode ser melhorada a partir dos seguintes aspectos:
Introduzir mais parâmetros de referência para comparação em três ou em vários sentidos, por exemplo, comparando com um índice ou com pares do setor.
Incluir mais métricas estatísticas como taxa de ganho anual, diferença de duração máxima de retirada, etc. para avaliar a estratégia a partir de mais dimensões.
Faça com que mais componentes, como benchmarks, métricas, etc. sejam personalizáveis pelos usuários em vez de apenas o intervalo de datas.
Melhorar a visualização de gráficos, uma vez que gráficos de linhas simples aqui tornam difícil identificar comparações detalhadas em barras específicas.
Com métricas de comparação detalhadas e gráficos visuais intuitivos, esta estratégia nos permite ter uma visão muito clara de onde e como nossa estratégia personalizada difere de uma abordagem simples de compra e retenção.
O enriquecimento dos parâmetros de referência, métricas e visualizações pode transformá-lo num conjunto de ferramentas extremamente poderoso para a análise de estratégias, fornecendo um modelo e uma estrutura para tornar a análise e as melhorias de estratégias muito mais eficientes.
/*backtest start: 2023-12-28 00:00:00 end: 2024-01-04 00:00:00 period: 3m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("VS Buy Hold", precision=2) bnh_info_panel = input(true, title='Enable Info Panel') bnh_indicator_panel = input(true, title='Enable Indicator Panel') //COMPARISON DATE RANGE// bnh_FromYear = input(1970, title="From Year", minval=1970) bnh_FromMonth = input(1, title="From Month", minval=1, maxval=12) bnh_FromDay = input(1, title="From Day", minval=1, maxval=31) bnh_ToYear = input(2050, title="To Year", minval=2010) bnh_ToMonth = input(12, title="To Month", minval=1, maxval=12) bnh_ToDay = input(31, title="To Day", minval=1, maxval=31) bnh_start = timestamp(bnh_FromYear, bnh_FromMonth, bnh_FromDay, 00, 00) bnh_finish = timestamp(bnh_ToYear, bnh_ToMonth, bnh_ToDay, 23, 59) bnh_timeCond = time >= bnh_start and time <= bnh_finish ? true: false //Note: If you are going to use the COMPARISON DATE RANGE above, apply bnh_timeCond // to your strategy parameters. ///////////////////////////////////////////////////////////////////////////////////// //////////////////////////////STRATEGY SCRIPT START////////////////////////////////// //=========================PLACEHOLDER MA CROSS STRATEGY=========================// fastLength = 50 slowLength = 200 price = close mafast = sma(price, fastLength) maslow = sma(price, slowLength) strategy.initial_capital = 50000 positionSize = strategy.initial_capital / close if (crossover(mafast, maslow) and bnh_timeCond) // <= bnh_timeCond added as a condition strategy.entry("MA2CrossLE", strategy.long, positionSize, comment="MA2CrossLE") if (crossunder(mafast, maslow) and bnh_timeCond) // <= bnh_timeCond added as a condition strategy.entry("MA2CrossSE", strategy.short, positionSize, comment="MA2CrossSE") //////////////////////////////STRATEGY SCRIPT END//////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// //STRATEGY EQUITY strategy_pnl = strategy.netprofit + strategy.openprofit bnh_strategy_pnl_pcnt = (strategy_pnl / strategy.initial_capital) * 100 //BUY AND HOLD EQUITY float bnh_start_bar = na bnh_start_bar := na(bnh_start_bar[1]) and bnh_timeCond? close : bnh_start_bar[1] bnl_buy_hold_equity = ((close - bnh_start_bar)/bnh_start_bar) * 100 //STRATEGY VS BUY AND HOLD STATS bnh_vs_diff = bnh_strategy_pnl_pcnt - bnl_buy_hold_equity bnh_bar_counter = 0 bnh_bar_counter := bnh_vs_diff > 0 ? nz(bnh_bar_counter[1]) + 1 : bnh_bar_counter[1] bnh_bar_counter2 = 0 bnh_bar_counter2 := bnh_vs_diff <= 0 ? nz(bnh_bar_counter2[1]) + 1 : bnh_bar_counter2[1] bnh_pcnt_above = (bnh_bar_counter/(bnh_bar_counter + bnh_bar_counter2))*100 bnh_pcnt_below = (bnh_bar_counter2/(bnh_bar_counter + bnh_bar_counter2))*100 bnh_average_diff = cum(bnh_vs_diff) / (bnh_bar_counter + bnh_bar_counter2) //PLOTS AND LABELS bnh_diff_color = bnh_vs_diff > 0 ? color.green : color.red plot(bnh_vs_diff, style=plot.style_columns, color=bnh_diff_color, transp=60, title='SvB') plot(bnh_strategy_pnl_pcnt, color=color.yellow, linewidth=2, title="SR") plot(bnl_buy_hold_equity, color=color.blue, title="BHR") // draw_IndicatorLabel(_text, _x, _y, label_color, font_color)=> // string_text = _text // var label la_indicator = na // label.delete(la_indicator) // la_indicator := label.new( // x=_x, y=_y, // text=string_text, xloc=xloc.bar_index, yloc=yloc.price, // color=label_color, style=label.style_labeldown, textcolor=font_color, size=size.small) // draw_InfoPanel(_text, _x, _y, font_size)=> // var label la_panel = na // label.delete(la_panel) // la_panel := label.new( // x=_x, y=_y, // text=_text, xloc=xloc.bar_time, yloc=yloc.price, // color=color.new(#383838, 5), style=label.style_labelup, textcolor=color.white, size=font_size) // if bnh_indicator_panel // draw_IndicatorLabel("Difference", bar_index, bnh_vs_diff, color.new(color.gray, 40), color.white) // draw_IndicatorLabel("Strategy P/L", bar_index, bnh_strategy_pnl_pcnt, color.new(color.yellow, 50), color.white) // draw_IndicatorLabel("Buy & Hold P/L", bar_index, bnl_buy_hold_equity, color.new(color.blue, 50), color.white) // info_panel_x = time_close + round(change(time) * 200) // info_panel_y = max(max(bnl_buy_hold_equity, bnh_strategy_pnl_pcnt), bnh_vs_diff) + abs(bnh_vs_diff * 0.25) // title = "STRATEGY vs BUY & HOLD STATS" // row0 = "-----------------------------------------------------" // row1 = 'Bars Above Buy & Hold: ' + tostring(bnh_pcnt_above, '#.##') + '%' // row2 = 'Bars Below Buy & Hold: ' + tostring(bnh_pcnt_below, '#.##') + '%' // row3 = 'All Time Ave. Difference: ' + tostring(bnh_average_diff, '#.##') + '%' // panel_text = '\n' + title + '\n' + row0 + '\n' + row1 + '\n\n' + row2 + '\n\n' + row3 + '\n' // if bnh_info_panel // draw_InfoPanel(panel_text, info_panel_x, info_panel_y, size.normal)