Cette stratégie permet une comparaison détaillée et visuelle entre une stratégie donnée et les rendements d'achat et de détention du titre négocié.
La logique de base de cette stratégie est de tracer quatre éléments clés pour la comparaison entre la stratégie donnée et la stratégie d'achat et de détention:
En comparant les quatre éléments ci-dessus, nous pouvons avoir une compréhension intuitive de si notre stratégie surpasse ou sous-performe une simple stratégie d'achat et de détention.
Comparée à une simple comparaison des rendements d'achat et de détention, cette stratégie présente les avantages suivants:
Des mesures de comparaison plus complètes et plus détaillées, y compris des comparaisons par barre et des comparaisons statistiques globales, afin que nous sachions clairement quand et où notre stratégie bat ou perd pour acheter et conserver.
Des graphiques visuels intuitifs qui tracent la stratégie P/L, buy & hold P/L et la différence entre eux.
Plage de dates de comparaison personnalisable où nous pouvons nous concentrer sur la comparaison de notre stratégie par rapport à l'achat et à la détention sur des périodes spécifiques.
Simple et facile à utiliser. La logique de comparaison est intégrée de sorte que nous n'avons qu'à remplacer la section du script de stratégie par la nôtre. Pas besoin de coder la logique de comparaison nous-mêmes.
Cette stratégie repose principalement sur les métriques de rendement intégrées de la plateforme de trading pour la comparaison. Tout biais avec ce benchmark affectera le résultat final. Il peut également y avoir des défauts dans les calculs statistiques de cette stratégie qui ne reflètent pas avec précision la comparaison.
Si la plateforme de négociation apporte des modifications significatives à la métrique d'achat et de détention, la logique de comparaison doit également être ajustée.
Cette stratégie peut être encore optimisée par les aspects suivants:
Mettre en place davantage de critères de référence pour la comparaison à trois voies ou à plusieurs voies, par exemple la comparaison par rapport à un indice ou à des pairs du secteur.
Incluez plus de mesures statistiques telles que le taux de gain annuel, la différence de durée maximale de tirage, etc. pour évaluer la stratégie à partir de plus de dimensions.
Faire en sorte que plus de composants tels que les repères, les métriques, etc. soient personnalisables par les utilisateurs au lieu de la seule plage de dates.
Améliorez la visualisation des graphiques, car les graphiques linéaires simples rendent difficile l'identification de comparaisons détaillées sur des barres spécifiques.
Avec des métriques de comparaison détaillées et des graphiques visuels intuitifs, cette stratégie nous permet d'avoir une vue très claire sur où et comment notre stratégie personnalisée diffère d'une approche simple d'achat et de détention.
L'enrichissement des indicateurs de référence, des métriques et des visualisations peut en faire une boîte à outils extrêmement puissante pour l'analyse stratégique.
/*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)