Backtesting dan Optimisasi Strategi RSI

Penulis:ChaoZhang, Tanggal: 2023-11-10 11:59:40
Tag:

img

Gambaran umum

Strategi ini didasarkan pada indikator RSI (Relative Strength Index) untuk menentukan kondisi overbought dan oversold. Strategi ini mengambil posisi kontra tren ketika RSI mencapai tingkat overbought atau oversold untuk membeli rendah dan menjual tinggi. Strategi ini sederhana dan efektif, mengambil keuntungan dari skenario overbought dan oversold jangka pendek di pasar.

Logika Strategi

Strategi ini menggunakan indikator RSI semata-mata sebagai sinyal masuk. Ini akan panjang ketika RSI melintasi di bawah titik rendah (default 20), dan pergi pendek ketika RSI melintasi di atas titik tinggi (default 80). Ini memperdagangkan jumlah tetap setiap kali (default $ 100) dan bertujuan untuk keuntungan 1% terlepas dari kondisi pasar. Jika kerugian mencapai 3%, itu berhenti. Untuk mengontrol frekuensi perdagangan, strategi berhenti berdagang selama 24 bar setelah perdagangan yang kalah.

Logika inti adalah:

  1. Gunakan RSI untuk menentukan overbought/oversold
  2. Pergi panjang ketika RSI melintasi di bawah 20
  3. Berjalan pendek saat RSI melintasi di atas 80
  4. Perdagangan tetap $ 100 setiap kali
  5. Ambil keuntungan atau stop loss untuk menutup
  6. Jika kerugian, jeda perdagangan selama 24 bar

Seperti yang dapat kita lihat, strategi ini sangat sederhana dan mekanis. Hampir tidak ada ruang untuk optimasi parameter. Ini murni mengeksploitasi sifat matematis RSI untuk mengambil posisi kontra tren di sekitar wilayah overbought / oversold.

Analisis Keuntungan

Keuntungan terbesar dari strategi ini adalah kesederhanaan dan efisiensi.

  1. Menggunakan satu indikator RSI, tidak perlu analisis teknis yang kompleks.
  2. Sistem yang sepenuhnya mekanis, bebas dari gangguan emosional.
  3. Keuntungan dari penyimpangan jangka pendek tanpa memprediksi arah pasar.
  4. Risiko dikelola dengan stop loss/take profit.

Ini juga menerapkan stop loss / take profit ratio untuk mengunci keuntungan dan mengendalikan risiko, serta penangguhan perdagangan untuk mengurangi frekuensi.

Analisis Risiko

Risiko utama dari strategi ini berasal dari:

  1. RSI dapat tetap berada di zona overbought/oversold untuk jangka waktu yang lama ketika tren terus berlanjut.

  2. Stop loss yang terlalu luas dapat menyebabkan kerugian yang berlebihan. Stop loss 3% saat ini mungkin perlu dikurangi menjadi 1-2%.

  3. Frekuensi perdagangan yang tinggi dapat menyebabkan over-trading setelah kemenangan.

  4. Konsentrasi risiko $ 100 harus dioptimalkan menjadi % modal.

Arahan Optimasi

Berdasarkan analisis, strategi dapat ditingkatkan dengan cara berikut:

  1. Tambahkan filter tren seperti MA untuk menghentikan perdagangan ketika tren tidak jelas.

  2. Mengoptimalkan rasio stop loss/take profit. Mengurangi stop loss menjadi 1-2% dan menggunakan take profit dinamis.

  3. Batasi frekuensi perdagangan, seperti maksimal 2 perdagangan per periode waktu.

  4. Ukuran perdagangan berdasarkan persentase modal daripada $ 100 tetap.

  5. Optimalkan parameter RSI seperti periode, tingkat overbought/sold.

  6. Tambahkan ukuran posisi untuk tidak meningkatkan ukuran ketika modal meningkat.

Dengan optimasi ini, risiko dapat dikurangi dan stabilitas dapat ditingkatkan secara signifikan.

Kesimpulan

Secara singkat, ini adalah strategi sederhana dan langsung menggunakan RSI untuk perdagangan kondisi overbought / oversold untuk reversi rata-rata jangka pendek. Pro adalah kesederhanaan, efisiensi, tidak perlu prediksi, logika yang jelas, mudah diuji. Kontra adalah ketidakmampuan untuk mendapatkan keuntungan dalam tren yang kuat dan potensi kerugian. Dengan tambahan seperti filter tren, parameter yang dioptimalkan, ukuran posisi dll, dapat ditingkatkan lebih lanjut untuk stabilitas dan profitabilitas. Logika ini inovatif dan berharga untuk perdagangan praktis jika diterapkan dengan benar.


/*backtest
start: 2023-11-02 00:00:00
end: 2023-11-09 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("rsi超买超卖_回测用", overlay=false, initial_capital=50000, currency=currency.USD, default_qty_type=strategy.cash)
open_pos = input.int(50000, title = "每次开单资金(usdt)")
rsi_period = input.int(14, title = "rsi周期")
rsi_line      = input.float(20.0,      title='RSI触发线',      step=0.05)
stop_rsi_top_line = input.float(70, title = "顶部rsi止损线")
stop_rsi_bottom_line = input.float(30, title = "底部rsi止损线")
stop_loss_perc = input.float(0.03, title = "止损线")
stop_profit = input.float(0.01, title = "止盈")
loss_stop_trade_k = input.int(24, title = "亏损后x根K线不做交易")


rsiParam = ta.rsi(close, rsi_period)

var int failedTimes = 0
var bool stopTrade = false

// plot(rsiParam)

if stopTrade
    failedTimes += 1
    if failedTimes == loss_stop_trade_k
        failedTimes := 0
        stopTrade := false



// 获取当前持仓方向
checkCurrentPosition() =>
    strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0

curPosition = checkCurrentPosition()

// 当前持仓成本价
position_avg_price = strategy.position_avg_price


// 当前持单, 触达反向的rsi线,清仓
if curPosition > 0 and rsiParam >= stop_rsi_top_line
    strategy.close_all(comment = "closebuy")

if curPosition < 0 and rsiParam <= stop_rsi_bottom_line
    strategy.close_all(comment = "closesell")


// 止盈止损清仓
if curPosition > 0
    // if (position_avg_price - close) / close >= stop_loss_perc
    //     // 止损
    //     strategy.close_all(comment = "closebuy")
    //     stopTrade := true
    if (close - position_avg_price) / position_avg_price >= stop_profit
        // 止盈
        strategy.close_all(comment = "closebuy")



if curPosition < 0
    // if (close - position_avg_price) / position_avg_price >= stop_loss_perc
    //     // 止损
    //     strategy.close_all(comment = "closesell")
    //     stopTrade := true

    if (position_avg_price - close) / close >= stop_profit
        // 止盈
        strategy.close_all(comment = "closesell")


a = strategy.closedtrades.exit_bar_index(strategy.closedtrades - 1)

if bar_index == a and strategy.closedtrades.profit(strategy.closedtrades - 1) < 0
    stopTrade := true

var float openPrice = 0.0



if rsiParam <= rsi_line and stopTrade == false
	strategy.entry("long", strategy.long, open_pos / close, comment = "long")
    if curPosition == 0
        openPrice := close
    strategy.exit("long_stop", "long", limit = openPrice * (1+stop_profit), stop=openPrice * (1-stop_loss_perc), comment = "closebuy")

if rsiParam >= 100 - rsi_line and stopTrade == false
    strategy.entry("short", strategy.short, open_pos / close, comment = "short")
    if curPosition == 0
        openPrice := close
    strategy.exit("short_stop", "short", limit = openPrice * (1-stop_profit), stop=openPrice * (1+stop_loss_perc), comment = "closesell")




plot(failedTimes)

Lebih banyak