Strategi ini membuat perbandingan rinci dan visual antara strategi tertentu dan buy & hold return dari sekuritas yang diperdagangkan.
Logika inti dari strategi ini adalah untuk memetakan empat elemen kunci untuk perbandingan antara strategi yang diberikan dan strategi beli & tahan:
Dengan membandingkan empat elemen di atas, kita dapat memiliki pemahaman intuitif tentang apakah strategi kita berkinerja lebih baik atau kurang dari strategi beli & tahan sederhana.
Dibandingkan dengan perbandingan sederhana dari buy & hold return, strategi ini memiliki keuntungan berikut:
Metrik perbandingan yang lebih komprehensif dan terperinci, termasuk perbandingan per bar dan perbandingan statistik secara keseluruhan, sehingga kita tahu dengan jelas kapan dan di mana strategi kita mengalahkan atau kalah untuk membeli & memegang.
Grafik visual intuitif yang memetakan strategi P / L, beli & tahan P / L dan perbedaan di antara mereka.
Rentang tanggal perbandingan yang dapat disesuaikan di mana kita dapat fokus pada perbandingan strategi kita vs beli & tahan pada periode tertentu.
Logika perbandingan terintegrasi sehingga kita hanya perlu mengganti bagian skrip strategi dengan kita sendiri. tidak perlu mengkode logika perbandingan sendiri.
Strategi ini terutama bergantung pada metrik buy & hold return built-in dari platform perdagangan untuk perbandingan. Setiap bias dengan patokan tersebut akan mempengaruhi hasil akhir. Juga, mungkin ada kekurangan dalam perhitungan statistik strategi ini yang gagal mencerminkan perbandingan dengan akurat.
Jika platform perdagangan memperkenalkan perubahan signifikan pada metrik beli & tahan, logika perbandingan di sini juga perlu disesuaikan.
Strategi ini dapat dioptimalkan lebih lanjut dari aspek berikut:
Memperkenalkan lebih banyak patokan untuk perbandingan tiga arah atau multi-arah, misalnya perbandingan terhadap indeks atau rekan industri.
Sertakan metrik statistik seperti tingkat kemenangan tahunan, perbedaan durasi penarikan maksimum dll untuk menilai strategi dari lebih banyak dimensi.
Membuat lebih banyak komponen seperti patokan, metrik dll disesuaikan oleh pengguna bukan hanya kisaran tanggal.
Meningkatkan visualisasi grafik karena grafik garis sederhana di sini membuat sulit untuk melihat perbandingan rinci pada bar tertentu.
Dengan metrik perbandingan yang rinci dan grafik visual yang intuitif, strategi ini memungkinkan kita untuk memiliki pandangan yang sangat jelas tentang di mana dan bagaimana strategi kustom kami berbeda dari pendekatan buy & hold yang sederhana.
Lebih lanjut memperkaya patokan, metrik dan visualisasi dapat mengubah ini menjadi alat yang sangat kuat untuk analisis strategi.
/*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)