关于 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详细介绍
相关性分析
用于评估多元化、风险管理、生成配对交易信号和构建投资组合的跨资产相关性分析。
相关性为何重要
相关性衡量资产的共同走势。在加密货币市场中,这一点至关重要,因为:
- 多元化:持有相关资产无法带来多元化收益——实际上相当于持有一个集中的头寸
- 风险管理:投资组合风险取决于相关性结构,而不仅仅是单个资产的波动性
- 配对交易:高度相关的资产暂时出现偏离时,会带来均值回归机会
- 投资组合构建:最优配置需要准确的相关性估计
- 崩盘保护:了解尾部依赖性,可以揭示资产是否会同时崩盘
相关性方法
Pearson 相关系数
假设数据服从正态分布的线性相关性。最常用,但对加密货币市场而言稳健性最低。
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(完全同向)
- 假设:线性关系、收益率呈正态分布、没有离群值
- 局限性:加密货币收益率具有厚尾特征——Pearson 相关系数会低估极端的共同走势
Spearman 秩相关系数
将数值转换为秩,然后在秩上计算 Pearson 相关系数。可捕捉单调关系(而不仅仅是线性关系)。
spearman_corr = returns_a.corr(returns_b, method='spearman')
- 对离群值和非线性关系更稳健
- 由于收益率分布具有厚尾特征,更适用于加密货币
- 正态性成立时,其检验效能略低于 Pearson 相关系数
Kendall Tau 相关系数
统计一致对与不一致对。对离群值的稳健性最高。
kendall_corr = returns_a.corr(returns_b, method='kendall')
- 在这三种方法中,对离群值的稳健性最高
- 在大型数据集上计算速度较慢
- 最适用于小样本或严重偏斜的数据
滚动相关性
静态相关性会掩盖市场状态变化。滚动相关性则能揭示关系如何演变。
基于窗口的滚动相关性
# 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
- 第一个特征向量:市场因子——当它占主导地位(方差 >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')
应用:
- 行业检测:同一类别中的资产表现相似
- 多元化:每个类别选择一种资产,以实现最大程度的多元化
- 风险配置:在各类别之间分配风险预算,而不是在单个资产之间分配
尾部依赖性
正态相关性会低估崩盘期间的共同走势。尾部依赖性衡量资产同时出现极端收益的频率。
下尾依赖性
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
加密货币特有的尾部行为
在加密货币市场中,尾部依赖性通常高于正常时期的相关性:
- 两种山寨币之间的正常相关性可能为 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 | 随市值和板块而变化 |
| Meme / BTC | 0.2–0.5 | 正常情况下相关性较低 |
| Meme / Meme | 0.1–0.4 | 正常情况下较低,但尾部依赖较高 |
| 稳定币 / BTC | -0.1–0.1 | 应接近于零 |
主要观察结果
- 大多数山寨币与 BTC 高度相关(0.6–0.9)——市场因子占主导地位
- Meme 和 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