套利品种选择:相关性分析、协整检验、平稳性检验、套利对筛选流程
做跨品种套利,第一步不是写代码,而是选品种。这一步要是选错了,后面模型再漂亮也是白搭。我见过太多人一上来就搞机器学习,结果品种之间压根没有稳定关系,模型学出来的全是噪音。今天咱们就把这套筛选流程掰开揉碎讲清楚。
一、相关性分析——先看有没有“关系”
相关性分析是最直观的第一步。说白了,就是看看两个品种的价格走势是不是“步调一致”。
我个人习惯用皮尔逊相关系数,取值范围在-1到1之间。正相关意味着同涨同跌,负相关就是反向走。做套利嘛,我们通常找正相关的品种,而且相关系数最好在0.7以上。
关键点:相关性不等于因果关系。两个品种可能因为共同受到某个宏观因素影响而表现出高相关,但这不代表它们之间有稳定的套利关系。
我在项目中遇到过这样的情况:螺纹钢和热卷的相关系数高达0.95,看起来完美。但后来发现,这是因为它们都受铁矿石价格驱动,一旦铁矿石出现异常波动,两者的价差就会变得极不稳定。所以相关性只是第一道筛子,不能作为唯一依据。
二、平稳性检验——别让“假关系”骗了你
为什么要做平稳性检验?你想想看,如果两个品种的价格序列都是随机游走的,那它们偶尔表现出相关性纯粹是巧合。用这种数据做套利,跟赌博没什么区别。
常用的方法是ADF检验(Augmented Dickey-Fuller Test)。原假设是序列存在单位根,也就是不平稳。如果p值小于0.05,我们就拒绝原假设,认为序列是平稳的。
from statsmodels.tsa.stattools import adfuller
def check_stationarity(series, name):
result = adfuller(series.dropna())
print(f'{name} ADF Statistic: {result[0]:.4f}')
print(f'{name} p-value: {result[1]:.4f}')
if result[1] < 0.05:
print(f'→ {name} 是平稳序列')
else:
print(f'→ {name} 不是平稳序列')
嗯,这里要注意:大多数金融时间序列在原始价格层面都是非平稳的。所以我们通常对对数价格或者收益率做检验。我个人习惯先取对数,再差分,这样既能消除异方差,又能让序列变得平稳。
小技巧:如果原始序列不平稳,别急着放弃。试试一阶差分,很多金融序列在一阶差分后就是平稳的。这就是所谓的I(1)过程。
三、协整检验——找到真正的“长期伴侣”
协整检验才是套利品种选择的核心。两个非平稳序列,如果它们的线性组合是平稳的,那它们就存在协整关系。说白了,就是它们虽然各自乱跑,但始终会回到某个均衡关系附近。
我最常用的是Engle-Granger两步法:
- 第一步:用OLS回归估计两个品种的长期均衡关系
- 第二步:对回归残差做ADF检验,看残差是否平稳
import statsmodels.api as sm
def cointegration_test(y, x):
# 第一步:OLS回归
x_const = sm.add_constant(x)
model = sm.OLS(y, x_const).fit()
residuals = model.resid
# 第二步:对残差做ADF检验
adf_result = adfuller(residuals.dropna())
print(f'残差ADF p-value: {adf_result[1]:.4f}')
if adf_result[1] < 0.05:
print('→ 存在协整关系!')
print(f'→ 对冲比率: {model.params[1]:.4f}')
else:
print('→ 不存在协整关系')
return model, residuals
我曾经踩过一个坑:用日线数据做协整检验,结果发现p值0.01,以为找到了黄金组合。结果换到小时线上一测,p值变成了0.3。后来我才意识到,协整关系对时间频率很敏感。我的建议是:先用日线做初筛,再用你实际交易的时间频率做验证。
避坑指南:协整检验对样本长度有要求。太短的数据(比如少于100个交易日)检验结果不可靠。我一般至少用1年的日线数据,也就是250个交易日左右。
四、套利对筛选流程——从理论到实战
好了,前面讲了各种检验方法,现在咱们把它们串成一个完整的筛选流程。这是我个人在实战中反复打磨出来的框架:
四步筛选法:
- 初筛:基于基本面逻辑,选出可能存在套利关系的品种对。比如螺纹钢和热卷、豆粕和菜粕、IF和IC等。
- 相关性过滤:计算滚动相关系数,剔除相关系数低于0.7的对子。
- 协整检验:对通过相关性过滤的对子做Engle-Granger检验,保留p值小于0.05的对子。
- 回测验证:用历史数据模拟套利策略,看夏普比率、最大回撤等指标是否达标。
下面这张图展示了完整的筛选流程:
这个流程看起来简单,但每个环节都有坑。我举个例子:在相关性分析这一步,很多人直接用全样本计算一个相关系数。但金融市场的相关性是时变的,去年0.9,今年可能变成0.3。所以我建议用滚动窗口计算相关系数,看看稳定性如何。
实战建议:滚动窗口的长度一般设为60-120个交易日。如果相关系数的标准差超过0.15,说明这对品种的关系不稳定,建议放弃。
五、一个完整的筛选案例
咱们用螺纹钢(RB)和热卷(HC)来演示一下。这是国内商品期货市场最经典的套利对之一。
| 步骤 | 操作 | 结果 |
|---|---|---|
| 1. 基本面 | 两者都是钢材,生产工艺相近,下游需求重叠度高 | 通过 |
| 2. 相关性 | 滚动60日相关系数均值0.85,标准差0.08 | 通过 |
| 3. 协整检验 | Engle-Granger检验p值0.003,残差平稳 | 通过 |
| 4. 回测验证 | 年化收益12.3%,夏普比率1.8,最大回撤4.5% | 通过 |
你看,经过四步筛选,RB-HC这个对子各项指标都不错。但我要提醒你:回测表现好不代表未来一定好。我见过太多人在回测里赚得盆满钵满,实盘一跑就亏。原因往往是数据窥探偏差或者过拟合。
重要提醒:筛选流程中每一步的阈值(比如相关系数0.7、p值0.05)都是可以调整的。但调整的时候要小心,别为了得到好看的筛选结果而刻意放宽标准。我个人的原则是:宁可漏掉几个潜在机会,也不要放进来一堆假信号。
好了,以上就是套利品种选择的完整流程。从相关性分析到协整检验,再到最终的筛选框架,每一步都有它的道理。做量化交易,最怕的就是用复杂的模型去拟合垃圾数据。把品种选好了,后面的工作才能事半功倍。
公众号:蓝海资料掘金营,微信deep3321