Ujian balik dan pengoptimuman strategi RSI

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

img

Ringkasan

Strategi ini adalah berdasarkan kepada penunjuk RSI (Relative Strength Index) untuk menentukan keadaan overbought dan oversold. Ia mengambil kedudukan kontra trend apabila RSI mencapai tahap overbought atau oversold untuk membeli rendah dan menjual tinggi. Strategi ini mudah dan berkesan, mendapat keuntungan dari senario overbought dan oversold jangka pendek di pasaran.

Logika Strategi

Strategi ini menggunakan penunjuk RSI semata-mata sebagai isyarat kemasukan. Ia pergi lama apabila RSI melintasi di bawah titik rendah (patuhan 20), dan pergi pendek apabila RSI melintasi di atas titik tinggi (patuhan 80). Ia berdagang jumlah tetap setiap kali (patuhan $ 100) dan bertujuan untuk keuntungan 1% tanpa mengira keadaan pasaran. Jika kerugian mencapai 3%, ia berhenti. Untuk mengawal kekerapan perdagangan, strategi berhenti berdagang selama 24 bar selepas perdagangan yang kalah.

Logiknya ialah:

  1. Menggunakan RSI untuk menentukan overbought/oversold
  2. Pergi panjang apabila RSI melintasi di bawah 20
  3. Pergi pendek apabila RSI melintasi di atas 80
  4. Perdagangan tetap $ 100 setiap kali
  5. Ambil keuntungan atau hentikan kerugian untuk menutup
  6. Jika kerugian, hentikan perdagangan selama 24 bar

Seperti yang dapat kita lihat, strategi ini sangat mudah dan mekanikal. Hampir tidak ada ruang untuk pengoptimuman parameter. Ia semata-mata mengeksploitasi sifat matematik RSI untuk mengambil kedudukan kontra trend di sekitar kawasan overbought / oversold.

Analisis Kelebihan

Kelebihan terbesar strategi ini adalah kesederhanaan dan kecekapan.

  1. Menggunakan satu penunjuk RSI, tiada analisis teknikal yang kompleks diperlukan.
  2. Sistem sepenuhnya mekanikal, bebas daripada gangguan emosi.
  3. Keuntungan daripada penyimpangan jangka pendek tanpa meramalkan arah pasaran.
  4. Risiko dikendalikan dengan stop loss/take profit.

Ia juga melaksanakan nisbah stop loss / mengambil keuntungan untuk mengunci keuntungan dan mengawal risiko, serta penangguhan perdagangan untuk mengurangkan kekerapan.

Analisis Risiko

Risiko utama strategi ini berasal dari:

  1. Tidak dapat memperoleh keuntungan dalam pasaran yang kuat. RSI boleh kekal di zon overbought / oversold untuk tempoh yang panjang apabila trend berterusan.

  2. Stop loss yang terlalu luas boleh membawa kepada kerugian yang berlebihan.

  3. Frekuensi perdagangan yang tinggi boleh menyebabkan perdagangan berlebihan selepas kemenangan.

  4. Fokus risiko $ 100 yang tetap, perlu dioptimumkan kepada peratus modal.

Arahan pengoptimuman

Berdasarkan analisis, strategi ini boleh ditingkatkan dengan cara berikut:

  1. Tambah penapis trend seperti MA untuk menghentikan perdagangan apabila trend tidak jelas.

  2. Mengoptimumkan nisbah stop loss / mengambil keuntungan. mengurangkan stop loss kepada 1-2% dan menggunakan mengambil keuntungan dinamik.

  3. Batasi kekerapan perdagangan, seperti maksimum 2 dagangan setiap tempoh masa.

  4. Saiz dagangan berdasarkan peratusan modal dan bukannya $ 100 tetap.

  5. Mengoptimumkan parameter RSI seperti tempoh, overbought/sold level.

  6. Tambah saiz kedudukan untuk tidak meningkatkan saiz apabila modal meningkat.

Dengan pengoptimuman ini, risiko dapat dikurangkan dan kestabilan dapat ditingkatkan dengan ketara.

Kesimpulan

Ringkasnya, ini adalah strategi yang mudah dan mudah menggunakan RSI untuk berdagang keadaan overbought / oversold untuk pembalikan purata jangka pendek. Kelebihan adalah kesederhanaan, kecekapan, tidak perlu ramalan, logik yang jelas, mudah diuji. Kelemahannya adalah ketidakupayaan untuk mendapat keuntungan dalam trend yang kuat dan potensi kerugian. Dengan penambahan seperti penapis trend, parameter yang dioptimumkan, saiz kedudukan dll, ia boleh ditingkatkan lagi untuk kestabilan dan keuntungan. Logiknya inovatif dan berharga untuk perdagangan praktikal jika digunakan dengan betul.


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