4、配对选择与相关性分析:相关性计算(Pearson/Spearman)、协整检验流程、配对筛选标准、常见配对案例

做跨品种套利,第一步不是写代码,也不是搭回测框架。

第一步是找到能一起玩的品种。

说白了,你得先确认两个品种之间确实存在某种“默契”。它们价格走势是不是同向?偏离后会不会回归?这些问题的答案,就藏在相关性分析和协整检验里。我个人习惯,把这套流程叫做“配对四步法”,今天咱们就把它拆开揉碎了讲清楚。

4.1 相关性计算:Pearson 与 Spearman

相关性是最直观的指标。它告诉你两个品种的走势有多“像”。

但这里有个坑——相关性不等于因果性,更不等于套利机会。我在项目中遇到过好几次,两个品种相关性高达0.95,但一进场就亏钱。为什么?因为相关性会变,而且它不保证价差会回归。

4.1.1 Pearson 相关系数

Pearson 衡量的是线性相关。公式很简单:

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

取值范围在 -1 到 1 之间。1 表示完全正相关,-1 表示完全负相关,0 表示无线性关系。

用 Python 计算也很直接:

import numpy as np
import pandas as pd

# 假设 df 包含两个品种的收盘价
pearson_corr = df['品种A'].corr(df['品种B'])
print(f'Pearson 相关系数: {pearson_corr:.4f}')

嗯,这里要注意:Pearson 对异常值非常敏感。如果数据里有一个极端值,相关系数可能瞬间从 0.9 掉到 0.3。你想想看,这在实际交易中意味着什么?可能一个黑天鹅事件,就让你以为的“完美配对”彻底失效。

4.1.2 Spearman 秩相关系数

Spearman 不关心具体数值,它只关心排名。说白了,它看的是两个品种的“相对强弱”是否一致。

公式是基于排名的 Pearson:

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

其中 d 是每个数据点的排名差。

代码实现:

spearman_corr = df['品种A'].corr(df['品种B'], method='spearman')
print(f'Spearman 相关系数: {spearman_corr:.4f}')

我个人更偏爱 Spearman。为什么?因为它稳健。我在处理股指期货和 ETF 配对时,经常遇到数据有跳空或异常波动,Spearman 基本不受影响。如果你发现 Pearson 和 Spearman 的结果差异很大,那就要警惕了——很可能数据里有非线性关系或异常值。

我的经验: 先算 Spearman,再算 Pearson。如果两者接近,说明线性关系占主导;如果差异大,考虑用 Spearman 作为主要参考,或者对数据进行预处理。

4.2 协整检验流程

相关性高不代表能套利。真正决定套利可行性的,是协整关系。

协整检验,说白了就是看两个品种的价差是否“平稳”。如果价差围绕一个均值波动,那就有回归的倾向——这就是套利的基础。

4.2.1 什么是协整?

两个非平稳的时间序列,如果它们的线性组合是平稳的,就称它们具有协整关系。

举个例子:

  • 品种 A 和品种 B 各自都是随机游走(非平稳)
  • 但 A - β * B 是平稳的(均值回归)
  • 那么 A 和 B 就是协整的

这个 β 就是对冲比率。你想想看,如果价差偏离了均值,迟早会回来——这就是我们赚钱的机会。

4.2.2 Engle-Granger 两步法

这是最经典的协整检验方法。流程如下:

  1. 第一步: 用 OLS 回归估计对冲比率 β
  2. 第二步: 对残差进行单位根检验(ADF 检验)

代码实现:

import statsmodels.api as sm

# 第一步:OLS 回归
X = sm.add_constant(df['品种B'])
model = sm.OLS(df['品种A'], X)
results = model.fit()
beta = results.params['品种B']
residuals = results.resid

# 第二步:ADF 检验
from statsmodels.tsa.stattools import adfuller
adf_result = adfuller(residuals, autolag='AIC')
p_value = adf_result[1]

print(f'对冲比率 β: {beta:.4f}')
print(f'ADF p-value: {p_value:.4f}')

if p_value < 0.05:
    print('残差平稳,存在协整关系')
else:
    print('残差不平稳,不存在协整关系')
注意: ADF 检验的临界值需要查表。statsmodels 已经提供了 p-value,但如果你用其他语言实现,记得用 MacKinnon 临界值表。我曾经因为用错了临界值,白白浪费了一周时间。

4.2.3 Johansen 检验

Engle-Granger 只能检验一对品种。如果你有多个品种,或者想检验多个协整关系,就用 Johansen 检验。

代码示例:

from statsmodels.tsa.vector_ar.vecm import coint_johansen

# 假设 df 包含多个品种的收盘价
johansen_result = coint_johansen(df, det_order=0, k_ar_diff=1)
trace_stat = johansen_result.lr1
crit_values = johansen_result.cvt

print('Trace 统计量:', trace_stat)
print('95% 临界值:', crit_values[:, 1])

Johansen 检验会给出多个协整向量的检验结果。我个人习惯,先用 Engle-Granger 快速筛选,再用 Johansen 做最终确认。

4.3 配对筛选标准

有了相关性分析和协整检验,我们还需要一套筛选标准。不然的话,面对几百个品种,你根本无从下手。

我总结了一套“三筛法”:

筛选步骤 指标 阈值 说明
第一筛 Spearman 相关系数 |ρ| > 0.7 排除弱相关品种
第二筛 ADF p-value < 0.05 确认协整关系
第三筛 半衰期 5-30 天 回归速度适中

半衰期怎么算?很简单:

# 对残差做自回归
lag_residuals = residuals.shift(1).dropna()
residuals_diff = residuals.diff().dropna()

model = sm.OLS(residuals_diff, lag_residuals)
results = model.fit()
theta = results.params[0]

half_life = -np.log(2) / theta
print(f'半衰期: {half_life:.2f} 天')

半衰期太短(< 5 天),交易成本太高;太长(> 30 天),资金占用太久。我个人偏好 10-20 天的半衰期,这样既能捕捉到回归机会,又不会频繁交易。

核心原则: 相关性高 + 协整显著 + 半衰期适中 = 优质配对。缺一不可。

4.4 常见配对案例

理论讲完了,咱们看看实战中哪些配对比较靠谱。

4.4.1 股指期货与 ETF

这是最经典的配对。比如:

  • 沪深300股指期货(IF)与 沪深300ETF(510300)
  • 中证500股指期货(IC)与 中证500ETF(510500)

逻辑很简单:期货和 ETF 跟踪同一个指数,价差理论上应该围绕基差波动。我在 2020 年做过这个配对,半衰期大概 8-12 天,年化收益能做到 8%-12%。

4.4.2 跨品种商品期货

比如:

  • 螺纹钢(RB)与 热轧卷板(HC)
  • 豆粕(M)与 菜粕(RM)
  • 黄金(AU)与 白银(AG)

这些品种在产业链上有关联,价格走势有天然的联动性。但要注意:商品期货有交割月限制,换月时价差会剧烈波动。我曾经在螺纹钢和热卷的配对中吃过亏,就是因为换月时没处理好。

4.4.3 加密货币配对

如果你做数字货币,可以考虑:

  • BTC 与 ETH
  • BTC 永续合约 与 BTC 季度合约

加密货币市场 24 小时交易,波动大,套利机会多。但风险也大——流动性风险、交易所风险、政策风险。嗯,这里要提醒一句:别把所有资金都押在一个交易所上。

我的建议: 刚开始做配对套利,先从股指期货和 ETF 入手。流动性好,数据干净,回测也容易。等跑通了流程,再考虑商品期货和加密货币。

4.5 本章小结

配对选择是套利策略的基石。相关性分析帮你找到“看起来像”的品种,协整检验帮你确认“真的能回归”,筛选标准帮你过滤掉“不靠谱”的配对。

我个人习惯,每周跑一次全市场扫描,更新配对列表。市场在变,配对关系也在变。别指望一个配对能永远有效。

最后,送你一句话:好的配对是成功的一半,另一半是执行和风控。


公众号:蓝海资料掘金营,微信deep3321