Sumber daya yang dimuat... Pemuatan...

Tren Mengikuti Strategi Penilaian Nilai Harapan Adaptif Berdasarkan Rata-rata Bergerak Crossover

Penulis:ChaoZhang, Tanggal: 2024-06-17 16:29:02
Tag:SMAEMA

img

Gambaran umum

Strategi ini menggunakan persilangan dua rata-rata bergerak sederhana dengan periode yang berbeda untuk menentukan arah tren dan memasuki perdagangan ketika tren muncul. Pada saat yang sama, strategi juga memperkenalkan panel nilai yang diharapkan untuk menghitung dan menampilkan pengembalian yang diharapkan dari strategi pada skala waktu yang berbeda, memungkinkan pengguna untuk menilai kinerja strategi dengan lebih baik. Panel nilai yang diharapkan memperhitungkan indikator kunci seperti tingkat kemenangan strategi, keuntungan rata-rata, dan kerugian rata-rata selama periode historis, dan menyajikan kinerja strategi di bawah kondisi pasar yang berbeda dengan cara yang intuitif.

Prinsip Strategi

Inti dari strategi ini adalah menggunakan persilangan dua rata-rata bergerak sederhana dengan periode yang berbeda (14-hari dan 28-hari dalam contoh ini) untuk menentukan tren pasar. Ketika rata-rata jangka pendek melintasi di atas rata-rata jangka panjang dari bawah, dianggap bahwa pasar telah memasuki tren kenaikan, dan strategi membuka posisi panjang. Sebaliknya, ketika rata-rata jangka pendek melintasi di bawah rata-rata jangka panjang dari atas, dianggap bahwa pasar telah memasuki tren penurunan, dan strategi membuka posisi pendek. Dengan cara ini, strategi dapat beradaptasi dengan tren pasar yang berbeda dan menetapkan posisi secara tepat waktu ketika tren tampaknya menangkap keuntungan yang dibawa oleh tren.

Selain penentuan tren dasar dan logika perdagangan, strategi juga memperkenalkan panel nilai yang diharapkan untuk menghitung dan menampilkan pengembalian yang diharapkan dari strategi pada skala waktu yang berbeda (bulan dan tahunan).

  1. Tingkat kemenangan: proporsi perdagangan yang menguntungkan terhadap total perdagangan dalam periode waktu
  2. Keuntungan rata-rata: jumlah keuntungan rata-rata dari semua perdagangan yang menguntungkan dalam periode waktu
  3. Rata-rata kerugian: jumlah kerugian rata-rata dari semua perdagangan yang rugi dalam periode waktu

Dengan menggunakan indikator-indikator ini, nilai yang diharapkan dari strategi dalam periode waktu tersebut dapat dihitung: Nilai yang diharapkan = Tingkat Kemenangan × Rata-rata Keuntungan - (1 - Tingkat Kemenangan) × Rata-rata Kerugian

Dengan menampilkan nilai yang diharapkan dari periode waktu yang berbeda dalam bentuk peta panas pada grafik, pengguna dapat melihat sekilas kinerja yang diharapkan dari strategi dalam kondisi pasar yang berbeda, sehingga lebih memahami penerapan dan risiko dari strategi.

Analisis Keuntungan

  1. Kemampuan beradaptasi yang kuat terhadap tren: Dengan menggunakan crossover rata-rata bergerak untuk menentukan tren, strategi dapat menyesuaikan posisi secara tepat waktu di bawah tren pasar yang berbeda untuk beradaptasi dengan perubahan pasar.

  2. Evaluasi kinerja intuitif: Panel nilai yang diharapkan yang terintegrasi menampilkan pengembalian yang diharapkan dari strategi pada periode waktu yang berbeda dalam bentuk peta panas, memungkinkan pengguna untuk menilai kinerja strategi di bawah kondisi pasar yang berbeda sekilas. Presentasi kinerja yang divisualisasikan ini memberikan pengguna lebih banyak referensi pengambilan keputusan.

  3. Pertimbangan indikator statistik utama: Perhitungan nilai yang diharapkan tidak hanya mempertimbangkan tingkat kemenangan strategi tetapi juga mengintegrasikan dampak rata-rata keuntungan dan kerugian rata-rata.

  4. Pengaturan parameter yang fleksibel: Pengguna dapat mengatur secara fleksibel apakah akan menampilkan panel nilai yang diharapkan dan transparansi sesuai dengan kebutuhan mereka. Hal ini memungkinkan pengguna untuk menyesuaikan efek tampilan grafik sesuai dengan preferensi mereka, meningkatkan pengalaman pengguna.

Analisis Risiko

  1. Kinerja yang buruk di pasar yang terikat rentang: Karena strategi terutama bergantung pada tren untuk menghasilkan keuntungan, perdagangan yang sering terjadi dalam kondisi pasar yang terikat rentang atau tren yang tidak jelas dapat menyebabkan slippage dan biaya transaksi yang signifikan, yang mempengaruhi kinerja keseluruhan strategi.

  2. Keterbatasan perhitungan nilai yang diharapkan: Meskipun panel nilai yang diharapkan memberikan cara yang intuitif untuk mengevaluasi kinerja strategi, itu masih didasarkan pada data historis untuk perhitungan.

  3. Dampak besar dari pemilihan parameter: Kinerja strategi sangat tergantung pada pemilihan periode rata-rata bergerak. Kombinasi periode yang berbeda dapat menghasilkan hasil perdagangan yang sama sekali berbeda. Jika parameter yang dipilih tidak dapat beradaptasi dengan baik dengan karakteristik pasar, kinerja sebenarnya dari strategi dapat menyimpang secara signifikan dari nilai yang diharapkan.

Arah Optimalisasi

  1. Memperkenalkan lebih banyak indikator teknis: Berdasarkan rata-rata bergerak yang ada, indikator teknis lainnya seperti MACD dan RSI dapat dipertimbangkan untuk menentukan kekuatan dan keberlanjutan tren dengan lebih baik, sehingga meningkatkan waktu masuk dan keluar strategi.

  2. Mengoptimalkan manajemen posisi: Saat ini, strategi mengadopsi pendekatan posisi tetap ketika sinyal perdagangan muncul.

  3. Menambahkan mekanisme stop-profit dan stop-loss: Menambahkan mekanisme stop-profit dan stop-loss yang masuk akal ke strategi dapat membantu strategi mengunci keuntungan yang ada secara tepat waktu sambil membatasi kerugian potensial. Ini membantu meningkatkan rasio risiko-manfaat dari strategi dan mempertahankan kinerja yang relatif stabil di berbagai lingkungan pasar.

  4. Mengoptimalkan perhitungan nilai yang diharapkan: Metode perhitungan nilai yang diharapkan dapat dioptimalkan lebih lanjut, seperti mempertimbangkan biaya transaksi dan memperkenalkan jendela bergerak untuk meningkatkan efektivitas dan kepraktisan indikator nilai yang diharapkan.

Ringkasan

Strategi ini menentukan tren pasar dengan menggunakan crossover rata-rata bergerak dan menetapkan posisi secara tepat waktu ketika tren tampaknya menangkap keuntungan yang dibawa oleh tren. Pada saat yang sama, strategi ini juga memperkenalkan panel nilai yang diharapkan yang intuitif untuk menampilkan pengembalian yang diharapkan dari strategi pada skala waktu yang berbeda, memberikan pengguna lebih banyak referensi pengambilan keputusan. Meskipun strategi dapat berkinerja buruk di pasar yang terikat kisaran dan perhitungan nilai yang diharapkan memiliki keterbatasan tertentu, dengan memperkenalkan lebih banyak indikator teknis, mengoptimalkan manajemen posisi, menambahkan mekanisme stop-profit dan stop-loss, dan langkah-langkah lainnya, rasio risiko-pahala strategi dapat ditingkatkan lebih lanjut, memungkinkan untuk lebih beradaptasi dengan lingkungan pasar yang berubah.


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


Berkaitan

Lebih banyak