수익성 있는 페어 상관 다이버전스 스캐너 v6
발행: (2025년 12월 8일 오후 08:48 GMT+9)
3 min read
원문: Dev.to
Source: Dev.to
개요
이 전략은 Z‑Score 스프레드 분석, 추세 확인, RSI & MACD 모멘텀 체크, 상관관계 필터, ATR 기반 손절/익절 관리 등을 결합하여 두 상관된 자산 간의 다이버전스 기회를 식별합니다. 긍정적인 손익(P&L)과 현실적인 거래 실행을 위해 최적화되었습니다.
주요 기능
- 페어 다이버전스 감지 – 두 자산의 수익률 간 스프레드를 측정하고 Z‑Score로 정규화합니다.
- 추세 정렬 – 빠른 EMA와 느린 EMA를 사용해 현재 추세 방향으로 거래가 이루어지도록 합니다.
- 모멘텀 확인 – RSI와 MACD 필터가 상승 또는 하락 모멘텀을 확인합니다.
- 상관관계 필터 – 최소 상관관계(기본값 > 0.5)를 요구하여 잘못된 신호를 줄입니다.
- 위험 관리 – ATR 기반 손절 및 익절 수준을 사용하며, 보상대위험 비율이 1보다 큽니다.
- 청산 조건 – Z‑Score가 좁은 “정규화” 구역으로 다시 들어올 때 포지션을 청산합니다.
작동 방식
수익률 계산
ret1 = ta.roc(s1, 1)
ret2 = ta.roc(s2, 1)
Z‑Score 스프레드
spread = ret1 - ret2
spreadMA = ta.sma(spread, zLen)
spreadSD = ta.stdev(spread, zLen)
zScore = (spread - spreadMA) / spreadSD
추세 필터
emaFast = ta.ema(s1, fastEMA)
emaSlow = ta.ema(s1, slowEMA)
trendLong = emaFast > emaSlow
trendShort = emaFast 50
rsiShort = rsiVal signalLine
macdShort = macdLine 0.5
거래 실행
longCond = zScore entryZ and trendShort and rsiShort and macdShort and corrFilter
if (longCond)
strategy.entry("LongSpread", strategy.long)
if (shortCond)
strategy.entry("ShortSpread", strategy.short)
청산 로직
exitLong = math.abs(zScore) emaSlow
trendShort = emaFast 50
rsiShort = rsiVal signalLine
macdShort = macdLine 0.5
// ATR FOR SL/TP
atrVal = ta.atr(atrLen)
sl = atrVal * atrMult
tp = atrVal * atrMult * 2 // reward > risk
// ENTRY CONDITIONS
longCond = zScore entryZ and trendShort and rsiShort and macdShort and corrFilter
exitLong = math.abs(zScore) < exitZ
exitShort = math.abs(zScore) < exitZ
// EXECUTION
if (longCond)
strategy.entry("LongSpread", strategy.long)
if (shortCond)
strategy.entry("ShortSpread", strategy.short)
if (exitLong)
strategy.close("LongSpread")
if (exitShort)
strategy.close("ShortSpread")
// ATR‑BASED EXIT
strategy.exit("Exit Long", "LongSpread", stop=close - sl, limit=close + tp)
strategy.exit("Exit Short", "ShortSpread", stop=close + sl, limit=close - tp)
// PLOTTING
plot(zScore, "Z-Score", color=color.new(color.blue, 0))
hline( entryZ, "Upper Entry", color=color.red)
hline(-entryZ, "Lower Entry", color=color.green)
hline( exitZ, "Exit Zone", color=color.gray)
hline(-exitZ, "Exit Zone", color=color.gray)
plot(emaFast, "Fast EMA", color=color.new(color.purple, 0))
plot(emaSlow, "Slow EMA", color=color.new(color.orange, 0))
plot(corrVal, "Correlation", color=color.new(color.teal, 40))