이동 평균 교차 및 동적 변동성 손절매 양적 전략

SMA RSI ATR RISK-TO-REWARD RATIO TREND FOLLOWING
생성 날짜: 2025-04-02 11:08:39 마지막으로 수정됨: 2025-04-02 11:08:39
복사: 2 클릭수: 323
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

이동 평균 교차 및 동적 변동성 손절매 양적 전략 이동 평균 교차 및 동적 변동성 손절매 양적 전략

개요

이 양적 거래 전략은 이동 평균의 교차, 상대적으로 약한 지표 ((RSI) 필터링과 평균 실제 범위에 기반한 동적 손실 메커니즘 ((ATR) 의 통합 시스템입니다. 이 전략은 주로 중·장기 트렌드를 포착하는 데 사용되며, RSI 지표를 통해 과도한 과매매 또는 과매매 된 시장 환경에 들어가는 것을 피하며, ATR 지표를 사용하여 시장의 변동성에 적응하기 위해 동적 손실을 설정합니다.

전략 원칙

전략의 핵심 논리는 다음과 같은 핵심 구성 요소를 기반으로 합니다.

  1. 이동 평균 교차 신호전략은 두 개의 간단한 이동 평균 ((SMA) 을 사용하며, 각각 50주기 단기 평균과 200주기 장기 평균이다. 단기 평균이 장기 평균보다 낮고 RSI 값이 30보다 크면, 시스템은 여러 신호를 유발한다. 이러한 디자인은 잠재적인 트렌드 전환점을 식별하기 위해 고안되었다.

  2. RSI 필터 메커니즘: 전략은 14주기 RSI 지표를 활용하여 입문 필터링한다. 구체적으로, RSI 값이 30보다 높을 때만 더 많이하는 것이 허용되며, 이는 깊은 과매매 지역에서 맹목적으로 입문하는 것을 피하는 데 도움이 된다. 코드는 공백 조건의 프레임 워크를 유지하지만, 현재 버전은 주로 더 많은 전략에 초점을 맞추고 있다.

  3. ATR 동적 상쇄전략: 14주기의 ATR 지수를 사용하여 동적 중지 수준을 계산한다. 중지 지점은 입시 가격 미분으로 설정되어 있다. ATR 값 × 배수, ATR 배수는 1.0을 기본으로 한다. 이러한 동적 중지 메커니즘은 시장의 실제 변동성에 따라 적응할 수 있으며, 높은 변동성 동안 더 느슨한 중지 공간을 제공하며, 낮은 변동성 동안 더 긴밀한 위험 통제를 유지한다.

  4. 위험과 수익의 비율전략은 리스크 수익률 (RRR) 에 기반한 스톱 설정을 구현하고, 기본값은 1.5이다. 스톱은 입시 가격과 (입시 가격 - 스톱 가격) × 리스크 수익률으로 계산되며, 각 거래의 잠재적인 수익과 감수된 위험의 적절한 비율을 보장합니다.

전략적 이점

  1. 트렌드 추적과 필터링이 전략은 이동 평균을 사용하여 트렌드 변화를 포착하는 것뿐만 아니라 RSI 지표에 의해 필터링하여 잘못된 신호를 줄이고 진입 품질을 향상시킵니다.

  2. 동적 위험 관리ATR 기반의 스톱 메커니즘은 시장의 변동성에 따라 스톱 거리를 조정할 수 있으며, 높은 변동성 환경에서 고정 스톱이 조기에 유발되는 문제를 피하고, 낮은 변동성 시기에 적절한 위험 제어를 유지할 수 있습니다.

  3. 위험과 수익률의 최적화이 전략은 각 거래의 잠재적인 수익과 위험의 비율을 보장합니다. 이는 승리율이 높지 않은 경우에도 장기적으로 자금을 성장시키는 데 도움이 됩니다.

  4. 거래 시각화전략에는 실시간으로 스톱로즈와 스톱 포즈의 지도와 완료된 거래의 표시 기능이 포함되어 있습니다. 이것은 전략의 작동을 가시화하고 분석 및 전략 최적화를 촉진합니다.

  5. 자금 관리 통합이 방법은 고정 수보다 더 유연하며, 계정 크기가 변함에 따라 거래 크기를 자동으로 조정할 수 있습니다.

전략적 위험

  1. 추세 반전 위험전략은 이동 평균을 사용하여 트렌드를 인식하지만, 시장이 급격하게 반전되면 큰 손실이 발생할 수 있습니다. 해결책은 보조 확인으로 더 민감한 단기 지표를 도입하거나 RSI 경계를 조정하여 반전에 대한 민감성을 높이는 것입니다.

  2. 매개변수 민감도전략의 핵심 매개 변수인 SMA 주기, RSI 미지수, ATR 배수 등이 성능에 중요한 영향을 미친다. 다른 시장 환경에는 다른 매개 변수 설정이 필요할 수 있으므로 최적의 매개 변수 조합을 찾기 위해 충분한 역사 회전이 필요합니다.

  3. 한자 시장의 한계: 현재 버전은 주로 다중 전략에 초점을 맞추고 있으며, 지속적인 하락 시장에서 좋지 않을 수 있습니다. 해결책은 코드에서 상장 조건을 활성화하여 양방향 거래 능력을 구현하는 것입니다.

  4. 너무 넓은 위험: 극도로 높은 변동 기간 동안 ATR 값이 크게 증가할 수 있으며, 이로 인해 중지 거리가 너무 넓어지고 잠재적인 손실이 증가합니다. ATR 배수의 상한을 설정하거나 고정 금액의 중지와 ATR 동적 중단의 혼합 옵션을 고려할 수 있습니다.

  5. 거래 빈도 불확실성전략적 의존성 중·장기 이동 평균의 교차로 인해 거래 신호가 희박해지면서 자금 활용 효율성에 영향을 미칠 수 있다. 해결책은 단기 거래 신호를 보충으로 추가하는 것을 고려하거나, 주요 추세가 확립된 후 더 짧은 지표를 사용하여 포지션을 높이는 것이다.

전략 최적화 방향

  1. 다중 시간 프레임 분석 통합: 현재 전략은 단일 시간 프레임에서만 작동합니다. 예를 들어, 더 높은 시간 프레임을 사용하여 주 트렌드 방향을 확인하고, 그 다음에는 더 낮은 시간 프레임에서 진입 지점을 찾아 진입 정확도를 높이는 등 여러 시간 프레임 분석을 통합하는 것이 고려 될 수 있습니다.

  2. 공허함 논리의 완성도: 전략의 하위 논리를 활성화하고 최적화하여 하위 시장에서도 똑같이 효과적일 수 있습니다. 이것은 하위 RSI 마이너스를 조정하는 것과 같은 RSI 마이너스를 조정하는 것과 같은 RSI가 70보다 크면 하위) 및 다른 시장 방향에 대한 다른 매개 변수를 설정하는 것이 필요할 수 있습니다.

  3. 거래량 지표 도입: 거래량 지표를 입시 논리에 통합하는 것을 고려하고 거래량이 확인된 경우에만 거래 신호를 실행하는 것이 가짜 돌파구로 인한 손실을 줄이는 데 도움이됩니다.

  4. 정지방지 전략을 최적화: 현재 전략은 고정된 리스크/이익을 사용하여 스톱포드를 설정하는 것보다 부분적인 수익을 고정하거나 스톱포드를 추적하여 추세가 지속될 때 더 많은 수익을 얻을 수 있습니다.

  5. 거래 시간 필터를 추가합니다.: 명확한 시간적 특성을 가진 시장에 대해 시간 필터를 추가하여 낮은 유동성 또는 높은 불확실성의 시간에 거래하는 것을 피할 수 있습니다.

  6. 변수 적응 메커니즘: 역사적인 변동률이나 다른 시장 특성에 기반한 파라미터 적응 조정 메커니즘을 구현하여, 전략이 시장 환경 변화에 따라 자동으로 파라미터를 최적화할 수 있도록 한다.

요약하다

이동 평균 크로스, RSI 필터링 및 ATR 다이내믹 스톱을 기반으로 한 이 정량화 전략은 균형 잡힌 거래 프레임 워크를 제공하며 중장기 트렌드 트레이딩에 특히 적합합니다. 핵심 장점은 기술 지표 분석과 동적 위험 관리를 원활하게 결합하여 트렌드 변화를 포착하고 시장의 변동성에 따라 리스크 을 조정할 수 있다는 것입니다.

전략에는 변수 민감성과 일방 거래의 한계가 있지만, 여러 시간 프레임 분석, 공백 논리 개선, 거래량 확인 등의 제안된 최적화 방향에 의해 이러한 문제를 효과적으로 개선할 수 있다. 특히, 동적 변수 조정 메커니즘을 더 복잡한 정지 전략과 결합하면 전략의 안정성과 수익성을 더욱 향상시킬 수 있다.

중장기적인 트렌드 거래를 추구하면서도 위험을 통제하는 거래자들에게 이 전략은 강력한 출발점을 제공하며, 개인화 조정과 지속적인 최적화를 통해 효율적인 거래 시스템으로 발전할 수 있는 잠재력을 가지고 있다.

전략 소스 코드
/*backtest
start: 2024-04-02 00:00:00
end: 2025-04-01 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BNB_USDT"}]
*/

//@version=6
strategy(title=" VS-NTC> NASDQ100 Long MA+RSI+ATR", shorttitle="VS-NTC> Long NASDQ100 MA+RSI+ATR", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// ————— Inputs —————
smaLenShort  = input.int(50,  title="Short SMA Length")
smaLenLong   = input.int(200, title="Long SMA Length")
rsiLen       = input.int(14,  title="RSI Length")
atrPeriod    = input.int(14,  title="ATR Period")
atrMult      = input.float(1.0, title="Stop-Loss ATR Multiplier", step=0.1)
rrRatio      = input.float(1.5, title="Risk-to-Reward Ratio",    step=0.1)

// ————— Indicator Calculations —————
smaShort = ta.sma(close, smaLenShort)
smaLong  = ta.sma(close, smaLenLong)
rsiVal   = ta.rsi(close, rsiLen)
atrVal   = ta.atr(atrPeriod)

// ————— Entry Conditions —————
// Long Condition: 50SMA > 200SMA and RSI < 70
longCondition = (smaShort < smaLong) and (rsiVal > 30)
// Short Condition: 50SMA < 200SMA and RSI > 30 (example: avoid oversold)
// Or use RSI > 70 to short if the market is overbought.
shortCondition = false
// shortCondition = (smaShort > smaLong) and (rsiVal < 35)

// ————— Entry Logic —————
if longCondition
    strategy.entry(id="Long", direction=strategy.long)

if shortCondition
    strategy.entry(id="Short", direction=strategy.short)

// ————— Stop-Loss & Take-Profit Calculation —————
var float stopPrice       = na
var float takeProfitPrice = na

// If we have a position open, we determine SL & TP differently for Long or Short.
if strategy.position_size > 0
    // We are in a Long trade
    stopPrice       := strategy.position_avg_price - (atrVal * atrMult)
    takeProfitPrice := strategy.position_avg_price + ((strategy.position_avg_price - stopPrice) * rrRatio)

    strategy.exit("Exit SL/TP", stop=stopPrice, limit=takeProfitPrice)
else if strategy.position_size < 0
    // We are in a Short trade
    stopPrice       := strategy.position_avg_price + (atrVal * atrMult)
    // For short, the distance from entry to stop is (stopPrice - entry)
    // So the take-profit is entry - that same distance times RR
    takeProfitPrice := strategy.position_avg_price - ((stopPrice - strategy.position_avg_price) * rrRatio)

    strategy.exit("Exit SL/TP", stop=stopPrice, limit=takeProfitPrice)
else
    // No open position → reset plots to na
    stopPrice       := na
    takeProfitPrice := na

// ————— Plot the Planned Stop-Loss & Take-Profit —————
plot(stopPrice,       title="Stop Loss",   color=color.red,   linewidth=2)
plot(takeProfitPrice, title="Take Profit", color=color.green, linewidth=2)


// ————— Label Each Closed Trade (Wins & Losses) —————
var int lastClosedTradeCount = 0
currentClosedCount = strategy.closedtrades

// If there's at least one new closed trade, label it
if currentClosedCount > lastClosedTradeCount
    newTradeIndex = currentClosedCount - 1

    tradeProfit  = strategy.closedtrades.profit(newTradeIndex)
    exitBarIndex = strategy.closedtrades.exit_bar_index(newTradeIndex)
    exitPrice    = strategy.closedtrades.exit_price(newTradeIndex)

    // Win label if profit > 0
    if tradeProfit > 0
        labelText  = "Win: " + str.tostring(tradeProfit)
        labelStyle = label.style_label_up
        labelColor = color.new(color.green, 0)
        label.new(exitBarIndex, exitPrice, text=labelText, style=labelStyle, color=labelColor, size=size.tiny)

    // Loss label if profit < 0
    if tradeProfit < 0
        labelText  = "Loss: " + str.tostring(tradeProfit)
        labelStyle = label.style_label_down
        labelColor = color.new(color.red, 0)
        label.new(exitBarIndex, exitPrice, text=labelText, style=labelStyle, color=labelColor, size=size.tiny)

    lastClosedTradeCount := currentClosedCount