So sánh trực quan giữa chiến lược và Buy & Hold Return

Tác giả:ChaoZhang, Ngày: 2024-01-05 15:27:26
Tags:

img

Tổng quan

Chiến lược này thực hiện so sánh chi tiết và trực quan giữa một chiến lược nhất định và lợi nhuận mua & giữ của chứng khoán giao dịch.

Chiến lược logic

Logic cốt lõi của chiến lược này là vẽ bốn yếu tố chính để so sánh giữa chiến lược nhất định và chiến lược mua & giữ:

  1. Chiến lược P/L: chiến lược lợi nhuận ròng + chiến lược lợi nhuận mở
  2. Buy & Hold P/L: lợi nhuận chưa thực hiện
  3. Sự khác biệt: Chiến lược P/L - Buy & Hold P/L
  4. Chiến lược vs mua giữ số liệu thống kê
    • Tỷ lệ phần trăm của chiến lược thanh P / L là trên mua & giữ
    • Tỷ lệ phần trăm chiến lược thanh P / L dưới Buy & Hold
    • Sự khác biệt trung bình mọi thời gian

Bằng cách so sánh bốn yếu tố trên, chúng ta có thể có một sự hiểu biết trực quan về việc liệu chiến lược của chúng tôi có hiệu suất tốt hơn hoặc kém hơn một chiến lược mua và giữ đơn giản.

Phân tích lợi thế

So với so sánh đơn giản về lợi nhuận mua & giữ, chiến lược này có những lợi thế sau:

  1. Các chỉ số so sánh toàn diện và chi tiết hơn, bao gồm so sánh theo thanh và so sánh thống kê tổng thể, để chúng ta biết rõ khi nào và nơi nào chiến lược của chúng tôi đánh bại hoặc thua để mua & giữ.

  2. Biểu đồ trực quan trực quan mà biểu đồ chiến lược P / L, mua & giữ P / L và sự khác biệt giữa chúng. Nó cho phép chúng tôi trực quan nói về hiệu suất của chiến lược của chúng tôi nhanh hơn.

  3. Phạm vi ngày so sánh tùy chỉnh nơi chúng tôi có thể tập trung vào so sánh chiến lược của chúng tôi với mua & giữ trên các khoảng thời gian cụ thể.

  4. Đơn giản và dễ sử dụng. Logic so sánh được xây dựng để chúng ta chỉ cần thay thế phần kịch bản chiến lược bằng của riêng mình. Không cần phải tự lập trình logic so sánh.

Phân tích rủi ro

Chiến lược này chủ yếu dựa trên các chỉ số mua và giữ lợi nhuận tích hợp của nền tảng giao dịch để so sánh. Bất kỳ sự thiên vị nào với chỉ số chuẩn đó sẽ ảnh hưởng đến kết quả cuối cùng. Ngoài ra, có thể có các lỗ hổng trong các tính toán thống kê của chiến lược này không phản ánh chính xác so sánh.

Nếu nền tảng giao dịch đưa ra những thay đổi đáng kể đối với số liệu mua & giữ, logic so sánh ở đây cũng cần phải được điều chỉnh.

Hướng dẫn tối ưu hóa

Chiến lược này có thể được tối ưu hóa thêm từ các khía cạnh sau:

  1. Đưa ra nhiều điểm chuẩn hơn cho so sánh 3 hoặc nhiều hướng, ví dụ so sánh với chỉ số hoặc các đối tác trong ngành.

  2. Bao gồm nhiều số liệu thống kê hơn như tỷ lệ thắng hàng năm, sự khác biệt thời gian rút tiền tối đa vv để đánh giá chiến lược từ nhiều khía cạnh.

  3. Làm cho nhiều thành phần như điểm chuẩn, số liệu, v.v. có thể tùy chỉnh bởi người dùng thay vì chỉ là phạm vi ngày.

  4. Cải thiện hình ảnh biểu đồ vì biểu đồ đường đơn giản ở đây làm cho khó phát hiện so sánh chi tiết trên các thanh cụ thể.

Kết luận

Với các chỉ số so sánh chi tiết và biểu đồ trực quan trực quan, chiến lược này cho phép chúng tôi có một cái nhìn rất rõ ràng về nơi và cách chiến lược tùy chỉnh của chúng tôi khác với một cách tiếp cận mua và giữ đơn giản.

Tăng cường thêm các chỉ số, số liệu và hình ảnh có thể biến nó thành một bộ công cụ cực kỳ mạnh mẽ cho phân tích chiến lược. Nó cung cấp một mẫu và khung để làm cho phân tích chiến lược và cải tiến hiệu quả hơn nhiều.


/*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)



Thêm nữa