暗号資産における統計的裁定取引 — ペアトレードと平均回帰
統計的裁定取引は、均衡価格からの一時的な乖離を利用します。通常連動して動く2つの資産が乖離した場合、統計的裁定取引のトレーダーはアンダーパフォーマーの資産を買い、アウトパフォーマーの資産を売り、収束に賭けます。暗号資産では、資産間にある程度の相関があるものの完全には連動しないため、利益の機会が生まれます。
例: BTCとETHの相関係数は0.85。1時間でETHがBTCに対して3%アンダーパフォーム(異常値)した場合、統計的裁定取引のトレーダーはBTCを売りETHを買います。過去のデータでは4-8時間以内に収束し、約1-1.5%の利益が確定します。
ペアトレードの基本
ペアの選択
全てのペアが有効とは限りません。以下の条件が必要です:
- 高い相関: >0.8(ピアソン相関係数を使用)
- 経済的関係: レイヤー2とレイヤー1、ステーブルコイン同士など
- 十分な取引量: 両方のペアに流動性が必要
- 共和分: 長期的な均衡関係が存在(ヨハンセン検定で確認)
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
共和分分析
共和分とは?
2つの非定常系列が、それらの線形結合が定常である場合、共和分関係にあります。平易に言えば:時間とともに連動して動き、その関係からの乖離は最終的に元に戻ります。
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スコア > 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スコア→0)、または損失閾値(zスコア反転でストップ)で決済:
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)
Smart Moneyインテリジェンスの追加
Smart Moneyの確認でペアトレードを強化:
Python — フィルタリングされたペア戦略
def smart_money_pairs_strategy(symbol1, symbol2, z_score):
# ペアレベルのSmart Money確認をチェック
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" # アライメントを待つ
Smart Moneyペアシグナルで統計アービトラージを強化
クジラのコンセンサスとデリバティブデータで平均回帰トレードをフィルタリング。当社のAPIはペア乖離の有効性を62%の精度向上で確認します。
ペアトレードを開始 →