Kiểm tra và tối ưu hóa chiến lược RSI

Tác giả:ChaoZhang, Ngày: 2023-11-10 11:59:40
Tags:

img

Tổng quan

Chiến lược này dựa trên chỉ số RSI (Relative Strength Index) để xác định các điều kiện mua quá mức và bán quá mức. Nó có các vị trí chống xu hướng khi RSI đạt đến mức mua quá mức hoặc bán quá mức để mua thấp và bán cao. Chiến lược này đơn giản và hiệu quả, hưởng lợi từ các kịch bản mua quá mức và bán quá mức trong thời gian ngắn trên thị trường.

Chiến lược logic

Chiến lược này chỉ sử dụng chỉ số RSI như là tín hiệu đầu vào. Nó đi dài khi RSI vượt qua dưới điểm thấp (thất định 20), và đi ngắn khi RSI vượt qua điểm cao (thất định 80). Nó giao dịch với số tiền cố định mỗi lần (thất định 100 USD) và nhắm mục tiêu lợi nhuận 1% bất kể điều kiện thị trường. Nếu lỗ đạt 3%, nó dừng lại. Để kiểm soát tần suất giao dịch, chiến lược ngừng giao dịch trong 24 thanh sau khi thua một giao dịch.

Lý luận cốt lõi là:

  1. Sử dụng chỉ số RSI để xác định quá mua / quá bán
  2. Đi dài khi RSI vượt dưới 20
  3. Đi ngắn khi RSI vượt trên 80
  4. Giao dịch cố định $ 100 mỗi lần
  5. Lấy lợi nhuận hoặc dừng lỗ để đóng
  6. Nếu mất, tạm dừng giao dịch trong 24 thanh

Như chúng ta có thể thấy, chiến lược rất đơn giản và cơ học. Có hầu như không có không gian cho tối ưu hóa tham số. Nó chỉ khai thác các tính chất toán học của RSI để có các vị trí chống xu hướng xung quanh các khu vực mua quá mức / bán quá mức.

Phân tích lợi thế

Ưu điểm lớn nhất của chiến lược này là sự đơn giản và hiệu quả.

  1. Sử dụng chỉ số RSI duy nhất, không cần phân tích kỹ thuật phức tạp.
  2. Hệ thống hoàn toàn cơ học, không có sự can thiệp cảm xúc.
  3. Lợi nhuận từ sai lệch ngắn hạn mà không dự đoán hướng thị trường.
  4. Rủi ro được quản lý bằng cách dừng lỗ / lấy lợi nhuận.

Nó cũng thực hiện tỷ lệ dừng lỗ / lấy lợi nhuận để khóa lợi nhuận và kiểm soát rủi ro, cũng như đình chỉ giao dịch để giảm tần suất.

Phân tích rủi ro

Những rủi ro chính của chiến lược này xuất phát từ:

  1. Không thể kiếm lợi nhuận trong thị trường có xu hướng mạnh. RSI có thể ở trong khu vực mua quá mức / bán quá mức trong thời gian dài khi xu hướng tiếp tục.

  2. Stop loss quá rộng có thể dẫn đến mất mát quá mức.

  3. Tần suất giao dịch cao có thể dẫn đến giao dịch quá mức sau khi thắng.

  4. Chỉ cần tập trung rủi ro 100 đô la, nên tối ưu hóa thành % vốn.

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

Dựa trên phân tích, chiến lược có thể được cải thiện theo những cách sau:

  1. Thêm bộ lọc xu hướng như MA để tạm dừng giao dịch khi xu hướng không rõ ràng.

  2. Tối ưu hóa tỷ lệ dừng lỗ / lấy lợi nhuận. Giảm dừng lỗ xuống 1-2% và sử dụng lợi nhuận năng động.

  3. Giới hạn tần suất giao dịch, chẳng hạn như tối đa 2 giao dịch mỗi khoảng thời gian.

  4. Kích thước giao dịch dựa trên % vốn thay vì cố định $ 100.

  5. Tối ưu hóa các thông số RSI như thời gian, mức mua quá mức / bán quá mức.

  6. Thêm kích thước vị trí để không tăng kích thước khi vốn tăng.

Với những tối ưu hóa này, các rủi ro có thể được giảm và sự ổn định được cải thiện đáng kể.

Kết luận

Tóm lại, đây là một chiến lược đơn giản và thẳng thắn sử dụng chỉ số RSI để giao dịch theo điều kiện mua quá mức / bán quá mức để đảo ngược trung bình ngắn hạn. Những ưu điểm là sự đơn giản, hiệu quả, không cần dự đoán, logic rõ ràng, dễ kiểm tra.


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

Thêm nữa