4. 相关性分析:皮尔逊相关系数、斯皮尔曼秩相关系数、协整检验

做跨品种套利,核心就一句话:找到两个品种之间稳定的关系。这个关系怎么找?说白了就是相关性分析。我做了这么多年量化,见过太多人一上来就搞复杂模型,结果连两个品种到底有没有关系都没搞清楚。今天咱们就把这块地基打牢。

4.1 皮尔逊相关系数:最直观的线性关系度量

皮尔逊相关系数,大家应该都不陌生。它衡量的是两个变量之间的线性相关程度。值域在[-1, 1]之间,1代表完全正相关,-1代表完全负相关,0代表没有线性关系。

公式长这样:

r = Σ((xi - x̄)(yi - ȳ)) / sqrt(Σ(xi - x̄)² * Σ(yi - ȳ)²)

嗯,公式看着有点唬人,但用Python实现就几行代码:

import numpy as np
from scipy import stats

# 假设我们有两只股票的价格序列
stock_a = np.array([100, 102, 101, 105, 107, 106])
stock_b = np.array([50, 51, 50.5, 52.5, 53.5, 53])

# 计算皮尔逊相关系数
pearson_r, p_value = stats.pearsonr(stock_a, stock_b)
print(f"皮尔逊相关系数: {pearson_r:.4f}")
print(f"p值: {p_value:.4f}")

关键点:皮尔逊相关系数对异常值极其敏感。我在项目中遇到过,两个品种本来相关性很高,结果某天一个品种因为乌龙指出现了一个极端值,相关系数直接从0.9掉到0.3。所以用之前一定要做数据清洗。

我的经验:实际交易中,我一般要求皮尔逊相关系数绝对值大于0.7才考虑做套利。低于这个值,线性关系太弱,策略容易失效。

4.2 斯皮尔曼秩相关系数:非线性关系的救星

皮尔逊有个硬伤——它只能捕捉线性关系。但金融市场里,很多品种之间的关系是非线性的。比如,一个品种涨10%,另一个可能只涨5%,但它们的涨跌方向是一致的。这时候就该斯皮尔曼上场了。

斯皮尔曼秩相关系数,说白了就是把原始数据换成排名,然后再算皮尔逊相关系数。它不关心具体数值,只关心相对顺序。

# 计算斯皮尔曼秩相关系数
spearman_r, p_value = stats.spearmanr(stock_a, stock_b)
print(f"斯皮尔曼秩相关系数: {spearman_r:.4f}")
print(f"p值: {p_value:.4f}")
对比维度 皮尔逊相关系数 斯皮尔曼秩相关系数
数据类型 连续数值 排序/等级
关系类型 线性关系 单调关系(线性或非线性)
异常值敏感度
适用场景 价格序列平稳、线性关系明显 存在非线性关系、数据有异常值

避坑指南:我曾经在分析螺纹钢和铁矿石时,皮尔逊系数只有0.4,差点放弃这个组合。后来换成斯皮尔曼,系数到了0.85。为什么?因为两者关系不是严格线性的,但涨跌方向高度一致。所以,两个系数都算一下,对比着看,这是基本功。

4.3 协整检验:套利交易的真正基石

相关系数高,不代表能套利。你想想看,两个品种如果都是随机游走,即使相关系数很高,它们的价差也可能无限发散。套利交易真正需要的是协整关系——两个非平稳序列的线性组合是平稳的。

这里我用Engle-Granger两步法,这是最经典的协整检验方法。

第一步:回归

import statsmodels.api as sm

# 假设y和x是两个价格序列
y = stock_b  # 被解释变量
x = sm.add_constant(stock_a)  # 解释变量,加常数项

# OLS回归
model = sm.OLS(y, x).fit()
residuals = model.resid  # 残差序列

print(f"回归系数: {model.params}")
print(f"回归方程: y = {model.params[0]:.4f} + {model.params[1]:.4f} * x")

第二步:对残差做单位根检验

from statsmodels.tsa.stattools import adfuller

# 对残差做ADF检验
adf_result = adfuller(residuals, maxlag=1)
adf_statistic = adf_result[0]
p_value = adf_result[1]
critical_values = adf_result[4]

print(f"ADF统计量: {adf_statistic:.4f}")
print(f"p值: {p_value:.4f}")
print("临界值:")
for key, value in critical_values.items():
    print(f"  {key}: {value:.4f}")

if adf_statistic < critical_values['5%']:
    print("结论: 残差序列平稳,存在协整关系")
else:
    print("结论: 残差序列非平稳,不存在协整关系")

核心逻辑:如果残差序列是平稳的,说明两个品种的线性组合长期稳定。价差偏离后,总会回归。这就是套利的基础。

我个人的习惯是,p值要小于0.05才认为存在协整关系。但要注意,样本量不同,临界值也不同。Engle-Granger方法用的临界值比标准ADF检验更严格,因为残差是估计出来的,不是真实数据。

实战技巧:我在做协整检验时,会同时跑多个时间窗口。比如1年、6个月、3个月。如果所有窗口都显示协整,这个组合就比较靠谱。如果只有短期窗口协整,那可能是数据挖掘的假象。

4.4 知识体系总览

下面这张图,把本章的核心逻辑串起来了:

相关性分析知识体系 跨品种关系分析 皮尔逊相关系数 衡量线性关系 对异常值敏感 斯皮尔曼秩相关系数 衡量单调关系 对异常值不敏感 协整检验 Engle-Granger两步法 残差平稳性检验 结论:相关系数高 ≠ 可套利,协整才是关键

4.5 实战中的选择策略

说了这么多,到底怎么选?我总结了一个简单的决策流程:

  1. 先算皮尔逊:如果绝对值大于0.7,说明线性关系强,可以进一步做协整检验。
  2. 再算斯皮尔曼:如果皮尔逊低但斯皮尔曼高,说明存在非线性关系,同样值得做协整检验。
  3. 两个都低:别浪费时间了,换品种吧。
  4. 协整检验通过:恭喜,找到了潜在的套利组合。

重要提醒:协整关系不是一成不变的。我见过一个组合,协整关系维持了两年,突然某天就断了。原因可能是市场结构变了,或者政策调整了。所以,定期重新检验协整关系,这是风控的基本要求。

好了,相关性分析这块就讲到这里。记住,工具是死的,人是活的。皮尔逊、斯皮尔曼、协整检验,这三个工具配合使用,才能找到真正靠谱的套利组合。

专注资料整理