Chiến lược giao dịch định lượng dựa trên StochRSI

Tác giả:ChaoZhang, Ngày: 2023-12-07 16:05:17
Tags:

img

Tổng quan

Chiến lược này được phát triển dựa trên chỉ số StochRSI. Chiến lược chủ yếu sử dụng chỉ số StochRSI để đánh giá tình huống mua quá mức và bán quá mức. Kết hợp với chỉ số RSI để lọc ra một số tín hiệu sai, đi ngắn khi chỉ số StochRSI cho thấy khu vực mua quá mức và đi dài khi nó cho thấy khu vực bán quá mức để kiếm lợi nhuận.

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

Chỉ số StochRSI được sử dụng để đánh giá các khu vực mua quá mức và bán quá mức trên thị trường. Chỉ số StochRSI bao gồm đường K và đường D. Đường K phản ánh vị trí của giá trị RSI hiện tại trong phạm vi giá RSI trong một khoảng thời gian gần đây. Đường D là đường trung bình động của đường K. Khi đường K vượt qua đường D, đó là một khu vực mua quá mức và các vị trí dài có thể được thực hiện. Khi đường K giảm xuống dưới đường D, đó là một khu vực bán quá mức và các vị trí ngắn có thể được thực hiện.

Cụ thể, chiến lược đầu tiên tính toán giá trị của chỉ số RSI 14 giai đoạn, và sau đó áp dụng chỉ số StochRSI trên chỉ số RSI. Các tham số chỉ số StochRSI được đặt với chiều dài 14, giai đoạn đường K trơn tru là 3 và giai đoạn đường D trơn tru là 3. Khi đường K vượt trên khu vực quá bán được xác định bởi người dùng (bất định là 1), vị trí dài sẽ được thực hiện. Khi đường K giảm xuống dưới khu vực quá mua được xác định bởi người dùng (bất định là 99), vị trí ngắn sẽ được thực hiện.

Ngoài ra, các thông số dừng lỗ và lấy lợi nhuận được thiết lập trong chiến lược. Stop loss là mặc định đến 10000. Take profit sử dụng trailing stop với các điểm theo mặc định là 300 và offset là 0.

Phân tích lợi thế

  1. Sử dụng chỉ số StochRSI để xác định các khu vực mua quá mức và bán quá mức đáng tin cậy hơn chỉ số RSI duy nhất
  2. Việc lọc tín hiệu với RSI tránh sự đột phá sai
  3. Thiết lập các cơ chế dừng lỗ và lấy lợi nhuận để kiểm soát rủi ro

Phân tích rủi ro

  1. Chỉ số StochRSI có thể có tín hiệu sai
  2. Cần phải thiết lập quá mua và quá bán các thông số hợp lý, nếu không nó sẽ gây ra sự hoạt động sai
  3. Nếu điểm dừng lỗ quá nhỏ, nó dễ bị mắc kẹt. Nếu điểm lấy lợi nhuận quá lớn, lợi nhuận có thể bị hạn chế.

Đối với các rủi ro trên, các tham số chu kỳ dài hơn có thể được thiết lập hoặc xem xét sử dụng kết hợp với các chỉ số khác để lọc các tín hiệu, điều chỉnh các tham số mua quá mức và bán quá mức để thích nghi với các thị trường khác nhau và kiểm tra các tham số dừng lỗ và lợi nhuận khác nhau.

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

  1. Xem xét sử dụng kết hợp với các chỉ số khác như MACD, Bollinger Bands vv để lọc các tín hiệu sai
  2. Kiểm tra các thiết lập chu kỳ tham số khác nhau để thích nghi với nhiều điều kiện thị trường hơn
  3. Tối ưu hóa dừng lỗ và lấy điểm lợi nhuận bằng nhiều backtesting để tìm các thông số tối ưu

Tóm lại

Chiến lược này giao dịch dựa trên các khu vực mua quá mức và bán quá mức được đánh giá bởi chỉ số StochRSI. So với chỉ số RSI duy nhất, StochRSI kết hợp ý tưởng của KDJ và có thể đánh giá các điểm chuyển đổi chính xác hơn. Đồng thời, các tín hiệu sai được lọc ra bởi RSI và rủi ro được kiểm soát bằng cách dừng lỗ và lấy lợi nhuận. Vẫn còn nhiều chỗ để tối ưu hóa, nó có thể được kết hợp với các chỉ số khác hoặc cài đặt tham số tối ưu hóa.


/*backtest
start: 2023-11-06 00:00:00
end: 2023-12-06 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version= 2
strategy("STOCHRSI JURE", overlay=false)
lengthrsi = input(10)
overSold = input( 1 )
overBought = input(99)

call_trail_stop = input(300)
call_trail_offset = input(0)
call_sl = input(10000)

price = ohlc4
vrsi = rsi(price, lengthrsi)

smoothK = input(3, minval=1)
smoothD = input(3, minval=1)
lengthRSI = input(14, minval=1)
lengthStoch = input(14, minval=1)
src = input(close, title="RSI Source")

rsi1 = rsi(src, lengthRSI)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)


plot( k, color=blue, linewidth=1, title="K")
plot( d, color=red, linewidth=1, title="D")

if (crossover(k, overSold) ) 
    strategy.entry("BUY", strategy.long, stop=close, oca_name="TREND",  comment="BUY")
    strategy.exit("BUY EXIT", "BUY", trail_points=call_trail_stop, trail_offset=call_trail_offset, loss = call_sl)


if (crossunder(k, overBought) ) 
    strategy.entry("SELL", strategy.short,stop=close, oca_name="TREND", comment="SELL")
    strategy.exit("SELL EXIT", "SELL", trail_points=call_trail_stop, trail_offset=call_trail_offset, loss = call_sl)
    

//if (  ( crossover(k,d)) and ( (vrsi<overSold) or crossover(vrsi,overSold) )  and   year >= yearfrom and year <= yearuntil and month>=monthfrom and month <=monthuntil and dayofmonth>=dayfrom and dayofmonth < dayuntil) 
//    strategy.entry("BUY", strategy.long, stop=close, oca_name="TREND", oca_type=strategy.oca.cancel, comment="BUY")
//else
//    strategy.cancel(id="BUY")

//if ( ( crossunder(k,d) ) and ( (vrsi >overBought) or crossunder(vrsi,overBought) ) and   year >= yearfrom and year <= yearuntil and month>=monthfrom and month <=monthuntil and dayofmonth>=dayfrom and dayofmonth < dayuntil ) 
//    strategy.entry("SELL", strategy.short,stop=close, oca_name="TREND", oca_type=strategy.oca.cancel, comment="SELL")
//else
//    strategy.cancel(id="SELL")
    
    
    

Thêm nữa