Esta estrategia hace una comparación detallada y visual entre una estrategia dada y los rendimientos de compra y retención del valor negociado.
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:
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.
En comparación con una simple comparación de los rendimientos de compra y retención, esta estrategia tiene las siguientes ventajas:
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.
gráficos visuales intuitivos que trazan la estrategia P/L, compra y mantenimiento P/L y la diferencia entre ellos.
Rango de fecha de comparación personalizable donde podemos centrarnos en comparar nuestra estrategia vs buy & hold en períodos específicos.
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.
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.
Esta estrategia puede optimizarse aún más en los siguientes aspectos:
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.
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.
Hacer más componentes como puntos de referencia, métricas, etc. personalizables por los usuarios en lugar de solo el rango de fechas.
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.
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)