Tài nguyên đang được tải lên... tải...

Xu hướng sau chiến lược đánh giá giá trị dự kiến thích nghi dựa trên đường trung bình động chéo

Tác giả:ChaoZhang, Ngày: 2024-06-17 16:29:02
Tags:SMAEMA

img

Tổng quan

Chiến lược này sử dụng sự chéo chéo của hai trung bình động đơn giản với các giai đoạn khác nhau để xác định hướng xu hướng và tham gia giao dịch khi xu hướng xuất hiện. Đồng thời, chiến lược cũng giới thiệu bảng giá trị dự kiến để tính toán và hiển thị lợi nhuận dự kiến của chiến lược ở các quy mô thời gian khác nhau, cho phép người dùng đánh giá tốt hơn hiệu suất của chiến lược. Bảng giá trị dự kiến tính đến các chỉ số chính như tỷ lệ thắng của chiến lược, lợi nhuận trung bình và lỗ trung bình trong các giai đoạn lịch sử, và trình bày hiệu suất của chiến lược trong các điều kiện thị trường khác nhau một cách trực quan.

Nguyên tắc chiến lược

Cốt lõi của chiến lược này là sử dụng sự chéo chéo của hai mức trung bình di chuyển đơn giản với các khoảng thời gian khác nhau (14-ngày và 28-ngày trong ví dụ này) để xác định xu hướng thị trường. Khi mức trung bình ngắn hạn vượt qua mức trung bình dài hạn từ dưới, nó được coi là thị trường đã bước vào xu hướng tăng, và chiến lược mở một vị trí dài. Ngược lại, khi mức trung bình ngắn hạn vượt qua mức trung bình dài hạn từ trên, nó được coi là thị trường đã bước vào xu hướng giảm, và chiến lược mở một vị trí ngắn. Bằng cách này, chiến lược có thể thích nghi với các xu hướng thị trường khác nhau và thiết lập các vị trí kịp thời khi xu hướng dường như nắm bắt lợi nhuận do xu hướng mang lại.

Ngoài việc xác định xu hướng cơ bản và logic giao dịch, chiến lược cũng giới thiệu một bảng giá trị dự kiến để tính toán và hiển thị lợi nhuận dự kiến của chiến lược ở các quy mô thời gian khác nhau (tháng và hàng năm).

  1. Tỷ lệ thắng: tỷ lệ giao dịch có lợi nhuận so với tổng giao dịch trong thời gian
  2. Lợi nhuận trung bình: số tiền lợi nhuận trung bình của tất cả các giao dịch có lợi trong thời gian
  3. Số lượng giao dịch bị mất trong một thời gian

Sử dụng các chỉ số này, giá trị dự kiến của chiến lược trong khoảng thời gian đó có thể được tính toán: Giá trị dự kiến = Tỷ lệ thắng × Lợi nhuận trung bình - (1 - Tỷ lệ thắng) × Lợi nhuận trung bình

Bằng cách hiển thị các giá trị dự kiến của các khoảng thời gian khác nhau dưới dạng bản đồ nhiệt trên biểu đồ, người dùng có thể nhìn một cái nhìn về hiệu suất dự kiến của chiến lược trong các điều kiện thị trường khác nhau, do đó nắm bắt tốt hơn khả năng áp dụng và rủi ro của chiến lược.

Phân tích lợi thế

  1. Khả năng thích nghi mạnh mẽ với xu hướng: Bằng cách sử dụng chéo trung bình động để xác định xu hướng, chiến lược có thể điều chỉnh các vị trí kịp thời theo xu hướng thị trường khác nhau để thích nghi với những thay đổi của thị trường. Điều này cho phép chiến lược đạt được lợi nhuận tốt trên các thị trường xu hướng.

  2. Đánh giá hiệu suất trực quan: Bảng giá trị dự kiến tích hợp hiển thị lợi nhuận dự kiến của chiến lược trong các khoảng thời gian khác nhau dưới dạng bản đồ nhiệt, cho phép người dùng đánh giá hiệu suất của chiến lược trong các điều kiện thị trường khác nhau trong nháy mắt.

  3. Xem xét các chỉ số thống kê chính: Việc tính toán giá trị dự kiến không chỉ xem xét tỷ lệ thắng của chiến lược mà còn tích hợp tác động của lợi nhuận trung bình và lỗ trung bình.

  4. Cài đặt tham số linh hoạt: Người dùng có thể linh hoạt thiết lập xem có hiển thị bảng giá trị dự kiến và độ minh bạch của nó theo nhu cầu của họ. Điều này cho phép người dùng điều chỉnh hiệu ứng hiển thị biểu đồ theo sở thích của họ, cải thiện trải nghiệm của người dùng.

Phân tích rủi ro

  1. Hiệu suất kém trên các thị trường giới hạn trong phạm vi: Vì chiến lược chủ yếu dựa vào xu hướng để tạo ra lợi nhuận, giao dịch thường xuyên trong điều kiện thị trường giới hạn trong phạm vi hoặc xu hướng không rõ ràng có thể dẫn đến sự trượt và chi phí giao dịch đáng kể, ảnh hưởng đến hiệu suất tổng thể của chiến lược.

  2. Các hạn chế của việc tính toán giá trị dự kiến: Mặc dù bảng giá trị dự kiến cung cấp một cách trực quan để đánh giá hiệu suất chiến lược, nó vẫn dựa trên dữ liệu lịch sử để tính toán. Khi có những thay đổi đáng kể xảy ra trên thị trường hoặc các tình huống cực đoan phát sinh, dữ liệu lịch sử có thể không phản ánh tốt hiệu suất thực tế của chiến lược và giá trị tham chiếu của giá trị dự kiến có thể được giảm.

  3. Tác động lớn của việc lựa chọn tham số: Hiệu suất của chiến lược phần lớn phụ thuộc vào việc lựa chọn các khoảng thời gian trung bình động. Sự kết hợp các khoảng thời gian khác nhau có thể mang lại kết quả giao dịch hoàn toàn khác nhau. Nếu các tham số được chọn không thể thích nghi tốt với các đặc điểm của thị trường, hiệu suất thực tế của chiến lược có thể lệch đáng kể so với giá trị dự kiến.

Hướng tối ưu hóa

  1. Đưa ra nhiều chỉ số kỹ thuật hơn: Trên cơ sở các đường trung bình động hiện có, các chỉ số kỹ thuật khác như MACD và RSI có thể được xem xét để xác định tốt hơn sức mạnh và tính bền vững của xu hướng, do đó cải thiện thời gian nhập và thoát chiến lược.

  2. Tối ưu hóa quản lý vị trí: Hiện nay, chiến lược áp dụng cách tiếp cận vị trí cố định khi các tín hiệu giao dịch xuất hiện. Nó có thể được xem xét để điều chỉnh các vị trí năng động dựa trên các yếu tố như biến động thị trường và sức mạnh xu hướng để kiểm soát tốt hơn rủi ro và tăng lợi nhuận.

  3. Thêm cơ chế dừng lợi nhuận và dừng lỗ: Thêm cơ chế dừng lợi nhuận và dừng lỗ hợp lý vào chiến lược có thể giúp chiến lược khóa lợi nhuận hiện có một cách kịp thời trong khi hạn chế tổn thất tiềm năng. Điều này giúp cải thiện tỷ lệ rủi ro-lợi nhuận của chiến lược và duy trì hiệu suất tương đối ổn định trong các môi trường thị trường khác nhau.

  4. Tối ưu hóa tính toán giá trị dự kiến: Phương pháp tính toán giá trị dự kiến có thể được tối ưu hóa hơn nữa, chẳng hạn như xem xét chi phí giao dịch và giới thiệu cửa sổ chuyển động để cải thiện hiệu quả và tính thực tế của chỉ số giá trị dự kiến.

Tóm lại

Chiến lược này xác định xu hướng thị trường bằng cách sử dụng đường chéo trung bình động và thiết lập các vị trí kịp thời khi xu hướng dường như nắm bắt được lợi nhuận do xu hướng mang lại. Đồng thời, chiến lược cũng giới thiệu một bảng giá trị dự kiến trực quan để hiển thị lợi nhuận dự kiến của chiến lược ở các quy mô thời gian khác nhau, cung cấp cho người dùng nhiều tài liệu tham khảo ra quyết định hơn. Mặc dù chiến lược có thể hoạt động kém trong các thị trường giới hạn phạm vi và tính toán giá trị dự kiến có một số hạn chế nhất định, bằng cách giới thiệu nhiều chỉ số kỹ thuật hơn, tối ưu hóa quản lý vị trí, thêm cơ chế dừng lợi nhuận và dừng lỗ và các biện pháp khác, tỷ lệ rủi ro-lợi nhuận của chiến lược có thể được cải thiện hơn nữa, cho phép nó thích nghi tốt hơn với môi trường thị trường thay đổi.


/*backtest
start: 2023-06-11 00:00:00
end: 2024-06-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ir0nantc2

//@version=5
strategy("Expected Value Panel", overlay=true)

// ロングエントリー条件 / Long entry condition
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

// ショートエントリー条件 / Short entry condition
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)



// ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
// Please copy the code below and paste it into the strategy where you want to display the expected value.
// 以下のコードをコピーして期待値を表示させたいストラテジーに貼り付けて下さい。
// ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

// 表示選択 / Display selection
show_performance = input.bool(true, '期待値ON/OFF (Show Expected Value)', group='Expected Value / ©ir0nantc2')
transparency = input.int(50, '透過度 (Transparency)', minval=0, maxval=100, group='Expected Value / ©ir0nantc2')
prec = 2

// 背景色 / Background color
bg_color(value) =>
    na(value) ? color.new(color.gray, transparency) : value > 0.0 ? color.new(color.green, transparency) :
   value < 0.0 ? color.new(color.red, transparency) :color.new(color.gray, transparency)

// 利益と損失の追跡 / Track profits and losses
var float total_monthly_profit = 0.0
var float total_yearly_profit = 0.0

if show_performance
    new_month = month(time) != month(time[1])
    new_year  = year(time)  != year(time[1])
    cur_month_pnl = 0.0, cur_year_pnl  = 0.0
    eq = strategy.equity
    bar_pnl = eq / eq[1] - 1

    // 月次・年次 期待値 / Monthly & Yearly Expected Value
    cur_month_pnl := new_month ? 0.0 : (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 
    cur_year_pnl := new_year ? 0.0 : (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1  
    
    // 年次および月次期待値を格納 / Store monthly and yearly expected values
    var month_pnl  = array.new_float(), var month_time = array.new_int()
    var year_pnl  = array.new_float(), var year_time = array.new_int()
    
    // 期待値計算の変数 / Variables for expected value calculation
    var month_wins = array.new_int(), var month_losses = array.new_int()
    var month_avg_win = array.new_float(), var month_avg_loss = array.new_float()
    var year_wins = array.new_int(), var year_losses = array.new_int()
    var year_avg_win = array.new_float(), var year_avg_loss = array.new_float()

    // 月次および年次期待値の配列更新 / Update arrays for monthly and yearly expected values
    bool last_computed = false
    if (not na(cur_month_pnl[1]) and (new_month or barstate.islastconfirmedhistory))
        if (last_computed and array.size(month_pnl) > 0)
            array.pop(month_pnl), array.pop(month_time)
            array.pop(month_wins), array.pop(month_losses)
            array.pop(month_avg_win), array.pop(month_avg_loss)

        array.push(month_pnl, cur_month_pnl[1]), array.push(month_time, time[1])
        array.push(month_wins, 0), array.push(month_losses, 0)
        array.push(month_avg_win, 0.0), array.push(month_avg_loss, 0.0)
    
    if (not na(cur_year_pnl[1]) and (new_year or barstate.islastconfirmedhistory))
        if (last_computed and array.size(year_pnl) > 0)
            array.pop(year_pnl), array.pop(year_time)
            array.pop(year_wins), array.pop(year_losses)
            array.pop(year_avg_win), array.pop(year_avg_loss)

        array.push(year_pnl, cur_year_pnl[1]), array.push(year_time, time[1])
        array.push(year_wins, 0), array.push(year_losses, 0)
        array.push(year_avg_win, 0.0), array.push(year_avg_loss, 0.0)

    last_computed := barstate.islastconfirmedhistory ? true : last_computed

    // 勝ち取引と負け取引を追跡 / Track winning and losing trades
    if (strategy.closedtrades > 0 and na(strategy.closedtrades[1]) == false)
        closed_profit = strategy.netprofit - strategy.netprofit[1]
        if closed_profit > 0
            if array.size(month_wins) > 0
                wins = array.get(month_wins, array.size(month_wins) - 1) + 1
                avg_win = (array.get(month_avg_win, array.size(month_avg_win) - 1) * (wins - 1) + closed_profit) / wins
                array.set(month_wins, array.size(month_wins) - 1, wins)
                array.set(month_avg_win, array.size(month_avg_win) - 1, avg_win)
            if array.size(year_wins) > 0
                wins = array.get(year_wins, array.size(year_wins) - 1) + 1
                avg_win = (array.get(year_avg_win, array.size(year_avg_win) - 1) * (wins - 1) + closed_profit) / wins
                array.set(year_wins, array.size(year_wins) - 1, wins)
                array.set(year_avg_win, array.size(year_avg_win) - 1, avg_win)
        else
            if array.size(month_losses) > 0
                losses = array.get(month_losses, array.size(month_losses) - 1) + 1
                avg_loss = (array.get(month_avg_loss, array.size(month_avg_loss) - 1) * (losses - 1) + closed_profit) / losses
                array.set(month_losses, array.size(month_losses) - 1, losses)
                array.set(month_avg_loss, array.size(month_avg_loss) - 1, avg_loss)
            if array.size(year_losses) > 0
                losses = array.get(year_losses, array.size(year_losses) - 1) + 1
                avg_loss = (array.get(year_avg_loss, array.size(year_avg_loss) - 1) * (losses - 1) + closed_profit) / losses
                array.set(year_losses, array.size(year_losses) - 1, losses)
                array.set(year_avg_loss, array.size(year_avg_loss) - 1, avg_loss)

    // 月次テーブル / Monthly table
    var monthly_table = table(na)
    if (barstate.islastconfirmedhistory)
        monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_time) + 1, border_width = 1)
        table.cell(monthly_table, 0,  0, "",     bgcolor = #bbbbbb00)
        table.cell(monthly_table, 1,  0, "Jan",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 2,  0, "Feb",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 3,  0, "Mar",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 4,  0, "Apr",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 5,  0, "May",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 6,  0, "Jun",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 7,  0, "Jul",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 8,  0, "Aug",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 9,  0, "Sep",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 10, 0, "Oct",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 11, 0, "Nov",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 12, 0, "Dec",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 13, 0, "Year", bgcolor = #bbbbbb)
    
        // 年次データの集計 / Collecting yearly data
        var year_total_pnl = array.new_float()
        var year_exp_val = array.new_float()
        
        for yt = 0 to array.size(year_time) - 1
            total_year_wins = 0, total_year_losses = 0
            total_year_avg_win = 0.0, total_year_avg_loss = 0.0
            total_year_pnl = 0.0

            for mt = 1 to 12
                idx = -1
                for j = 0 to array.size(month_time) - 1
                    if year(array.get(month_time, j)) == year(array.get(year_time, yt)) and month(array.get(month_time, j)) == mt
                        idx := j
                        break
                if idx != -1
                    total_year_pnl := total_year_pnl + array.get(month_pnl, idx)
                    total_year_wins := total_year_wins + array.get(month_wins, idx)
                    total_year_losses := total_year_losses + array.get(month_losses, idx)
                    total_year_avg_win := total_year_avg_win + (array.get(month_avg_win, idx) * array.get(month_wins, idx))
                    total_year_avg_loss := total_year_avg_loss + (array.get(month_avg_loss, idx) * array.get(month_losses, idx))
            
            total_year_avg_win := total_year_wins > 0 ? total_year_avg_win / total_year_wins : 0.0
            total_year_avg_loss := total_year_losses > 0 ? total_year_avg_loss / total_year_losses : 0.0
            win_rate = total_year_wins + total_year_losses > 0 ? total_year_wins / (total_year_wins + total_year_losses) : na
            exp_val = win_rate ? (win_rate * total_year_avg_win) - ((1 - win_rate) * math.abs(total_year_avg_loss)) : na
            array.push(year_total_pnl, total_year_pnl)
            array.push(year_exp_val, exp_val)
            
        for yt = 0 to array.size(year_time) - 1
            table.cell(monthly_table, 0,  yt + 1, str.tostring(year(array.get(year_time, yt))), bgcolor = #bbbbbb)
            
            y_color = bg_color(array.get(year_exp_val, yt))
            value_to_display = na(array.get(year_exp_val, yt)) ? "" : str.tostring(math.round(array.get(year_exp_val, yt) * 100, prec))
            table.cell(monthly_table, 13, yt + 1, value_to_display, bgcolor = y_color, text_color=color.new(color.white, 0))
            
        for mt = 0 to array.size(month_time) - 1
            m_row = year(array.get(month_time, mt)) - year(array.get(year_time, 0)) + 1
            m_col = month(array.get(month_time, mt))
            
            if array.size(month_wins) > mt and array.size(month_losses) > mt and array.size(month_avg_win) > mt and array.size(month_avg_loss) > mt
                win_rate = array.get(month_wins, mt) / (array.get(month_wins, mt) + array.get(month_losses, mt))
                exp_val = (win_rate * array.get(month_avg_win, mt)) - ((1 - win_rate) * math.abs(array.get(month_avg_loss, mt)))
                m_color = bg_color(exp_val)
                value_to_display = na(exp_val) ? "" : str.tostring(math.round(exp_val * 100, prec))
                table.cell(monthly_table, m_col, m_row, value_to_display, bgcolor = m_color, text_color=color.new(color.white, 0))
            else
                table.cell(monthly_table, m_col, m_row, "", bgcolor = color.new(color.gray, transparency), text_color=color.new(color.white, 0))
// [EOF]


Có liên quan

Thêm nữa