페어 트레이딩 통계적 차익거래

페어 트레이딩이란?

페어 트레이딩(Pairs Trading)은 통계적으로 높은 상관관계를 보이는 두 자산의 가격 괴리를 이용하는 시장 중립(Market Neutral) 전략입니다. 한 자산을 매수하고 다른 자산을 매도하여, 시장 방향과 무관하게 두 자산의 스프레드(Spread) 수렴에서 수익을 추구합니다.

전통 금융에서 헤지펀드의 핵심 전략 중 하나였으며, 최근에는 코인 시장에서도 BTC/ETH, SOL/AVAX 같은 페어를 대상으로 자동매매 봇에 적용하는 트레이더가 늘고 있습니다.

핵심 원리: 공적분(Cointegration)

페어 트레이딩의 이론적 기반은 공적분(Cointegration)입니다. 단순 상관관계와 공적분은 다릅니다:

구분 상관관계 (Correlation) 공적분 (Cointegration)
측정 대상 두 자산 수익률의 방향 유사성 두 자산 가격 비율/차이의 정상성(Stationarity)
시간 안정성 시기에 따라 크게 변동 장기적으로 안정적인 균형 관계
트레이딩 적합성 낮음 — 상관관계가 깨지면 손실 높음 — 스프레드가 평균으로 회귀

상관관계가 높다고 반드시 좋은 페어는 아닙니다. 공적분 관계가 있는 페어만이 스프레드가 평균으로 회귀하는 성질을 보이며, 이것이 수익의 원천입니다.

페어 선정: 파이썬 실전 프로세스

페어 트레이딩의 첫 단계는 공적분 관계가 있는 자산 쌍을 찾는 것입니다. 파이썬에서 Engle-Granger 검정을 사용합니다:

import statsmodels.api as sm
from statsmodels.tsa.stattools import coint

# 두 자산의 종가 시계열
score, pvalue, _ = coint(asset_a_prices, asset_b_prices)

# p-value < 0.05이면 공적분 관계 존재
if pvalue < 0.05:
    print(f"공적분 확인! p-value: {pvalue:.4f}")

실전에서는 후보군 전체를 대상으로 모든 조합을 검정한 뒤, p-value가 낮은 상위 페어를 선별합니다. 단, 경제적 논리가 뒷받침되어야 합니다. 통계적으로만 공적분인 페어는 관계가 깨질 확률이 높습니다.

좋은 페어의 조건:

  • 같은 섹터 또는 유사한 펀더멘털 (예: 삼성전자-SK하이닉스, BTC-ETH)
  • Engle-Granger 검정 p-value < 0.05
  • 스프레드의 반감기(Half-Life)가 합리적 범위 (5~50일)
  • 최소 1~2년 이상의 데이터로 검증

매매 신호: Z-Score 기반 진입/청산

페어가 선정되면, 두 자산의 스프레드를 계산하고 Z-Score로 정규화하여 매매 신호를 생성합니다:

# 스프레드 계산 (헤지 비율 적용)
spread = asset_a_prices - hedge_ratio * asset_b_prices

# Z-Score 계산
z_score = (spread - spread.rolling(window).mean()) / spread.rolling(window).std()

# 매매 신호
# z_score > +2.0  → 숏 스프레드 (A 매도, B 매수)
# z_score < -2.0  → 롱 스프레드 (A 매수, B 매도)
# z_score 0 근처  → 청산

일반적인 Z-Score 임계값:

  • 진입: |Z| > 2.0 (스프레드가 평균에서 2 표준편차 이상 벌어졌을 때)
  • 청산: |Z| < 0.5 (스프레드가 평균 근처로 회귀했을 때)
  • 손절: |Z| > 3.5~4.0 (공적분 관계가 깨졌을 가능성)

리스크 관리: 페어 트레이딩의 함정

페어 트레이딩이 “시장 중립”이라고 해서 무위험은 아닙니다. 반드시 관리해야 할 리스크:

1. 공적분 붕괴 (Structural Break)

두 자산의 근본적 관계가 변하면 스프레드가 영영 회귀하지 않습니다. 예를 들어, 한 종목이 인수합병되거나 코인 프로젝트가 피벗하면 페어 관계가 깨집니다. 롤링 공적분 검정을 주기적으로 수행하여 관계가 약해지면 즉시 포지션을 청산해야 합니다.

2. 레버리지 위험

페어 트레이딩은 수익률이 낮아 레버리지를 사용하는 경우가 많습니다. 하지만 계좌 생존 규칙에서 강조했듯이, 과도한 레버리지는 일시적 스프레드 확대에도 마진콜을 유발합니다.

3. 실행 리스크

두 자산을 동시에 매수/매도해야 하므로, 한쪽만 체결되는 레그 리스크(Leg Risk)가 발생할 수 있습니다. 자동매매 봇에서는 두 주문을 가능한 동시에 발송하고, 한쪽 체결 실패 시 즉시 나머지를 취소하는 로직이 필수입니다.

4. 거래 비용

매매 빈도가 높고 양쪽 포지션 모두 수수료가 발생하므로, 백테스트 시 거래 비용을 정확히 반영해야 합니다. 스프레드 수익이 수수료보다 작으면 전략 자체가 성립하지 않습니다.

자동매매 봇 구현 시 체크리스트

페어 트레이딩 봇을 실전에 배포할 때 확인해야 할 항목입니다:

  1. 공적분 재검증 주기 — 최소 주 1회 롤링 검정으로 페어 관계 유효성 확인
  2. 헤지 비율 업데이트 — 고정 비율이 아닌 롤링 OLS로 동적 조정
  3. 동시 주문 실행 — 레그 리스크 최소화를 위한 병렬 주문 구조
  4. 최대 보유 기간 — 스프레드가 회귀하지 않으면 일정 기간 후 강제 청산
  5. 포지션 사이징 — 전체 자본의 20~30% 이내로 단일 페어 노출 제한
  6. 스프레드 반감기 모니터링 — 반감기가 늘어나면 전략 효율 저하 신호

마무리: 누구에게 적합한 전략인가

페어 트레이딩은 시장 방향 예측 없이 통계적 우위에 기반하므로, 감정적 매매에 취약한 트레이더에게 특히 적합합니다. 단, 통계 지식과 코딩 능력이 필요하며, 단일 매매의 수익이 작아 인내심이 요구됩니다.

자동매매를 처음 시작한다면 초보 진입 실수 10가지를 먼저 확인하고, 충분한 페이퍼 트레이딩을 거친 후 실전에 투입하세요. 통계적 차익거래는 “느리지만 꾸준한 수익”을 추구하는 전략입니다. 급하면 지는 게임입니다.

7) 페어 트레이딩 파이썬 구현: 공적분 검정부터 진입까지

import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import coint, adfuller

def find_cointegrated_pairs(prices_df: pd.DataFrame, significance=0.05):
    """가격 데이터프레임에서 공적분 페어 탐색"""
    n = prices_df.shape[1]
    pairs = []
    pvalue_matrix = np.ones((n, n))
    
    for i in range(n):
        for j in range(i+1, n):
            stock1 = prices_df.iloc[:, i]
            stock2 = prices_df.iloc[:, j]
            _, pvalue, _ = coint(stock1, stock2)
            pvalue_matrix[i, j] = pvalue
            if pvalue  pd.Series:
    """OLS 기반 스프레드 계산"""
    from numpy.polynomial.polynomial import polyfit
    beta = np.polyfit(stock2, stock1, 1)[0]
    spread = stock1 - beta * stock2
    return spread, beta

def generate_signals(spread: pd.Series, 
                     entry_z=2.0, exit_z=0.5, 
                     lookback=60) -> pd.Series:
    """Z-score 기반 진입/청산 시그널"""
    mean = spread.rolling(lookback).mean()
    std = spread.rolling(lookback).std()
    zscore = (spread - mean) / std
    
    signals = pd.Series(0, index=spread.index)
    signals[zscore > entry_z] = -1    # 숏 스프레드
    signals[zscore < -entry_z] = 1    # 롱 스프레드
    signals[abs(zscore) < exit_z] = 0  # 청산
    
    return signals.ffill().fillna(0)

8) 페어 트레이딩의 리스크와 한계

  • 공적분 깨짐(Structural Break): 두 자산의 관계가 변하면 전략이 무효화됩니다. 정기적으로 공적분 재검증 필요 (30~60일 롤링).
  • 한쪽 자산 상장폐지/급변: 코인 페어의 경우 한쪽이 급락하면 스프레드가 수렴하지 않습니다.
  • 거래 비용: 양방향 동시 진입이므로 수수료가 2배. 수수료 차감 후 수익이 나는지 반드시 검증.
  • 자본 효율: 롱+숏 양쪽에 마진이 필요하여 자본 효율이 단방향 대비 낮습니다.

9) 관련 글

위로 스크롤
WordPress Appliance - Powered by TurnKey Linux