Chiến lược giao dịch định lượng dựa trên chỉ số RSI và đường trung bình động

Tác giả:ChaoZhang, Ngày: 2023-12-25 11:40:36
Tags:

img

Tổng quan

Chiến lược này được đặt tên là Quantitative Trading Strategy Based on RSI Indicator and Moving Average. Nó sử dụng chỉ số RSI và trung bình động như các tín hiệu giao dịch để thực hiện một chiến lược giao dịch định lượng làm cho các hoạt động đảo ngược trong bối cảnh xu hướng. Ý tưởng cốt lõi của nó là mở các vị trí khi các tín hiệu đảo ngược giá xảy ra và kiếm lợi nhuận khi mua quá hoặc bán quá.

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

Chiến lược này chủ yếu sử dụng chỉ số RSI và trung bình di chuyển nhanh / chậm để xác định xu hướng giá và thời gian đảo ngược. Cụ thể, nó đầu tiên tính toán trung bình di chuyển nhanh (SMA) và trung bình di chuyển chậm. Khi SMA nhanh vượt qua SMA chậm, một tín hiệu mua được tạo ra. Khi SMA nhanh vượt dưới SMA chậm, một tín hiệu bán được tạo ra. Điều này cho thấy xu hướng của giá đang thay đổi.

Đồng thời, chiến lược này tính toán chỉ số RSI để xác định xem giá có ở trạng thái mua quá nhiều hay bán quá nhiều không. Trước khi mở các vị trí, nó sẽ đánh giá xem chỉ số RSI có bình thường hay không. Nếu chỉ số RSI vượt quá ngưỡng đặt, nó sẽ tạm ngưng các vị trí mở và chờ đợi chỉ số RSI giảm lại trước khi mở các vị trí. Điều này có thể tránh thiết lập các vị trí tại thời điểm mua quá nhiều và bán quá nhiều không thuận lợi. Mặt khác, sau khi đưa ra các vị trí, nếu chỉ số RSI vượt quá ngưỡng lấy lợi nhuận đặt, nó sẽ đóng các vị trí để kiếm lợi nhuận. Điều này có thể khóa lợi nhuận giao dịch.

Bằng cách hợp tác chỉ số RSI với đường trung bình động, các vị trí có thể được mở khi các tín hiệu đảo ngược giá xảy ra. Và bằng cách lấy lợi nhuận khi mua quá mức hoặc bán quá mức, một chiến lược giao dịch định lượng thực hiện các hoạt động đảo ngược lợi nhuận theo bối cảnh xu hướng giá.

Ưu điểm

Chiến lược có những lợi thế sau:

  1. Sử dụng đường chéo vàng như tín hiệu mua và đường chéo chết như tín hiệu bán có thể nắm bắt chính xác các cơ hội đảo ngược xu hướng giá.

  2. Tránh thời gian mở các vị trí không thuận lợi. Bằng cách đánh giá các điều kiện mua quá mức và bán quá mức thông qua chỉ số RSI, nó có thể ngăn chặn hiệu quả việc thiết lập các vị trí khi giá biến động quá mức trong ngắn hạn, tránh mất lỗ nổi không cần thiết.

  3. RIS có thể được kiểm soát tốt. RSI lấy lợi nhuận có thể giữ các vị trí trong phạm vi lợi nhuận hợp lý và kiểm soát hiệu quả rủi ro giao dịch.

  4. Dễ dàng tối ưu hóa các thông số. Thời gian SMA, các thông số RSI vv có thể được điều chỉnh linh hoạt để thích nghi với môi trường thị trường khác nhau.

  5. Hiệu quả sử dụng vốn cao. Giao dịch thường xuyên có thể được thực hiện trong giai đoạn củng cố xu hướng và giai đoạn sốc, sử dụng vốn hiệu quả.

Phân tích rủi ro

Chiến lược này cũng có những rủi ro sau:

  1. Theo dõi rủi ro lỗi: Mức trung bình động như các chỉ số đánh giá xu hướng có một số trễ nhất định, có thể dẫn đến thời gian mở không chính xác.

  2. Rủi ro giao dịch thường xuyên: Trong thị trường dao động, nó có thể dẫn đến việc mở và đóng các vị trí thường xuyên.

  3. Rủi ro điều chỉnh tham số. Thời gian SMA và tham số RSI cần thử nghiệm và điều chỉnh lặp đi lặp lại để thích nghi với thị trường. Cài đặt không chính xác có thể ảnh hưởng đến hiệu suất chiến lược.

  4. Rủi ro lợi nhuận: Cài đặt RSI không phù hợp cũng có thể dẫn đến việc thoát khỏi vị trí sớm hoặc tiếp tục tăng sau khi thoát khỏi lợi nhuận.

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

Các hướng tối ưu hóa là như sau:

  1. Hãy thử sử dụng MACD, Bollinger Bands và các chỉ số khác kết hợp với RSI để làm cho tín hiệu chính xác và đáng tin cậy hơn.

  2. Tăng các thuật toán học máy để tự động điều chỉnh các tham số dựa trên dữ liệu lịch sử, giảm rủi ro điều chỉnh tham số.

  3. Tăng cơ chế tối ưu hóa cho các chiến lược lợi nhuận để làm cho lợi nhuận thông minh hơn và thích nghi với những thay đổi của thị trường.

  4. Tối ưu hóa các chiến lược quản lý vị trí bằng cách điều chỉnh kích thước vị trí một cách năng động để giảm rủi ro của các giao dịch đơn lẻ.

  5. Kết hợp dữ liệu tần số cao và sử dụng dữ liệu thời gian thực ở cấp độ tick cho giao dịch tần số cao để cải thiện tần số chiến lược.

Kết luận

Tóm lại, chiến lược này sử dụng các tín hiệu giao dịch được tạo ra bởi chỉ số RSI và trung bình động để thực hiện một chiến lược định lượng thực hiện các hoạt động đảo ngược trong thời gian xu hướng. So với việc sử dụng chỉ số trung bình động một mình, bằng cách thêm các phán quyết chỉ số RSI, chiến lược này có thể ngăn chặn hiệu quả thời gian mở các vị trí bất lợi và kiểm soát rủi ro giao dịch thông qua RSI lấy lợi nhuận. Trong một mức độ nào đó, nó cải thiện tính ổn định của chiến lược. Tất nhiên, vẫn còn chỗ để cải thiện cho chiến lược này. Trong tương lai, nó có thể được tối ưu hóa trong các khía cạnh như kết hợp các chỉ số nhiều hơn, tối ưu hóa tham số tự động, quản lý vị trí, vv để làm cho chiến lược hiệu suất thậm chí còn tốt hơn.


/*backtest
start: 2023-12-17 00:00:00
end: 2023-12-18 19:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//1. 做多
//    a. RSI在超买区间时不开单,直到RSI回落一点再开单
//    b. 已经有多仓,如果RSI超买,则平多获利,当RSI回落一点之后,再次开多,直到有交叉信号反转做空

//2. 做空
//    a. RSI在超卖区间时不开单,直到RSI回落一点之后再开多单
//    b. 已经有空仓,如果RSI超卖,则平空获利,当RSI回落一点之后,再开空单,直到有交叉信号反转做多

//@version=4
strategy("策略_RSI+移动揉搓线_", overlay=true)

// 输入
fastLength = input(11, minval=1)
slowLength = input(82,minval=1)
length = input(title="长度", type=input.integer, defval=14, minval=1, maxval=100)
hight_rsi = input(title="rsi超过上轨平多获利", type=input.integer, defval=80, minval=1, maxval=100)
low_rsi = input(title="rsi超过下轨平空获利", type=input.integer, defval=20, minval=1, maxval=100)

open_long_rsi_threshold = input(title="rsi低于该阈值时才开多", type=input.integer, defval=75, minval=1, maxval=100)
open_short_rsi_threshold = input(title="rsi高于该阈值时才开空仓", type=input.integer, defval=25, minval=1, maxval=100)

// 均线
sma_fast = sma(close, fastLength)
sma_slow = sma(close, slowLength)
// RSI
rsi = rsi(close, length)

//**********变量*start*******//
var long_f = false // 标记是否是均线交叉多头
var short_f = false // 标记是否是均线交叉空头
var long_open_pending = false // 标记开仓时rsi是否处于超买状态
var short_open_pending = false // 标记开仓时rsi是否处于超卖
var long_rsi_over_buy = false // 标记 多仓时 是否发生超买平多获利
var short_rsi_over_sell = false // 标记 空仓时 是否发生超卖平空获利

//**********逻辑*start*******//

// 买入
longCondition = crossover(sma_fast, sma_slow)
if (longCondition)
    short_rsi_over_sell := false // 清空该标记,防止再次开空仓
    long_f := true
	short_f := false
	if (rsi < hight_rsi)
	    // 并且没有超买
	    strategy.entry("多", long=strategy.long)
    if (rsi > hight_rsi)
        // 开仓时发生超买,等待rsi小于hight_rsi
	    long_open_pending := true

// 卖出
shortCondition = crossunder(sma_fast, sma_slow)
if (shortCondition)
    long_rsi_over_buy := false //清空该标记,防止再次开多仓
    long_f := false
    short_f := true
    if (rsi > low_rsi)
        strategy.entry("空", long=strategy.short)
	if (rsi < low_rsi)
	    // 开仓时发生超卖,等待rsi大于low_rsi
	    short_open_pending := true
	    

// 等待RSI合理,买入开仓
if (long_f and long_open_pending and strategy.position_size == 0 and rsi < open_long_rsi_threshold)
    strategy.entry("多", long=strategy.long)
	long_open_pending := false
// 等待RSI合理,卖出开仓
if (short_f and short_open_pending and strategy.position_size == 0 and rsi > open_short_rsi_threshold)
    strategy.entry("空", long=strategy.short)
	short_open_pending := false


	
//RSI止盈(RSI超买平多)
if (strategy.position_size > 0 and long_f and rsi > hight_rsi)
	strategy.close_all()
	long_rsi_over_buy := true
//RSI止盈(RSI超卖平空)
if (strategy.position_size < 0 and short_f and rsi < low_rsi)
	strategy.close_all()
	short_rsi_over_sell := true
	
	
//RSI止盈之后,再次开多
if (long_f and long_rsi_over_buy and strategy.position_size == 0 and rsi < hight_rsi)
    long_rsi_over_buy := false
    strategy.entry("多", long=strategy.long)
//RSI止盈之后,再次开空
if (short_f and short_rsi_over_sell and strategy.position_size == 0 and rsi > low_rsi)
    short_rsi_over_sell := false
    strategy.entry("空", long=strategy.short)


//**********绘图*start*******//

p1 = plot(sma_fast, linewidth=2, color=color.green)
p2 = plot(sma_slow, linewidth=2, color=color.red)
fill(p1, p2, color=color.green)
plot(cross(sma_fast, sma_slow) ? sma_fast : na, style = plot.style_circles, linewidth = 4)

// 绘制rsi线
//plot(rsi, color=color.green, editable=true, style=plot.style_circles, linewidth=2)

// 绘制上下轨
//high_ = hline(80, title="上轨")
//low_ = hline(20, title="下轨")
//fill(high_, low_, transp=80, editable=true, title="背景")
    
    
    
    
    
    
    

Thêm nữa