[알고리즘 트레이딩] 페어 트레이딩(Pairs Trading)에서 "좋은 페어"는 어떻게 고를까?

페어 트레이딩은 두 자산 간의 가격 차이(스프레드)가 평균으로 회귀한다는 전제하에 이루어지는 전략입니다. 하지만 아무 종목이나 짝지어서 해도 되는 건 아닙니다. 페어가 적절하지 않다면 오히려 손실로 이어질 수 있죠.

이번 글에서는 **"어떤 종목쌍이 좋은 페어인가?"**를 판단하는 기준과, 자동으로 적절한 페어를 찾는 방법까지 정리해보겠습니다.


✅ 좋은 페어의 조건은?

1. 높은 상관계수 (Correlation)

페어 후보를 추릴 때 가장 기본적인 조건입니다.

  • 의미: 두 종목이 비슷한 방향으로 움직이는가?

  • 기준: 상관계수 0.8 이상이면 통과

  • 주의: 상관계수만 높고 평균회귀하지 않으면 무용지물

correlation = pair_df.corr().iloc[0,1]

2. 공적분 검정 (Cointegration Test)

페어 트레이딩 전략의 핵심 조건!

  • 의미: 두 시계열 간에 장기적으로 일정한 관계가 있는가?

  • 검정 도구: statsmodels.tsa.stattools.coint

  • 기준: p-value < 0.05 → 평균회귀 관계 존재

from statsmodels.tsa.stattools import coint score, pvalue, _ = coint(pair_df['Target1'], pair_df['Target2']) if pvalue < 0.05: print("→ 평균회귀 관계 있음 (공적분 OK)")

3. 스프레드의 ADF 테스트 (Augmented Dickey-Fuller Test)

스프레드가 정상성을 가지는지 직접 확인하는 방법입니다.

  • 의미: 스프레드가 단위근이 없고 평균으로 회귀하는가?

  • 기준: p-value < 0.05 → 정상성 있음

from statsmodels.tsa.stattools import adfuller spread = pair_df['Target1'] - hedge_ratio * pair_df['Target2'] result = adfuller(spread) if result[1] < 0.05: print("→ 스프레드 정상성 있음")

4. z-score 시각화

z-score가 자주 ±1을 넘고 다시 평균으로 회귀하는 형태가 이상적입니다.


🧠 요약: 페어 선택 체크리스트

항목기준
상관계수0.8 이상
공적분 검정p-value < 0.05
ADF 정상성 검정p-value < 0.05
z-score 패턴±1 이상 자주 벗어나고 평균 회귀

🤖 자동 페어 발굴기: 샘플 코드

import yfinance as yf import pandas as pd import numpy as np from statsmodels.tsa.stattools import coint from itertools import combinations from datetime import datetime, timedelta # 종목 리스트 (한국 예시: 삼성전자, SK하이닉스, NAVER, 카카오 등) symbols = ['005930.KS', '000660.KS', '035420.KQ', '035720.KQ', '207940.KQ'] # 날짜 설정 end_date = datetime.today() - timedelta(days=1) start_date = end_date - timedelta(days=365) # 데이터 수집 price_data = {} for symbol in symbols: df = yf.download(symbol, start=start_date.strftime('%Y-%m-%d'), end=end_date.strftime('%Y-%m-%d')) if not df.empty: price_data[symbol] = df['Close'] # 데이터프레임 병합 price_df = pd.DataFrame(price_data).dropna() # 모든 조합에 대해 공적분 검정 수행 pair_results = [] for s1, s2 in combinations(symbols, 2): score, pvalue, _ = coint(price_df[s1], price_df[s2]) pair_results.append((s1, s2, pvalue)) # p-value 기준 정렬 (낮을수록 좋음) sorted_pairs = sorted(pair_results, key=lambda x: x[2]) # 결과 출력 print("★ 평균회귀 가능성 높은 페어 Top 5:") for s1, s2, pvalue in sorted_pairs[:5]: print(f"{s1} & {s2} → p-value: {pvalue:.4f}")

✍️ 마무리

페어 트레이딩 전략의 핵심은 단순히 상관관계가 높은 자산을 고르는 것이 아니라, 스프레드가 평균으로 되돌아오는 관계인지를 검증하는 것입니다.

공적분 검정과 ADF 테스트는 적절한 페어를 찾는 데 매우 중요한 도구이며, 이를 바탕으로 자동 페어 탐색 시스템을 구축하면 더 체계적이고 재현 가능한 퀀트 전략을 만들 수 있습니다.

댓글

이 블로그의 인기 게시물

[PLC] PLC 아날로그 입출력 기본

[아두이노] 가변저항(Potential Divider)과 전압분배(Voltage Divider)

공압 속도 제어: 미터인 vs 미터아웃

전력(kW) 계산하기 (직류, 교류 단상, 교류 삼상)

커패시터에 저장된 에너지 계산

제너 다이오드에 저항을 연결하는 이유

[자동화] 안쓰는 안드로이드폰을 활용한 식물 성장 타임랩스 촬영

3선 결선식 센서의 타입 PNP, NPN

[PLC] 릴레이 자기유지 (Realy Latch or Sealing)

[스마트팜] 아쿠아포닉스에서 pH 제어를 자동화해보자! (Python 활용)