第四章:相关性分析实战

相关性分析,说白了就是找关系。

金融市场里,资产之间从来不是孤立的。A股涨了,港股跟不跟?原油飙了,黄金会不会动?这些问题的答案,就藏在相关系数里。我做了这么多年量化,见过太多人一上来就搞复杂模型,结果连最基本的联动关系都没搞清楚——嗯,这其实是个坑。

4.1 Pearson vs Spearman:你该用哪个?

先说说这两个最常用的相关系数。

Pearson相关系数,衡量的是线性关系。它的公式大家应该都见过:

ρ = Cov(X,Y) / (σX * σY)

取值范围在[-1, 1]之间。1代表完全正相关,-1代表完全负相关,0代表没关系。

但这里有个大问题——Pearson对异常值极其敏感。我在项目中遇到过一回,两个品种本来相关性只有0.3,结果因为某天一个极端行情,相关系数直接跳到0.85。你想想看,这能信吗?

Spearman相关系数就不一样了。它用的是排名,不是原始数值。

ρs = 1 - (6 * Σd²) / (n * (n² - 1))

其中d是排名差,n是样本数。

说白了,Spearman看的是趋势是否一致,而不是具体涨了多少。这就稳健多了。

我的经验法则:

  • 数据干净、线性关系明显 → 用Pearson
  • 有异常值、关系非线性 → 用Spearman
  • 不确定?两个都算,对比看看
特性 Pearson Spearman
数据类型 连续数值 排名/顺序
对异常值敏感度
检测关系类型 线性 单调(线性或非线性)
计算复杂度

4.2 滚动相关性窗口:捕捉动态变化

静态相关系数有个致命缺陷——它假设关系是稳定的。但金融市场哪有什么稳定?

08年金融危机时,所有资产的相关性都往1跑。平时不相关的品种,危机时刻全变成难兄难弟。这就是所谓的「相关性突变」。

滚动窗口就是为了解决这个问题。

import pandas as pd
import numpy as np

def rolling_correlation(series1, series2, window=60):
    """
    计算滚动相关系数
    window: 窗口大小,默认60个交易日
    """
    return series1.rolling(window).corr(series2)

# 示例:计算沪深300与恒生指数的滚动相关性
hs300 = pd.Series(...)  # 沪深300收益率
hsi = pd.Series(...)    # 恒生指数收益率

rolling_corr = rolling_correlation(hs300, hsi, window=60)

窗口大小怎么选?我个人习惯:

  • 短期交易(几天到几周):20-30个交易日
  • 中期策略(几个月):60-90个交易日
  • 长期配置(一年以上):120-250个交易日

我曾经踩过的坑:窗口太小,噪声太大;窗口太大,反应太慢。有一次我用20天窗口做配对交易,结果频繁开仓平仓,手续费都亏掉了。后来改成60天窗口,效果好了很多。

4.3 热力图可视化:一眼看穿全局

相关系数矩阵用数字看,眼睛会瞎。用热力图,一目了然。

import seaborn as sns
import matplotlib.pyplot as plt

# 假设我们有一个DataFrame,包含多个资产的收益率
# columns = ['沪深300', '恒生指数', '标普500', '日经225', '黄金', '原油']

corr_matrix = returns.corr(method='pearson')

plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, 
            annot=True,      # 显示数值
            cmap='RdBu_r',   # 红蓝配色
            vmin=-1, vmax=1, # 固定色阶范围
            center=0,        # 以0为中心
            square=True)     # 正方形格子
plt.title('跨市场资产相关性热力图')
plt.tight_layout()
plt.show()

热力图里,红色越深代表正相关越强,蓝色越深代表负相关越强。颜色越浅,说明关系越弱。

你想想看,一眼扫过去,哪些资产抱团、哪些资产独立,清清楚楚。

实用技巧:热力图配合聚类分析效果更好。把相关性高的品种聚在一起,能帮你快速找到「资产族群」。比如股票类资产往往聚在一起,商品类资产又是另一群。

4.4 实战案例:跨市场联动分析

来,我们走一遍完整的流程。

场景:我想看看A股、港股、美股、黄金、原油之间的联动关系,找出哪些组合适合做对冲。

步骤:

  1. 数据准备:获取近3年的日度收益率数据
  2. 静态分析:计算全样本的Pearson和Spearman相关系数
  3. 动态分析:用60天滚动窗口,观察相关性随时间的变化
  4. 可视化:绘制热力图和滚动相关性曲线
  5. 结论:找出稳定低相关的组合,用于分散风险
# 完整代码示例
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 1. 数据准备(假设数据已加载)
assets = ['HS300', 'HSI', 'SP500', 'GOLD', 'OIL']
returns = pd.DataFrame(...)  # 各资产日收益率

# 2. 静态相关性
pearson_corr = returns.corr(method='pearson')
spearman_corr = returns.corr(method='spearman')

# 3. 滚动相关性(以沪深300和恒生指数为例)
window = 60
rolling_corr = returns['HS300'].rolling(window).corr(returns['HSI'])

# 4. 可视化
fig, axes = plt.subplots(1, 2, figsize=(14, 6))

# 热力图
sns.heatmap(pearson_corr, annot=True, cmap='RdBu_r', 
            vmin=-1, vmax=1, center=0, ax=axes[0])
axes[0].set_title('Pearson相关系数矩阵')

# 滚动相关性
axes[1].plot(rolling_corr.index, rolling_corr.values, 
             label=f'滚动窗口={window}天', color='navy')
axes[1].axhline(y=0, color='gray', linestyle='--')
axes[1].set_title('沪深300 vs 恒生指数 滚动相关性')
axes[1].legend()

plt.tight_layout()
plt.show()

核心结论:

  • A股和港股相关性最高(0.6-0.8),但波动也大
  • 黄金和股票相关性低(0.1-0.3),适合做对冲
  • 原油和股票的关系不稳定,危机时可能变成正相关

4.5 避坑指南

做相关性分析这么多年,我总结了几条血泪教训:

  • 不要只看相关系数大小——统计显著性更重要。p值大于0.05的相关系数,基本可以忽略。
  • 小心伪相关——两个完全不相关的变量,也可能因为巧合算出高相关系数。样本量越大,这个问题越轻。
  • 相关性不等于因果性——这个老生常谈了,但每次还是会有人犯。A和B相关,不代表A导致B。
  • 注意时间滞后——有些市场反应快,有些慢。比如美股涨了,A股可能第二天才跟。这时候用滞后相关性更合适。

我曾经犯过的错:用全样本相关系数做配对交易,结果开仓后相关性突然逆转,亏了不少。后来我学乖了——只用滚动相关性,而且设置止损。

4.6 本章知识体系

下面这张图,帮你理清本章的核心逻辑:

相关性分析知识体系 相关性分析 相关系数方法 Pearson:线性关系 Spearman:排名关系 动态分析 滚动窗口(20/60/120天) 相关性突变检测 可视化 热力图(矩阵展示) 时间序列曲线 实战应用 配对交易策略 风险对冲组合 跨市场套利 资产配置优化 核心:静态分析 + 动态监控 + 可视化决策

嗯,相关性分析就这些内容。记住一句话:相关性能帮你找机会,但不能替你下结论。工具是死的,怎么用才是关键。