cointegration-analysis について
資産価格の長期的な関係を調べる、定量分析やペアトレード向けのスキルです。複数の検定手法、ヘッジ比率やスプレッドの分析、ローリング監視、バックテスト用スクリプトを扱います。
主な機能
- 01Engle-Granger・Johansen・Phillips-Ouliaris検定
- 02ヘッジ比率の推定とスプレッド構築
- 03ADF・Hurst指数・半減期の分析
- 04ローリング協整と関係の監視
- 05ウォークフォワード型ペア戦略バックテスト
活用シーン
- 01平均回帰型ペアトレードの候補選定
- 02ペアトレードのヘッジ比率推定
- 03協整関係の構造変化の監視
- 04ウォークフォワード検証によるペア戦略のバックテスト
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ agiprolabs/ claude-trading-skills --skill cointegration-analysisインストール後、Claude Code で/cointegration-analysisを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/methodology.mdpairs_trading.mdscripts/pairs_backtest.pytest_cointegration.py詳細
共和分分析
共和分検定では、長期的な均衡関係を共有する資産のペアを特定し、統計的裁定取引やペアトレード戦略を可能にします。
共和分とは?
2つの価格系列がそれぞれ非定常(ランダムウォーク)でありながら、それらの線形結合が定常(平均回帰する)である場合、その2系列は共和分しているといいます。直感的には、価格は一時的に離れても、時間とともに均衡スプレッドへ引き戻されます。
共和分と相関の違い
| 特性 | 相関 | 共和分 |
|---|---|---|
| 測定対象 | 短期的な連動 | 長期的な均衡 |
| 定常性 | 定常リターンが必要 | 非定常の価格で機能 |
| 時間軸 | 急速に変化することがある | 数か月から数年にわたり安定 |
| 取引での用途 | モメンタム/トレンドシグナル | 平均回帰型のペアトレード |
| 失敗の要因 | レジーム変化による崩れ | 構造変化による崩れ |
2つの資産は相関が非常に高くても共和分していない場合があります(例:無関係な2つの上昇トレンド)。反対に、共和分している資産でも、一時的に乖離している間は短期相関が低くなることがあります。まさにそのタイミングでペアトレードを開始します。
重要な理由
- ペアトレード:パフォーマンスの低い方を買い、パフォーマンスの高い方を売って、収束による利益を狙います
- 統計的裁定取引:スプレッドの Z スコアに基づき、体系的に平均回帰を狙います
- スプレッド取引:合成金融商品としてスプレッドを直接取引します
- リスクヘッジ:共和分のヘッジ比率により、トラッキングエラーを長期的に最小化します
手法
1. Engle-Granger の2段階法
2つの系列に対して最も一般的なアプローチです。
ステップ 1 — OLS を使用して Y を X に回帰します。
Y_t = α + β * X_t + ε_t
ステップ 2 — ADF 検定を使用して、残差 ε_t の定常性を検定します。
- 残差が定常(p < 0.05)であれば → Y と X は共和分しています
- β はペアトレードのヘッジ比率です
- α はスプレッドの長期平均です
重要:Engle-Granger の臨界値は、標準的な ADF の臨界値とは異なります。系列が n=2 の場合:1% = -3.90、5% = -3.34、10% = -3.04 です。
非対称性に関する注意:YX の検定結果は、XY の検定結果と異なる場合があります。必ず両方向を検定し、より強い結果を使用してください。
from scipy import stats
import numpy as np
from statsmodels.tsa.stattools import adfuller
# Step 1: OLS regression
slope, intercept, _, _, _ = stats.linregress(x_prices, y_prices)
hedge_ratio = slope
# Step 2: Test residuals
residuals = y_prices - hedge_ratio * x_prices - intercept
adf_stat, p_value, _, _, crit_values, _ = adfuller(residuals, maxlag=None, autolag="AIC")
cointegrated = p_value < 0.05
2. Johansen 検定
複数の系列を同時に検定し、共和分関係の数を返します。2系列を超える場合は、Engle-Granger よりも検出力が高くなります。
- VAR モデルに基づきます:ΔY_t = Π·Y_{t-1} + Σ Γ_i·ΔY_{t-i} + ε_t
- Π 行列のランクを検定します
- トレース検定と最大固有値検定を使用します
- 返される値:共和分ベクトルの数とベクトル自体
from statsmodels.tsa.vector_ar.vecm import coint_johansen
# data: T×N array of price series
result = coint_johansen(data, det_order=0, k_ar_diff=1)
# Trace statistic vs critical values (90%, 95%, 99%)
trace_stats = result.lr1 # Trace statistics
trace_crit = result.cvt # Critical values
max_eigen_stats = result.lr2 # Max eigenvalue statistics
max_eigen_crit = result.cvm # Critical values
# Cointegrating vectors
coint_vectors = result.evec
3. Phillips-Ouliaris
Engle-Granger に似ていますが、ADF ではなく Phillips-Perron 型の検定統計量を使用します。残差の不均一分散や系列相関に対して、より頑健です。statsmodels.tsa.stattools.coint から利用できます。
from statsmodels.tsa.stattools import coint
# Returns: test statistic, p-value, critical values
t_stat, p_value, crit_values = coint(y_prices, x_prices)
cointegrated = p_value < 0.05
実践的なワークフロー
ステップ 1:相関でペアを絞り込む
共和分検定の数(計算コストが高くなります)を減らすため、Pearson 相関が 0.7 を超えるペアを事前に絞り込みます。
ステップ 2:共和分を検定する
Engle-Granger 検定を両方向で実行します。しきい値には p < 0.05 を使用します。
ステップ 3:ヘッジ比率を推定する
簡便な方法として OLS を使用します。本番環境では、Total Least Squares または Dynamic OLS の利用を検討してください(references/methodology.md を参照)。
ステップ 4:スプレッドを計算する
spread = y_prices - hedge_ratio * x_prices - intercept
z_score = (spread - spread.mean()) / spread.std()
ステップ 5:スプレッドの平均回帰を検定する
- ADF 検定:p < 0.05 で定常性が確認されます
- ハースト指数:H < 0.5 は平均回帰を示します(H ≈ 0.5 はランダムウォーク)
- 半減期:スプレッドに対する AR(1) から λ を求めます。半減期 = -ln(2)/ln(λ)
- 有望なペア:半減期が 5~60 日
ステップ 6:スプレッドを取引する
スプレッドが平均回帰する場合、ペアトレードの有望な候補となります。エントリー/エグジットルールとリスク管理については、references/pairs_trading.md を参照してください。
ローリング共和分
構造変化、レジームシフト、または市場ダイナミクスの変化により、共和分関係は時間とともに崩れることがあります。
ローリングウィンドウ方式
60~90 日のローリングウィンドウで共和分を検定します。
window = 60
rolling_pvalues = []
rolling_hedges = []
for i in range(window, len(prices)):
y_win = y_prices[i - window:i]
x_win = x_prices[i - window:i]
_, p_val, _ = coint(y_win, x_win)
slope, intercept, _, _, _ = stats.linregress(x_win, y_win)
rolling_pvalues.append(p_val)
rolling_hedges.append(slope)
監視シグナル
| シグナル | 健全 | 警告 | 取引停止 |
|---|---|---|---|
| ローリング p 値 | < 0.05 | 0.05–0.10 | > 0.10 |
| ヘッジ比率のドリフト | < 10% の変化 | 10–25% の変化 | > 25% の変化 |
| スプレッドの半減期 | 5–60 日 | 60–120 日 | > 120 日または < 5 |
暗号資産ペアの候補
レイヤー 1 の相関
- SOL vs ETH — L1 セクターのベータで、トレンド相場では共和分することがよくあります
- SOL vs AVAX — 代替 L1 の相関
ステーブルコイン
- USDC vs USDT — 完全に共和分するはずです(ペッグ裁定取引)
- 共和分分析パイプラインの健全性チェックに役立ちます
リキッドステーキングデリバティブ
- mSOL vs jitoSOL — どちらも SOL のステーキング利回りを追跡します
- stSOL vs mSOL — Lido と Marinade のステーキング
同一セクターのトークン
- DEX トークン:RAY vs ORCA
- レンディングトークン:プロトコル間の比較
- ミームトークン:共和分することはまれで、リスクが高いです
よくある落とし穴
-
見せかけの共和分 — 2 つのトレンド系列(強気相場でどちらも上昇している場合)は、共和分しているように見えることがあります。十分なデータ(>200 件の観測値)で必ず検定し、サンプル外での安定性を確認してください。
-
構造変化 — 根本的な変化(プロトコルのアップグレード、トークノミクスの変更)によって、共和分が恒久的に崩れることがあります。ローリング p 値を監視してください。
-
先読みバイアス — 全サンプルでヘッジ比率を推定し、その同じサンプルでバックテストを行うと、結果が過大評価されます。必ずウォークフォワード推定を使用してください。
-
サンプルが短すぎる — 共和分検定で妥当な検出力を得るには、最低でも >100 件、できれば >200 件の観測値が必要です。
-
取引コストの無視 — ペア取引では、往復で 4 回の取引が発生します。1 レッグあたり 0.3% の場合、スプレッドで補う必要のあるコストは 1.2% です。
-
非対称な共和分 — 関係性が一方の方向または一方のレジームでしか成立しない場合があります。本番環境での使用には、しきい値共和分モデルを検討してください。
他のスキルとの連携
correlation-analysis— 共和分検定の前に相関でペアを事前選別しますmean-reversion— 平均回帰のエントリー/エグジットルールを使用して、共和分するスプレッドを取引しますvectorbt— ウォークフォワード検証でペア戦略をバックテストしますregime-detection— 共和分レジームがいつ変化するかを特定しますvolatility-modeling— 動的なポジションサイジングのためにスプレッドのボラティリティを予測します
ファイル
リファレンス
references/methodology.md— Engle-Granger の詳細、Johansen の導出、ヘッジ比率の推定方法、スプレッドの構築references/pairs_trading.md— エントリー/エグジットルール、リスク管理、パフォーマンス指標、暗号資産固有の考慮事項
スクリプト
scripts/test_cointegration.py— ADF、Hurst、半減期、ローリング安定性、デモモードを含む共和分検定の完全なパイプラインscripts/pairs_backtest.py— 合成データとパフォーマンスレポートを使用するウォークフォワードのペア取引バックテスト