Diese Strategie stellt einen detaillierten und visuellen Vergleich zwischen einer bestimmten Strategie und der Buy & Hold Rendite des gehandelten Wertpapiers her.
Die Kernlogik dieser Strategie besteht darin, vier Schlüsselelemente für den Vergleich zwischen der gegebenen Strategie und der Buy & Hold-Strategie zu erstellen:
Durch den Vergleich der oben genannten vier Elemente können wir intuitiv verstehen, ob unsere Strategie eine einfache Buy & Hold-Strategie übertrifft oder untertrifft.
Im Vergleich zu einem einfachen Vergleich der Buy & Hold-Renditen hat diese Strategie folgende Vorteile:
Umfassendere und detailliertere Vergleichsmetriken, einschließlich Vergleiche pro Stange und Gesamtstatistikvergleiche, damit wir klar wissen, wann und wo unsere Strategie beim Buy & Hold schlägt oder verliert.
Intuitive visuelle Diagramme, die die Strategie P/L, Buy & Hold P/L und den Unterschied zwischen ihnen darstellen.
Anpassbarer Vergleichsdatumsbereich, in dem wir uns darauf konzentrieren können, unsere Strategie gegen Buy & Hold auf bestimmte Zeiträume zu vergleichen.
Einfach und einfach zu bedienen. Die Vergleichslogik ist eingebaut, sodass wir nur den Strategie-Skript-Abschnitt durch unseren eigenen ersetzen müssen.
Diese Strategie stützt sich hauptsächlich auf die integrierten Buy & Hold-Return-Metriken der Handelsplattform zum Vergleich. Jede Verzerrung mit diesem Benchmark wirkt sich auf das Endergebnis aus. Außerdem können in den statistischen Berechnungen dieser Strategie Mängel auftreten, die den Vergleich nicht genau widerspiegeln.
Wenn die Handelsplattform erhebliche Änderungen an der Buy & Hold-Metrik vornimmt, muss auch die Vergleichslogik angepasst werden.
Diese Strategie kann aus folgenden Gesichtspunkten weiter optimiert werden:
Mehr Benchmarks für einen dreiseitigen oder mehrseitigen Vergleich einführen, z. B. im Vergleich zu einem Index oder Branchenkollegen.
Einbeziehen Sie mehr statistische Kennzahlen wie jährliche Gewinnrate, maximale Differenz in der Auslastungsdauer usw., um die Strategie aus mehr Dimensionen zu bewerten.
Erstellen Sie mehr Komponenten wie Benchmarks, Metriken usw., die von Benutzern anstelle des Datumsbereichs angepasst werden können.
Verbessern Sie die Grafikvisualisierung, da einfache Liniendiagramme es hier schwierig machen, detaillierte Vergleiche auf bestimmten Balken zu erkennen.
Mit detaillierten Vergleichsmetriken und intuitiven visuellen Diagrammen ermöglicht uns diese Strategie einen sehr klaren Überblick darüber, wo und wie sich unsere benutzerdefinierte Strategie von einem einfachen Buy & Hold-Ansatz unterscheidet.
Durch die weitere Anreicherung der Benchmarks, Metriken und Visualisierungen kann dies zu einem äußerst leistungsfähigen Toolkit für die Strategieanalyse werden.
/*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)