이동 평균 상대 강도 지수 전략

저자:차오장, 날짜: 2023-11-28 14:07:46
태그:

img

전반적인 설명

이동 평균 상대 강도 지표 전략은 이동 평균 라인과 상대 강도 지표 (RSI) 를 거래 신호로 사용하여 시장 트렌드의 기회를 포착하는 양적 거래 전략이다. 이 전략은 시장에서 역전 기회를 포착하기 위해 가격 이동 평균 라인을 RSI 지표의 가치와 비교하여 거래 신호를 생성합니다.

전략 논리

이 전략은 주로 두 가지 지표에 기반합니다.

  1. 단순 이동 평균 (SMA): 가격의 평균 트렌드를 반영합니다.
  2. 상대적 강도 지수 (RSI): 가격 성과의 강도 또는 약도를 반영합니다.

전략의 핵심 논리는 다음과 같습니다.

RSI 지표 라인이 이동 평균 라인보다 낮을 때, 그것은 과잉 판매 영역에 있으며 주가가 과대평가되어 있다는 것을 나타내고 구매 신호를 생성합니다. RSI 라인이 이동 평균 라인보다 높을 때, 그것은 과대 구매 영역에 있으며 주가가 과대평가되어 있음을 신호하여 판매 신호를 생성합니다.

다른 말로, 이동 평균선은 어느 정도 주식의 적정 가치를 반영하고, RSI 지표는 현재 가격의 강도 또는 약도를 나타냅니다. RSI가 이동 평균선에서 벗어날 때, 그것은 반전 기회를 암시합니다.

특히 이 전략은 다음 단계를 통해 거래 신호를 생성합니다.

  1. 주식 가격의 RSI 값과 간단한 이동 평균을 계산합니다.
  2. RSI 값과 이동 평균 라인 사이의 관계를 비교합니다.
  3. 판매 신호는 RSI 라인이 이동 평균 라인을 넘을 때 생성됩니다.
  4. 구매 신호는 RSI 라인이 이동 평균 라인 아래를 넘을 때 발사됩니다.
  5. 스톱 로즈와 트레일링 스톱을 설정해 위험을 조절해

전략 의 장점

이동 평균의 추세 판단과 RSI의 과잉 구매/ 과잉 판매 지표를 결합함으로써 이 전략은 다른 지표의 강점을 활용하여 시장의 전환점을 효과적으로 결정할 수 있습니다.

주요 장점은 다음과 같습니다.

  1. 이동 평균은 가격 추세를 효과적으로 나타낼 수 있습니다.
  2. RSI는 과잉 구매/ 과잉 판매 상황을 반영할 수 있습니다.
  3. 이중 지표의 조합은 시장 전환점을 식별하는 정확성을 향상시킵니다.
  4. 스톱 로스는 리스크를 통제하는데 사용될 수 있습니다.

전략 의 위험

이 전략에는 몇 가지 위험도 있습니다.

  1. 지표에서 잘못된 신호가 나올 확률이 있고, 불필요한 손실이 발생할 수 있습니다.
  2. 시장의 급격한 변동이 일어나면 스톱 로스가 발생하여 큰 손실이 발생할 수 있습니다.
  3. 잘못된 매개 변수 설정도 전략 성능에 영향을 줄 수 있습니다.

리스크를 관리하려면 다음과 같은 방법으로 최적화를 할 수 있습니다.

  1. 이동 평균과 RSI의 매개 변수를 조정하여 지표 신호를 더 신뢰할 수 있습니다.
  2. 너무 빈번한 트리거를 피하기 위해 적절한 스톱 로스를 더 넓게 설정합니다.
  3. 역동적인 후속 스톱 손실을 채택하여 스톱 손실을 더 유연하게 만듭니다.

전략 최적화의 방향

추가 최적화 방향은 다음과 같습니다.

  1. 최적의 매개 변수를 찾기 위해 다양한 매개 변수 조합을 테스트합니다.
  2. 신호 신뢰성을 높이기 위해 필터 용량과 같은 다른 지표를 추가합니다.
  3. 스톱 로스 전략을 최적화하여 스톱 로스를 더 역동적이고 합리적으로 만듭니다.
  4. 어댑티브 매개 변수 최적화를 위한 딥 러닝 모델을 포함합니다.
  5. 포지션 사이즈 모듈을 추가하여 시장 조건에 따라 포지션을 동적으로 조정합니다.

매개 변수 최적화, 지표 최적화, 위험 관리 최적화 등을 통해 이 전략의 안정성과 수익성이 지속적으로 향상될 수 있습니다.

결론

이동평균 RSI 전략은 가격 추세와 과잉 구매/ 과잉 판매 분석을 모두 활용하여 시장 전환점을 효과적으로 파악하고 역전 기회를 포착합니다. 이 간단하고 실용적인 전략은 통제 가능한 위험을 가지고 있으며 양적 거래에 유용합니다. 추가 최적화는 더 나은 결과를 초래할 수 있습니다.


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

더 많은