암호화폐 통계적 차익거래 — 페어 트레이딩과 평균 회귀
통계적 차익거래는 일시적인 균형 가격 이탈을 활용합니다. 일반적으로 함께 움직이는 두 자산이 갈라질 때, 통계적 차익 거래자는 저성과 자산을 매수하고 우성과 자산을 공매도하여 수렴을 기대합니다. 암호화폐에서는 자산들이 상관관계가 있지만 완벽하지 않아 수익성 있는 기회가 창출되기 때문에 특히 강력합니다.
예시: BTC와 ETH의 상관관계는 0.85입니다. ETH가 1시간 동안 BTC 대비 3% 저조한 성과를 보이면(비정상적), 통계적 차익 거래자는 BTC를 공매도하고 ETH를 매수합니다. 역사적으로 4-8시간 내에 수렴하여 약 1-1.5%의 이익을 확보합니다.
페어 트레이딩 기본
페어 선택
모든 페어가 적합한 것은 아닙니다. 다음이 필요합니다:
- 높은 상관관계: >0.8 (피어슨 상관계수 사용)
- 경제적 관계: 레이어 2와 L1, 스테이블코인 간 관계
- 충분한 거래량: 두 페어 모두 유동성이 있어야 함
- 공적분: 장기 균형이 존재함 (요한슨 검정으로 테스트)
Python — 페어 선택
import pandas as pd
from scipy.stats import pearsonr
def find_cointegrated_pairs(symbols, data):
candidates = []
for i, sym1 in enumerate(symbols):
for sym2 in symbols[i+1:]:
# 상관관계 계산
corr, p_value = pearsonr(data[sym1], data[sym2])
if corr > 0.75:
# 공적분 테스트 (Engle-Granger 검정)
residuals = data[sym1] - (data[sym2] * corr)
adf_stat = adf_test(residuals) # 정상성
if adf_stat < 0.05: # 정상성 있음
candidates.append((sym1, sym2, corr))
return candidates
공적분 분석
공적분이란?
두 비정상 시계열의 선형 조합이 정상적일 때 공적분 관계에 있습니다. 쉽게 말해, 시간이 지나도 함께 움직이며 그 관계에서 벗어나면 결국 회복됩니다.
BTC와 ETH의 경우:
- BTC 가격: $42,000 (비정상 — 상승/하락 추세)
- ETH 가격: $2,300 (비정상 — 상승/하락 추세)
- 스프레드: BTC - (18 × ETH) = $40 (정상 — 평균 주변 진동)
헤지 비율 찾기
최적의 비율을 찾기 위해 일반 최소제곱 회귀 사용:
Python — 헤지 비율 계산
from sklearn.linear_model import LinearRegression
def get_hedge_ratio(price1, price2):
# price1을 price2에 회귀하여 베타(헤지 비율) 찾기
X = price2.reshape(-1, 1)
y = price1
model = LinearRegression().fit(X, y)
hedge_ratio = model.coef_[0]
intercept = model.intercept_
return hedge_ratio, intercept
# 스프레드 = price1 - (hedge_ratio × price2) + intercept
beta, alpha = get_hedge_ratio(btc_prices, eth_prices)
spread = btc - (beta * eth)
평균 회귀 전략
Z-스코어 사용
스프레드를 표준화하여 극단적인 지점을 감지합니다. z-score > 2이면 스프레드가 비정상적으로 넓어집니다(거래 기회):
Python — 평균 회귀 트레이딩
def mean_reversion_signal(spread, lookback=20):
# 롤링 평균 및 표준편차 계산
mean = spread.rolling(window=lookback).mean()
std = spread.rolling(window=lookback).std()
# Z-스코어: 평균에서 몇 표준편차 떨어져 있는지
z_score = (spread - mean) / std
# 트레이딩 신호
if z_score[-1] > 2.0:
return "LONG_SPREAD" # 스프레드가 너무 넓음, 저성과 자산 매수
elif z_score[-1] < -2.0:
return "SHORT_SPREAD" # 스프레드가 너무 좁음, 저성과 자산 공매도
else:
return "NEUTRAL"
종료 규칙
스프레드가 평균으로 회귀할 때(z-score → 0) 또는 손실 한계에 도달할 때(z-score 반전 시 중단) 종료:
Python — 종료 로직
def check_exit(entry_z_score, current_z_score, entry_price):
# 익절: 스프레드가 평균으로 절반 회귀
if abs(current_z_score) < abs(entry_z_score) * 0.5:
return "EXIT", "profit_target"
# 손절: z-점수가 잘못된 방향으로 >1 이동함
if (entry_z_score > 0 and current_z_score < entry_z_score + 1.0):
return "EXIT", "stop_loss"
elif (entry_z_score < 0 and current_z_score > entry_z_score - 1.0):
return "EXIT", "stop_loss"
return "HOLD", None
통계적 차익거래 전략 백테스팅
통계적 차익거래의 핵심 지표:
- 승률: >55% (지속적으로 회귀 현상을 포착함)
- 평균 승/패 비율: >1.2 (이익이 손실을 상회함)
- 샤프 비율: >0.8 (위험 단위당 수익률)
- 최대 손실률: <-15% (시스템 안전성 유지)
Python — 페어 전략 백테스트
def backtest_pairs_strategy(price1, price2, hedge_ratio):
spread = price1 - (hedge_ratio * price2)
mean = spread.rolling(20).mean()
std = spread.rolling(20).std()
z_score = (spread - mean) / std
trades = []
position = None
for i in range(len(z_score)):
if position is None:
if z_score[i] > 2.0:
position = {"entry": spread[i], "z_entry": z_score[i], "idx": i}
else:
exit_reason = check_exit(position["z_entry"], z_score[i], spread[i])[1]
if exit_reason:
pnl = position["entry"] - spread[i]
trades.append({"pnl": pnl, "reason": exit_reason})
position = None
return pd.DataFrame(trades)
스마트 머니 인텔리전스 추가
스마트 머니 확인으로 페어 트레이딩 강화:
Python — 필터링된 페어 전략
def smart_money_pairs_strategy(symbol1, symbol2, z_score):
# 페어 수준 스마트 머니 확인
sm1 = get_smart_money_signal(symbol1)
sm2 = get_smart_money_signal(symbol2)
# 하나는 HIGH 강세, 다른 하나는 HIGH 약세일 때 = 강한 분기
# 스프레드 트레이딩 적기
divergence_score = abs(sm1["composite"] - sm2["composite"])
if z_score > 2.0 and divergence_score > 0.3 and sm1["confidence"] != "VETO":
return "TRADE" # 높은 신뢰도 신호
else:
return "SKIP" # 정렬 대기
스마트 머니 페어 신호로 통계적 차익거래 강화
고래 합의와 파생상품 데이터로 평균 회귀 트레이드 필터링. 당사 API는 페어 분기 유효성을 62% 정확도 향상으로 확인합니다.
페어 트레이딩 시작 →