Comparação visual entre estratégia e Buy & Hold Returns

Autora:ChaoZhang, Data: 2024-01-05 15:27:26
Tags:

img

Resumo

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.

Estratégia lógica

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:

  1. Estratégia P/L: lucro líquido estratégico + lucro aberto estratégico
  2. Comprar e manter P/L: rendimento não realizado
  3. Diferença: Estratégia P/L - Comprar e manter P/L
  4. Estratégia vs. Estadísticas de compra
    • Percentagem de estratégia de barras P/L acima de Buy & Hold
    • Percentagem de estratégia de barras P/L abaixo de Buy & Hold
    • Diferença média de todos os tempos

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.

Análise das vantagens

Em comparação com uma simples comparação dos retornos de compra e retenção, esta estratégia tem as seguintes vantagens:

  1. 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.

  2. Gráficos visuais intuitivos que traçam a estratégia P/L, buy & hold P/L e a diferença entre eles.

  3. 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.

  4. É 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.

Análise de riscos

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.

Orientações de otimização

Esta estratégia pode ser melhorada a partir dos seguintes aspectos:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Conclusão

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)



Mais.