Perbandingan visual antara strategi dan Buy & Hold Return

Penulis:ChaoZhang, Tanggal: 2024-01-05 15:27:26
Tag:

img

Gambaran umum

Strategi ini membuat perbandingan rinci dan visual antara strategi tertentu dan buy & hold return dari sekuritas yang diperdagangkan.

Logika Strategi

Logika inti dari strategi ini adalah untuk memetakan empat elemen kunci untuk perbandingan antara strategi yang diberikan dan strategi beli & tahan:

  1. Strategi P/L: strategi laba bersih + strategi laba terbuka
  2. Buy & Hold P/L: pengembalian yang belum direalisasikan
  3. Perbedaan: Strategi P/L - Buy & Hold P/L
  4. Strategi vs Beli Tahan Statistik
    • Persentase strategi bar P/L di atas Buy & Hold
    • Persentase strategi bar P/L di bawah Buy & Hold
    • Perbedaan rata-rata sepanjang waktu

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.

Analisis Keuntungan

Dibandingkan dengan perbandingan sederhana dari buy & hold return, strategi ini memiliki keuntungan berikut:

  1. 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.

  2. Grafik visual intuitif yang memetakan strategi P / L, beli & tahan P / L dan perbedaan di antara mereka.

  3. Rentang tanggal perbandingan yang dapat disesuaikan di mana kita dapat fokus pada perbandingan strategi kita vs beli & tahan pada periode tertentu.

  4. Logika perbandingan terintegrasi sehingga kita hanya perlu mengganti bagian skrip strategi dengan kita sendiri. tidak perlu mengkode logika perbandingan sendiri.

Analisis Risiko

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.

Arahan Optimasi

Strategi ini dapat dioptimalkan lebih lanjut dari aspek berikut:

  1. Memperkenalkan lebih banyak patokan untuk perbandingan tiga arah atau multi-arah, misalnya perbandingan terhadap indeks atau rekan industri.

  2. Sertakan metrik statistik seperti tingkat kemenangan tahunan, perbedaan durasi penarikan maksimum dll untuk menilai strategi dari lebih banyak dimensi.

  3. Membuat lebih banyak komponen seperti patokan, metrik dll disesuaikan oleh pengguna bukan hanya kisaran tanggal.

  4. Meningkatkan visualisasi grafik karena grafik garis sederhana di sini membuat sulit untuk melihat perbandingan rinci pada bar tertentu.

Kesimpulan

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)



Lebih banyak