correlation-analysis について
暗号資産のポートフォリオ分析や取引に向けた相関分析スキルです。相関の推定、時間変化やテール依存の分析、クラスタリングなどを扱い、参考資料と分析スクリプトも含みます。
主な機能
- 01Pearson・Spearman・Kendall相関
- 02ローリング相関とEWMA相関
- 03相関行列と固有値分析
- 04階層クラスタリングとテール依存
- 05相関レジームの監視
- 06行列・ローリング分析スクリプト
活用シーン
- 01ポートフォリオの分散効果の評価
- 02ペアトレード候補の特定
- 03市場ストレス時の同時下落リスク分析
- 04相関に基づくリスククラスターの分類
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ agiprolabs/ claude-trading-skills --skill correlation-analysisインストール後、Claude Code で/correlation-analysisを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/methodology.mdportfolio_applications.mdscripts/correlation_matrix.pyrolling_correlation.py詳細
相関分析
分散評価、リスク管理、ペアトレードのシグナル生成、ポートフォリオ構築に向けた、資産間の相関分析です。
相関が重要な理由
相関は、資産がどのように連動するかを測定します。暗号資産市場では、以下の理由から非常に重要です。
- 分散投資:相関の高い資産を保有しても、分散投資の効果は得られません。実質的に、1つの資産に集中投資しているのと同じです
- リスク管理:ポートフォリオのリスクは、個々の資産のボラティリティだけでなく、相関構造にも左右されます
- ペアトレード:一時的に乖離した相関の高い資産は、平均回帰の機会を生み出します
- ポートフォリオ構築:最適な配分には、正確な相関推定が必要です
- 暴落への備え:テール依存性を理解することで、資産が同時に暴落するかどうかを明らかにできます
相関の手法
ピアソン相関
正規性を仮定した線形相関です。最も一般的ですが、暗号資産では最も頑健性に欠けます。
import pandas as pd
import numpy as np
# Always compute on returns, never on prices
returns_a = prices_a.pct_change().dropna()
returns_b = prices_b.pct_change().dropna()
pearson_corr = returns_a.corr(returns_b) # default is Pearson
- 範囲:-1(完全な逆相関)から+1(完全な連動)まで
- 前提:線形関係、正規分布に従うリターン、外れ値がないこと
- 制約:暗号資産のリターンは裾が重いため、ピアソン相関では極端な連動性が過小評価されます
スピアマン順位相関
値を順位に変換してから、順位に対してピアソン相関を計算します。単調な関係(線形関係に限りません)を捉えます。
spearman_corr = returns_a.corr(returns_b, method='spearman')
- 外れ値や非線形関係の影響を受けにくい
- リターン分布の裾が重いため、暗号資産に適しています
- 正規性が成り立つ場合、ピアソン相関より検出力がやや低くなります
ケンドールのタウ相関
一致ペアと不一致ペアを数えます。3つの手法の中で最も外れ値に強い方法です。
kendall_corr = returns_a.corr(returns_b, method='kendall')
- 3つの手法の中で最も外れ値に強い
- 大規模なデータセットでは計算に時間がかかります
- 小標本や、大きく偏ったデータに最適です
ローリング相関
静的な相関では、レジームの変化が隠れてしまいます。ローリング相関を使うと、関係性の推移を確認できます。
ウィンドウベースのローリング相関
# Rolling Pearson correlation
rolling_corr = returns_a.rolling(window=60).corr(returns_b)
# Multiple windows for different time horizons
windows = {
'short': 20, # ~1 month of trading days
'medium': 60, # ~3 months
'long': 120, # ~6 months
}
for label, w in windows.items():
df[f'corr_{label}'] = returns_a.rolling(w).corr(returns_b)
EWMA 相関
指数加重方式で、直近の変化により素早く反応します。
def ewma_correlation(x: pd.Series, y: pd.Series, span: int = 60) -> pd.Series:
"""Compute EWMA correlation between two return series."""
cov_xy = x.mul(y).ewm(span=span).mean() - x.ewm(span=span).mean() * y.ewm(span=span).mean()
std_x = x.ewm(span=span).std()
std_y = y.ewm(span=span).std()
return cov_xy / (std_x * std_y)
一般的なウィンドウ
| ウィンドウ | 日数 | 用途 |
|---|---|---|
| 短期 | 20 | 戦術的な取引、ペアのエントリー/エグジット |
| 中期 | 60 | 戦略配分、レジーム検出 |
| 長期 | 120 | ポートフォリオ構築、戦略的配分 |
相関行列の分析
全行列の計算
# Build return matrix for multiple assets
returns = pd.DataFrame({
'BTC': btc_returns,
'ETH': eth_returns,
'SOL': sol_returns,
'AVAX': avax_returns,
})
# Correlation matrix (Pearson)
corr_matrix = returns.corr()
# Spearman (better for crypto)
spearman_matrix = returns.corr(method='spearman')
固有値分解
相関行列を分解し、影響を与える要因を特定します。
eigenvalues, eigenvectors = np.linalg.eigh(corr_matrix.values)
# Sort descending
idx = eigenvalues.argsort()[::-1]
eigenvalues = eigenvalues[idx]
eigenvectors = eigenvectors[:, idx]
# First eigenvalue = market factor (explains most variance)
# Subsequent eigenvalues = sector/style factors
market_factor_pct = eigenvalues[0] / eigenvalues.sum() * 100
- 第1固有ベクトル:市場要因です。これが支配的な場合(分散の60%超)、すべての資産が連動します
- 後続の固有ベクトル:セクター要因またはスタイル要因です
- 小さな固有値:ノイズ/個別リスクです
最小分散ポートフォリオ
from numpy.linalg import inv
cov_matrix = returns.cov()
ones = np.ones(len(cov_matrix))
inv_cov = inv(cov_matrix.values)
# Minimum variance weights
weights = inv_cov @ ones / (ones @ inv_cov @ ones)
階層的クラスタリング
相関の類似性に基づいて資産をグループ化し、自然なクラスターを特定します。
from scipy.cluster.hierarchy import linkage, fcluster
from scipy.spatial.distance import squareform
# Convert correlation to distance
dist_matrix = np.sqrt(2 * (1 - corr_matrix.values))
np.fill_diagonal(dist_matrix, 0)
# Hierarchical clustering
condensed = squareform(dist_matrix)
linkage_matrix = linkage(condensed, method='ward')
# Cut at threshold to get clusters
clusters = fcluster(linkage_matrix, t=1.0, criterion='distance')
用途:
- セクターの特定:同じクラスター内の資産は、同様の動きをします
- 分散投資:分散効果を最大化するため、各クラスターから1つの資産を選択します
- リスク配分:個々の資産ではなく、クラスター間でリスク予算を配分します
テール依存性
正規相関では、暴落時の連動性が過小評価されます。テール依存性は、資産が極端なリターンを同時に経験する頻度を測定します。
下側テール依存性
def tail_dependence(x: pd.Series, y: pd.Series, quantile: float = 0.05) -> float:
"""Estimate lower tail dependence coefficient.
Measures P(Y < q | X < q) for quantile q.
Higher values mean assets crash together more often.
"""
threshold_x = x.quantile(quantile)
threshold_y = y.quantile(quantile)
joint_extreme = ((x < threshold_x) & (y < threshold_y)).sum()
marginal_extreme = (x < threshold_x).sum()
return joint_extreme / marginal_extreme if marginal_extreme > 0 else 0.0
暗号資産特有のテールの動き
暗号資産市場では、テール依存性は通常の相関を上回る傾向があります。
- 2つのアルトコイン間の通常の相関が0.6の場合、テール依存性は0.8になることがあります
- 市場がパニックに陥ると、すべてのリスク資産の相関が1.0に近づきます
- つまり、分散投資の効果は、それが最も必要なときに失われます
レジーム依存の相関
相関は一定ではなく、市場レジームによって変化します。
| レジーム | 典型的な相関 | 意味 |
|---|---|---|
| 強気(上昇トレンド) | 0.4–0.7 | 中程度 — ある程度の分散効果が期待できます |
| レンジ相場 | 0.2–0.5 | 低め — 分散効果が最も高い環境です |
| 弱気(暴落) | 0.8–0.95 | 非常に高い — 分散効果が失われます |
| 回復 | 0.5–0.7 | 暴落時の高水準から低下 |
相関レジームの変化の検出
def correlation_zscore(rolling_corr: pd.Series, lookback: int = 252) -> pd.Series:
"""Z-score of rolling correlation vs its own history."""
mean = rolling_corr.rolling(lookback).mean()
std = rolling_corr.rolling(lookback).std()
return (rolling_corr - mean) / std
# Flag regime shift when z-score exceeds threshold
zscore = correlation_zscore(rolling_corr_60d)
regime_shift = zscore.abs() > 2.0
暗号資産特有の相関パターン
典型的な相関の範囲
| ペア | 通常の範囲 | 備考 |
|---|---|---|
| BTC / ETH | 0.7–0.9 | 主要銘柄の中で最も高い |
| BTC / SOL | 0.6–0.85 | SOLはボラティリティが高く、相関はやや低め |
| BTC / アルトコイン | 0.5–0.8 | 時価総額とセクターによって異なります |
| ミーム / BTC | 0.2–0.5 | 通常時の相関は低め |
| ミーム / ミーム | 0.1–0.4 | 通常時は低いものの、テール依存性は高い |
| ステーブルコイン / BTC | -0.1–0.1 | ほぼゼロであるべきです |
主な観察事項
- ほとんどのアルトコインはBTCとの相関が高く(0.6–0.9)、市場要因が支配的です
- ミームトークンとPumpFunトークンは、通常時の相関は低めですが、テール依存性は高めです
- SOLエコシステムのトークンは、SOL価格と強い相関があります
- ステーブルコインはリスク資産と無相関であるべきです。相関が見られる場合は調査してください(デペッグリスク)
- 相関は高ボラティリティのレジームで高まる傾向があります
- 新規トークンのローンチ直後は、価格発見が安定するまで一時的に相関が低くなる場合があります
他のスキルとの連携
- risk-management:相関を使用して、ポートフォリオ全体のVaRとストレスシナリオを計算します
- portfolio-analytics:相関行列を最適配分アルゴリズムに活用します
- regime-detection:相関レジームの変化をレジーム分類の入力として使用します
- cointegration-analysis:相関の高いペアは、共和分検定の候補になります
- position-sizing:相関を考慮したサイズ調整により、相関資産への集中を防ぎます
ファイル
参考資料
references/methodology.md— 相関の公式、統計的検定、推定方法references/portfolio_applications.md— 分散指標、ペアトレード、リスク分解
スクリプト
scripts/correlation_matrix.py— 複数資産の相関行列、クラスタリング、分散指標scripts/rolling_correlation.py— ローリング相関、レジーム検出、テール依存性分析
コメント
Markdown 対応