Comparación visual entre estrategia y Buy & Hold Returns

El autor:¿ Qué pasa?, Fecha: 2024-01-05 15:27:26
Las etiquetas:

img

Resumen general

Esta estrategia hace una comparación detallada y visual entre una estrategia dada y los rendimientos de compra y retención del valor negociado.

Estrategia lógica

La lógica central de esta estrategia es trazar cuatro elementos clave para la comparación entre la estrategia dada y la estrategia de compra y retención:

  1. P/L de la estrategia: beneficio neto de la estrategia + beneficio abierto de la estrategia
  2. Comprar y mantener P/L: rendimiento no realizado
  3. Diferencia: estrategia P/L - Comprar y mantener P/L
  4. Estrategia vs. Estadísticas de compra y retención
    • Porcentaje de la estrategia de barras P/L está por encima de Buy & Hold
    • Porcentaje de estrategia de barras P/L está por debajo de Buy & Hold
    • Diferencia media de todos los tiempos

Al comparar los cuatro elementos anteriores, podemos tener una comprensión intuitiva de si nuestra estrategia supera o menos que una simple estrategia de compra y retención.

Análisis de ventajas

En comparación con una simple comparación de los rendimientos de compra y retención, esta estrategia tiene las siguientes ventajas:

  1. Métricas de comparación más completas y detalladas, incluidas las comparaciones por barra y las comparaciones estadísticas generales, para que sepamos claramente cuándo y dónde nuestra estrategia vence o pierde para comprar y mantener.

  2. gráficos visuales intuitivos que trazan la estrategia P/L, compra y mantenimiento P/L y la diferencia entre ellos.

  3. Rango de fecha de comparación personalizable donde podemos centrarnos en comparar nuestra estrategia vs buy & hold en períodos específicos.

  4. Simple y fácil de usar. La lógica de comparación está incorporada de modo que solo necesitamos reemplazar la sección de guión de estrategia con la nuestra. No es necesario codificar la lógica de comparación nosotros mismos.

Análisis de riesgos

Esta estrategia se basa principalmente en las métricas de rendimiento de compra y retención integradas de la plataforma de negociación para la comparación. Cualquier sesgo con ese índice de referencia afectará al resultado final. Además, puede haber fallas en los cálculos estadísticos de esta estrategia que no reflejan con precisión la comparación.

Si la plataforma de negociación introduce cambios significativos en la métrica de compra y retención, también es necesario ajustar la lógica de comparación.

Direcciones de optimización

Esta estrategia puede optimizarse aún más en los siguientes aspectos:

  1. Introducir más puntos de referencia para la comparación de tres o varias direcciones, por ejemplo, comparando con un índice o con pares de la industria.

  2. Incluir más métricas estadísticas como la tasa de ganancia anual, la diferencia de duración máxima de extracción, etc. para evaluar la estrategia desde más dimensiones.

  3. Hacer más componentes como puntos de referencia, métricas, etc. personalizables por los usuarios en lugar de solo el rango de fechas.

  4. Mejorar la visualización de gráficos ya que los gráficos de líneas simples hacen que sea difícil detectar comparaciones detalladas en barras específicas.

Conclusión

Con métricas de comparación detalladas y gráficos visuales intuitivos, esta estrategia nos permite tener una visión muy clara de dónde y cómo nuestra estrategia personalizada difiere de un simple enfoque de compra y retención.

La ampliación de los puntos de referencia, las métricas y las visualizaciones puede convertirlo en un conjunto de herramientas extremadamente potente para el análisis de estrategias, proporcionando una plantilla y un marco para hacer que el análisis y las mejoras de estrategias sean mucho más 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)



Más.