Perbandingan Visual Antara Strategi dan Buy & Hold Return

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

img

Ringkasan

Strategi ini membuat perbandingan terperinci dan visual antara strategi tertentu dan pulangan beli & pegang sekuriti yang didagangkan.

Logika Strategi

Logik teras strategi ini adalah untuk merangka empat elemen utama untuk perbandingan antara strategi yang diberikan dan strategi beli & pegang:

  1. Strategi P/L: strategi keuntungan bersih + strategi keuntungan terbuka
  2. Beli & Simpan P/L: pulangan yang tidak direalisasikan
  3. Perbezaan: Strategi P/L - Beli & Simpan P/L
  4. Strategi vs Beli Simpan Stats
    • Peratusan strategi bar P / L di atas Beli & Simpan
    • Peratusan strategi bar P / L di bawah Beli & Simpan
    • Perbezaan purata sepanjang masa

Dengan membandingkan empat elemen di atas, kita boleh mempunyai pemahaman intuitif mengenai sama ada strategi kita lebih baik atau kurang baik daripada strategi beli & tahan yang mudah.

Analisis Kelebihan

Berbanding dengan perbandingan mudah pulangan beli & tahan, strategi ini mempunyai kelebihan berikut:

  1. Metrik perbandingan yang lebih komprehensif dan terperinci, termasuk perbandingan per bar dan perbandingan statistik keseluruhan, supaya kita tahu dengan jelas kapan dan di mana strategi kita mengalahkan atau kehilangan untuk membeli & memegang.

  2. Carta visual intuitif yang memetakan strategi P / L, beli & pegang P / L dan perbezaan di antara mereka.

  3. Julat tarikh perbandingan yang boleh disesuaikan di mana kita boleh menumpukan pada perbandingan strategi kita vs beli & pegang pada tempoh tertentu.

  4. Sederhana dan mudah digunakan. Logik perbandingan dibina supaya kita hanya perlu menggantikan bahagian skrip strategi dengan kita sendiri. Tidak perlu mengkodkan logik perbandingan sendiri.

Analisis Risiko

Strategi ini bergantung terutamanya pada metrik pulangan beli & tahan yang terbina dalam platform dagangan untuk perbandingan. sebarang bias dengan penanda aras itu akan mempengaruhi hasil akhir. Juga, mungkin terdapat kelemahan dalam pengiraan statistik strategi ini yang gagal mencerminkan perbandingan dengan tepat.

Lebih banyak penanda aras dan kaedah statistik boleh diperkenalkan untuk pengesahan lanjut.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan lagi dari aspek berikut:

  1. Memperkenalkan lebih banyak penanda aras untuk perbandingan tiga arah atau pelbagai arah, contohnya membandingkan dengan indeks atau rakan sekerja industri.

  2. Sertakan lebih banyak metrik statistik seperti kadar kemenangan tahunan, perbezaan tempoh pengambilan maksimum dan lain-lain untuk menilai strategi dari lebih banyak dimensi.

  3. Buat lebih banyak komponen seperti penanda aras, metrik dan lain-lain yang boleh disesuaikan oleh pengguna dan bukannya hanya julat tarikh.

  4. Meningkatkan visualisasi carta kerana carta garis mudah di sini menjadikannya sukar untuk melihat perbandingan terperinci pada bar tertentu.

Kesimpulan

Dengan metrik perbandingan terperinci dan carta visual yang intuitif, strategi ini membolehkan kita mempunyai pandangan yang sangat jelas di mana dan bagaimana strategi tersuai kami berbeza dari pendekatan beli & tahan yang mudah. Julat tarikh yang boleh disesuaikan juga memberikan fleksibiliti dalam menganalisis kebaikan & keburukan strategi kami dalam tempoh yang berbeza.

Lebih lanjut memperkayakan penanda aras, metrik dan visualisasi boleh 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 lanjut