Chiến lược chỉ số sức mạnh tương đối trung bình di chuyển

Tác giả:ChaoZhang, Ngày: 23-11-2018 14:07:46
Tags:

img

Tổng quan

Chiến lược chỉ số sức mạnh tương đối trung bình chuyển động là một chiến lược giao dịch định lượng sử dụng cả đường trung bình chuyển động và chỉ số sức mạnh tương đối (RSI) làm tín hiệu giao dịch để nắm bắt các cơ hội trong xu hướng thị trường.

Chiến lược logic

Chiến lược này chủ yếu dựa trên hai chỉ số:

  1. Trung bình di chuyển đơn giản (SMA): phản ánh xu hướng giá trung bình.
  2. Chỉ số sức mạnh tương đối (RSI): phản ánh sức mạnh hoặc điểm yếu của hiệu suất giá.

Logic cốt lõi của chiến lược là:

Khi đường chỉ số RSI thấp hơn đường trung bình động, nó nằm trong vùng bán quá mức và cho thấy cổ phiếu bị đánh giá thấp, tạo ra tín hiệu mua. Khi đường chỉ số RSI cao hơn đường trung bình động, nó nằm trong vùng mua quá mức và báo hiệu cổ phiếu được đánh giá quá cao, do đó tạo ra tín hiệu bán.

Nói cách khác, đường trung bình động phản ánh giá trị hợp lý của cổ phiếu ở một mức độ nào đó, trong khi chỉ số RSI đại diện cho sức mạnh hoặc điểm yếu hiện tại của giá.

Cụ thể, chiến lược này tạo ra tín hiệu giao dịch thông qua các bước sau:

  1. Tính toán giá trị RSI và trung bình di chuyển đơn giản của giá cổ phiếu.
  2. So sánh mối quan hệ giữa giá trị RSI và đường trung bình động.
  3. Một tín hiệu bán được tạo ra khi đường RSI vượt trên đường trung bình động.
  4. Một tín hiệu mua được kích hoạt khi đường RSI vượt dưới đường trung bình động.
  5. Thiết lập dừng lỗ và dừng kéo theo để kiểm soát rủi ro.

Ưu điểm của Chiến lược

Bằng cách kết hợp đánh giá xu hướng của các đường trung bình động và chỉ số mua quá mức / bán quá mức của RSI, chiến lược này có thể xác định hiệu quả các điểm uốn cong trên thị trường bằng cách tận dụng điểm mạnh của các chỉ số khác nhau.

Những lợi thế chính là:

  1. Mức trung bình động có thể hiệu quả chỉ ra xu hướng giá.
  2. RSI có thể phản ánh các điều kiện mua quá mức / bán quá mức.
  3. Sự kết hợp của hai chỉ số cải thiện độ chính xác của việc xác định các điểm chuyển đổi thị trường.
  4. Stop loss có thể được sử dụng để kiểm soát rủi ro.

Rủi ro của chiến lược

Ngoài ra còn có một số rủi ro với chiến lược này:

  1. Có khả năng tín hiệu sai từ các chỉ số, có thể gây ra tổn thất không cần thiết.
  2. Dừng lỗ có thể được kích hoạt trong các biến động thị trường dữ dội, dẫn đến tổn thất lớn.
  3. Cài đặt tham số không chính xác cũng có thể ảnh hưởng đến hiệu suất chiến lược.

Để quản lý rủi ro, tối ưu hóa có thể được thực hiện theo các cách sau:

  1. Điều chỉnh các tham số của đường trung bình động và RSI để làm cho tín hiệu chỉ số đáng tin cậy hơn.
  2. Đặt stop loss rộng hơn để tránh kích hoạt quá thường xuyên.
  3. Sử dụng stop loss theo dõi động để làm cho stop loss linh hoạt hơn.

Hướng dẫn tối ưu hóa chiến lược

Các hướng tối ưu hóa khác bao gồm:

  1. Kiểm tra các kết hợp tham số khác nhau trên các khung thời gian để tìm các tham số tối ưu.
  2. Thêm các chỉ số khác như âm lượng cho bộ lọc để cải thiện độ tin cậy tín hiệu.
  3. Tối ưu hóa các chiến lược dừng lỗ để làm cho dừng lỗ năng động và hợp lý hơn.
  4. Kết hợp các mô hình học sâu để tối ưu hóa tham số thích nghi.
  5. Thêm mô-đun định kích thước vị trí để điều chỉnh động các vị trí dựa trên điều kiện thị trường

Thông qua tối ưu hóa tham số, tối ưu hóa chỉ số, tối ưu hóa quản lý rủi ro vv, sự ổn định và lợi nhuận của chiến lược này có thể được cải thiện liên tục.

Kết luận

Chiến lược RSI Moving Average sử dụng cả xu hướng giá và phân tích mua quá mức / bán quá mức để xác định hiệu quả các bước ngoặt của thị trường và nắm bắt các cơ hội đảo ngược. Chiến lược đơn giản, thực tế này có rủi ro có thể kiểm soát và hữu ích cho giao dịch định lượng. Tăng cường thêm có thể dẫn đến kết quả tốt hơn.


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

//@version=2

strategy(title = "RSI versus SMA", shorttitle = "RSI vs SMA", overlay = false, pyramiding = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 10, currency = currency.GBP)

// Revision:        1
// Author:          @JayRogers
//
// *** USE AT YOUR OWN RISK ***
// - Nothing is perfect, and all decisions by you are on your own head. And stuff.
//
// Description:
//  - It's RSI versus a Simple Moving Average.. Not sure it really needs much more description.
//  - Should not repaint - Automatically offsets by 1 bar if anything other than "open" selected as RSI source.

// === INPUTS ===
// rsi
rsiSource   = input(defval = open, title = "RSI Source")
rsiLength   = input(defval = 8, title = "RSI Length", minval = 1)
// sma
maLength    = input(defval = 34, title = "MA Period", minval = 1)
// invert trade direction
tradeInvert = input(defval = false, title = "Invert Trade Direction?")
// risk management
useStop     = input(defval = false, title = "Use Initial Stop Loss?")
slPoints    = input(defval = 25, title = "Initial Stop Loss Points", minval = 1)
useTS       = input(defval = true, title = "Use Trailing Stop?")
tslPoints   = input(defval = 120, title = "Trail Points", minval = 1)
useTSO      = input(defval = false, title = "Use Offset For Trailing Stop?")
tslOffset   = input(defval = 20, title = "Trail Offset Points", minval = 1)
// === /INPUTS ===

// === BASE FUNCTIONS ===
// delay for direction change actions
switchDelay(exp, len) =>
    average = len >= 2 ? sum(exp, len) / len : exp[1]
    up      = exp > average
    down    = exp < average
    state   = up ? true : down ? false : up[1]
// === /BASE FUNCTIONS ===

// === SERIES and VAR ===
// rsi
shunt = rsiSource == open ? 0 : 1
rsiUp = rma(max(change(rsiSource[shunt]), 0), rsiLength)
rsiDown = rma(-min(change(rsiSource[shunt]), 0), rsiLength)
rsi = (rsiDown == 0 ? 100 : rsiUp == 0 ? 0 : 100 - (100 / (1 + rsiUp / rsiDown))) - 50 // shifted 50 points to make 0 median
// sma of rsi
rsiMa   = sma(rsi, maLength)
// self explanatory..
tradeDirection = tradeInvert ? 0 <= rsiMa ? true : false : 0 >= rsiMa ? true : false
// === /SERIES ===

// === PLOTTING ===
barcolor(color = tradeDirection ? green : red, title = "Bar Colours")
// hlines
medianLine  = hline(0, title = 'Median', color = #996600,  linewidth = 1)
limitUp     = hline(25, title = 'Limit Up', color = silver,  linewidth = 1)
limitDown   = hline(-25, title = 'Limit Down', color = silver,  linewidth = 1)
// rsi and ma
rsiLine     = plot(rsi, title = 'RSI', color = purple, linewidth = 2, style = line, transp = 50)
areaLine    = plot(rsiMa, title = 'Area MA', color = silver, linewidth = 1, style = area, transp = 70)
// === /PLOTTING ===

goLong() => not tradeDirection[1] and tradeDirection
killLong() => tradeDirection[1] and not tradeDirection
strategy.entry(id = "Buy", long = true, when = goLong())
strategy.close(id = "Buy", when = killLong())

goShort() => tradeDirection[1] and not tradeDirection
killShort() => not tradeDirection[1] and tradeDirection
strategy.entry(id = "Sell", long = false, when = goShort())
strategy.close(id = "Sell", when = killShort())

if (useStop)
    strategy.exit("XSL", from_entry = "Buy", loss = slPoints)
    strategy.exit("XSS", from_entry = "Sell", loss = slPoints)
// if we're using the trailing stop
if (useTS and useTSO) // with offset
    strategy.exit("XSL", from_entry = "Buy", trail_points = tslPoints, trail_offset = tslOffset)
    strategy.exit("XSS", from_entry = "Sell", trail_points = tslPoints, trail_offset = tslOffset)
if (useTS and not useTSO) // without offset
    strategy.exit("XSL", from_entry = "Buy", trail_points = tslPoints)
    strategy.exit("XSS", from_entry = "Sell", trail_points = tslPoints)

Thêm nữa