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 知识体系总览
下面这张图,把本章的核心逻辑串起来了:
4.5 实战中的选择策略
说了这么多,到底怎么选?我总结了一个简单的决策流程:
- 先算皮尔逊:如果绝对值大于0.7,说明线性关系强,可以进一步做协整检验。
- 再算斯皮尔曼:如果皮尔逊低但斯皮尔曼高,说明存在非线性关系,同样值得做协整检验。
- 两个都低:别浪费时间了,换品种吧。
- 协整检验通过:恭喜,找到了潜在的套利组合。
重要提醒:协整关系不是一成不变的。我见过一个组合,协整关系维持了两年,突然某天就断了。原因可能是市场结构变了,或者政策调整了。所以,定期重新检验协整关系,这是风控的基本要求。
好了,相关性分析这块就讲到这里。记住,工具是死的,人是活的。皮尔逊、斯皮尔曼、协整检验,这三个工具配合使用,才能找到真正靠谱的套利组合。