[알고리즘 트레이딩] 암호화폐 페어 트레이딩 전략 아이디어

비트코인과 이더리움의 가격 움직임을 이용한 페어 트레이딩(pair trading) 전략을 Python 코드와 함께 소개합니다.


1. 🧠 페어 트레이딩이란?

페어 트레이딩은 서로 유사한 움직임을 보이는 두 자산(예: 주식, ETF, 암호화폐) 사이의 상대적인 가격 차이를 활용한 시장중립형 전략입니다. 두 자산이 통계적으로 안정적인 관계(공적분 관계)를 갖는다고 가정하고, 일시적인 괴리를 수익 기회로 활용합니다.

기본 원리는 다음과 같습니다:

  • 두 자산의 가격 차이가 평균으로 회귀한다고 가정

  • 괴리가 커지면 한쪽 매수, 다른 한쪽 매도 (롱/숏 포지션 동시 보유)

  • 다시 평균으로 수렴하면 청산하여 수익 실현


2. 💸 암호화폐 시장에서도 페어 트레이딩이 유효한가?

그렇습니다! 특히 다음과 같은 이유로 암호화폐 시장은 페어 트레이딩에 적합합니다:

  • 높은 상관성: BTC와 ETH는 구조적·심리적으로 동조화된 움직임을 보입니다.

  • 24시간 거래: 중단 없는 가격 데이터 수집 가능

  • 높은 변동성: 통계적 괴리 빈번 → 수익 기회 많음

  • 비효율성 존재: 미성숙한 시장 특성상 과잉반응·오차 발생 가능

따라서 BTC-ETH처럼 공적분 관계가 성립하는 자산 쌍을 찾아내면, 가격 차이의 회귀를 이용한 전략을 구사할 수 있습니다.


3. ⚙️ 분석 대상: BTC vs ETH

이번 실습에서는 대표적인 상관쌍인 BTC(비트코인)와 ETH(이더리움)을 사용합니다.

  • BTC-USD: 시장 기준이자 리스크 자산

  • ETH-USD: 스마트 컨트랙트 기반 플랫폼 코인


4. 🧪 실습 코드: Beta 계산, 공적분 검정, Z-score 분석

import yfinance as yf import numpy as np import pandas as pd import statsmodels.api as sm import matplotlib.pyplot as plt from statsmodels.tsa.stattools import coint # 데이터 불러오기 btc = yf.download('BTC-USD', start='2021-01-01', end='2024-12-31')['Adj Close'] eth = yf.download('ETH-USD', start='2021-01-01', end='2024-12-31')['Adj Close'] # 정렬 및 병합 data = pd.concat([btc, eth], axis=1) data.columns = ['BTC', 'ETH'] data.dropna(inplace=True) # 베타 계산 (OLS 회귀) X = sm.add_constant(data['BTC']) model = sm.OLS(data['ETH'], X).fit() beta = model.params['BTC'] print(f"Beta: {beta:.4f}") # 스프레드 및 Z-score 계산 spread = data['ETH'] - beta * data['BTC'] zscore = (spread - spread.mean()) / spread.std() # 공적분 검정 score, pvalue, _ = coint(data['ETH'], data['BTC']) print(f"Cointegration p-value: {pvalue:.4f}")

5. 📊 시각화: 스프레드와 Z-score

plt.figure(figsize=(14,6)) plt.plot(zscore, label='Z-score (ETH - β·BTC)', color='purple') plt.axhline(0, color='gray', linestyle='--') plt.axhline(1, color='green', linestyle='--') plt.axhline(-1, color='red', linestyle='--') plt.title('ETH-BTC Spread Z-score') plt.legend() plt.grid(True) plt.show()

6. 🧾 간단한 백테스트 전략 예시

# 초기 상태 position = 0 # 0: 없음, 1: 롱 ETH 숏 BTC, -1: 반대 entry_z = 1.0 exit_z = 0.0 returns = [] for i in range(1, len(zscore)): if position == 0: if zscore[i] > entry_z: position = -1 # ETH 숏, BTC 롱 entry_price = spread[i] elif zscore[i] < -entry_z: position = 1 # ETH 롱, BTC 숏 entry_price = spread[i] elif position == 1 and zscore[i] > exit_z: returns.append(entry_price - spread[i]) position = 0 elif position == -1 and zscore[i] < -exit_z: returns.append(spread[i] - entry_price) position = 0 # 수익률 분석 cumulative_return = np.cumsum(returns) plt.plot(cumulative_return) plt.title('Cumulative PnL of ETH-BTC Pair Trade') plt.grid(True) plt.show()

7. ✅ 정리 및 다음 단계

  • BTC-ETH는 공적분 관계가 통계적으로 존재 가능성이 높음

  • 단기적 괴리(Z-score)를 이용해 진입/청산 신호 생성 가능

  • 베타 기반의 포지션 사이징(달러 중립) 중요

  • 실제 매매에는 슬리피지, 거래 수수료, 유동성 고려 필수


📌 확장 아이디어

  • 다중 페어 모델: BTC-ETH, BTC-BNB 등으로 포트폴리오 확장

  • 머신러닝 보조 신호: LSTM, RandomForest로 스프레드 예측

  • 다중 시계열 공적분: Vector Error Correction Model (VECM)

  • 거래소 간 페어 트레이딩: Binance ↔ Upbit 가격 차이 포착


📚 참고자료

  • Gatev, Goetzmann, Rouwenhorst (2006), "Pairs Trading: Performance of a Relative-Value Arbitrage Rule"

  • Marcos Lopez de Prado, Advances in Financial Machine Learning

  • Statsmodels documentation (cointegration, OLS)

댓글

이 블로그의 인기 게시물

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

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

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

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

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

[전기 기초] 저항의 정격전력(Watt) 표기의 의미

PLC 출력 형태

NPN, PNP 트랜지스터 차이점

[PLC] 래더 다이어그램과 PLC

회로 차단기 용량 선정하는 방법