추세 추종 RSI와 이동 평균을 결합한 양적 거래 전략

RSI MA SMA TP SL
생성 날짜: 2025-01-06 10:58:42 마지막으로 수정됨: 2025-01-06 10:58:42
복사: 4 클릭수: 376
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

추세 추종 RSI와 이동 평균을 결합한 양적 거래 전략

개요

이 전략은 상대 강도 지수(RSI)와 단순 이동 평균(SMA)을 결합한 추세 추종 거래 시스템입니다. 이 전략은 이동 평균을 사용하여 시장 추세의 방향을 파악하고 RSI 지표를 사용하여 모멘텀을 확인하여 추세와 모멘텀이 공명할 때 거래를 수행합니다. 이 전략은 위험을 효과적으로 통제할 수 있는 완전한 손절매 및 손절매 메커니즘을 설계했습니다.

전략 원칙

전략의 핵심 논리는 두 가지 기술 지표를 결합해서 사용하는 데 기초합니다.

  1. 이동평균선(MA): 전반적인 추세를 파악하는 데 사용됩니다. 가격이 MA보다 위에 있으면 상승 추세로 간주되고, 그렇지 않으면 하락 추세로 간주됩니다.
  2. 상대 강도 지수(RSI): 가격 모멘텀을 확인하는 데 사용됩니다. RSI가 설정된 임계값(예: 55)보다 높으면 상승 모멘텀을 확인하고, 임계값(예: 45)보다 낮으면 하락 모멘텀을 확인합니다.

거래 신호 생성 논리:

  • 롱 조건: 가격이 MA보다 높고 RSI가 매수 임계값보다 높음
  • 공매도 조건: 가격이 MA보다 낮고 RSI가 매도 임계값보다 낮음

위험 관리에는 진입 가격의 고정 백분율로 각각 설정되는 백분율 손절매 및 이익 실현 방법이 사용됩니다.

전략적 이점

  1. 신호 안정성: 추세와 모멘텀의 이중 확인을 결합함으로써 거짓 신호를 효과적으로 줄일 수 있습니다.
  2. 완벽한 위험 관리: 고정 비율의 손절매 및 이익실현이 설정되어 각 거래의 위험을 효과적으로 통제합니다.
  3. 매개변수 유연성: MA ​​기간, RSI 임계값 등의 주요 매개변수는 다양한 시장 특성에 따라 최적화될 수 있습니다.
  4. 전략적 논리는 명확합니다. 거래 규칙은 간단하고 직관적이며, 이해하고 실행하기 쉽습니다.
  5. 강력한 적응성: 다양한 기간의 거래에 적용될 수 있습니다.

전략적 위험

  1. 추세 반전 위험: 추세 전환점에서 지속적인 손절매가 발생할 수 있습니다.
  2. 변동성 있는 시장 위험: 잦은 거래는 범위가 제한된 시장 상황에서 손실로 이어질 수 있습니다.
  3. 매개변수 의존성: 최적의 매개변수는 시장 환경에 따라 크게 달라질 수 있습니다.
  4. 슬리피지 위험: 시장이 격렬하게 변동할 경우 큰 슬리피지에 직면할 수 있습니다.
  5. 기술적 지표 지연: MA와 RSI 모두 어느 정도 지연이 있으며, 이로 인해 진입 시점이 지연될 수 있습니다.

전략 최적화 방향

  1. 동적 매개변수 최적화: 시장 변동성에 따라 MA 기간과 RSI 임계값을 동적으로 조정하는 적응형 매개변수 메커니즘을 도입합니다.
  2. 시장 환경 필터링: 변동성 필터링 메커니즘을 추가하여 변동성이 높은 환경에서 포지션을 조정하거나 거래를 중단합니다.
  3. 다중 기간 분석: 거래 방향의 정확성을 높이기 위해 장기적인 추세 확인을 도입합니다.
  4. 손절매 최적화: 수익을 더 잘 보호하기 위해 추적 손절매 메커니즘을 도입합니다.
  5. 신호 필터링: 거래량과 같은 보조 지표를 추가하여 신호 신뢰성을 개선합니다.

요약하다

이 전략은 추세 지표와 모멘텀 지표를 결합하여 명확한 논리와 통제 가능한 위험을 갖춘 거래 시스템을 구축합니다. 몇 가지 본질적인 위험이 있기는 하지만, 이 전략은 합리적인 매개변수 설정과 위험 관리를 통해 좋은 실용성을 보여줍니다. 이후의 최적화 방향은 주로 동적 매개변수 조정, 시장 환경 식별, 신호 품질 개선에 중점을 둘 것이며, 이를 통해 전략의 안정성과 수익성이 더욱 향상될 것으로 기대됩니다.

전략 소스 코드
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © raiford87

//@version=6
strategy("RSI + MA Trend Strategy (v6)",
     shorttitle="RSI_MA_Trend_v6",
     overlay=true,
     initial_capital=50000,
     default_qty_type=strategy.fixed,
     default_qty_value=1)

// ─────────────────────────────────────────────────────────────────────────────────────
// 1. USER INPUTS
// ─────────────────────────────────────────────────────────────────────────────────────
maLength       = input.int(50,   "Moving Average Length")
rsiLength      = input.int(14,   "RSI Length")
rsiBuyLevel    = input.int(55,   "RSI > X for Buy",  minval=1, maxval=99)
rsiSellLevel   = input.int(45,   "RSI < X for Sell", minval=1, maxval=99)

stopLossPerc   = input.float(1.0,  "Stop Loss %",    minval=0.1)
takeProfitPerc = input.float(2.0,  "Take Profit %",  minval=0.1)

// ─────────────────────────────────────────────────────────────────────────────────────
// 2. INDICATOR CALCULATIONS
// ─────────────────────────────────────────────────────────────────────────────────────
maValue = ta.sma(close, maLength)
rsiVal  = ta.rsi(close, rsiLength)

// Trend conditions
bullTrend = close > maValue
bearTrend = close < maValue

// RSI conditions
rsiBull   = rsiVal > rsiBuyLevel
rsiBear   = rsiVal < rsiSellLevel

// ─────────────────────────────────────────────────────────────────────────────────────
// 3. ENTRY CONDITIONS
// ─────────────────────────────────────────────────────────────────────────────────────
longCondition  = bullTrend and rsiBull
shortCondition = bearTrend and rsiBear

if longCondition
    strategy.entry("RSI MA Long", strategy.long)
if shortCondition
    strategy.entry("RSI MA Short", strategy.short)

// ─────────────────────────────────────────────────────────────────────────────────────
// 4. STOP LOSS & TAKE PROFIT
// ─────────────────────────────────────────────────────────────────────────────────────
stopLossLevel   = stopLossPerc   * 0.01
takeProfitLevel = takeProfitPerc * 0.01

if strategy.position_size > 0
    stopPriceLong = strategy.position_avg_price * (1 - stopLossLevel)
    tpPriceLong   = strategy.position_avg_price * (1 + takeProfitLevel)
    strategy.exit("Exit Long", from_entry="RSI MA Long", stop=stopPriceLong, limit=tpPriceLong)

if strategy.position_size < 0
    stopPriceShort = strategy.position_avg_price * (1 + stopLossLevel)
    tpPriceShort   = strategy.position_avg_price * (1 - takeProfitLevel)
    strategy.exit("Exit Short", from_entry="RSI MA Short", stop=stopPriceShort, limit=tpPriceShort)

// ─────────────────────────────────────────────────────────────────────────────────────
// 5. PLOT SIGNALS & LEVELS
// ─────────────────────────────────────────────────────────────────────────────────────
plot(maValue, color=color.yellow, linewidth=2, title="Moving Average")

plotchar(longCondition,  title="Long Signal",  char='▲', location=location.belowbar, color=color.green, size=size.tiny)
plotchar(shortCondition, title="Short Signal", char='▼', location=location.abovebar, color=color.red,   size=size.tiny)

// Plot Stop & TP lines
posIsLong  = strategy.position_size > 0
posIsShort = strategy.position_size < 0

plotStopLong = posIsLong ? strategy.position_avg_price * (1 - stopLossLevel) : na
plotTpLong   = posIsLong ? strategy.position_avg_price * (1 + takeProfitLevel): na
plotStopShort= posIsShort? strategy.position_avg_price * (1 + stopLossLevel) : na
plotTpShort  = posIsShort? strategy.position_avg_price * (1 - takeProfitLevel): na

plot(plotStopLong,  color=color.red,   linewidth=2, style=plot.style_line, title="Stop Loss Long")
plot(plotTpLong,    color=color.green, linewidth=2, style=plot.style_line, title="Take Profit Long")
plot(plotStopShort, color=color.red,   linewidth=2, style=plot.style_line, title="Stop Loss Short")
plot(plotTpShort,   color=color.green, linewidth=2, style=plot.style_line, title="Take Profit Short")