4、协整检验:平稳性检验(ADF检验)、协整关系检验(Engle-Granger两步法)、协整对的筛选
好,咱们接着聊套利交易的核心环节——协整检验。
说实话,很多新手做配对交易,上来就找两只走势差不多的股票,直接开干。结果呢?大概率是亏钱的。为什么?因为两只股票看着像,但它们的价差可能根本不稳定,说白了就是没有协整关系。
我个人习惯把协整检验比作「婚姻登记」——两只时间序列能不能长期在一起过日子,得先做个体检,再办个证。今天我就带你走完这套流程。
核心逻辑:协整 ≠ 相关。两只股票走势高度相关,不代表它们的价差会均值回归。只有协整关系才能保证价差长期稳定,这才是套利的基础。
4.1 平稳性检验(ADF检验)
先问个问题:为什么非要检验平稳性?
你想想看,如果一只股票的价格像火箭一样一直往上窜,另一只像过山车一样上蹿下跳,它们的价差能稳定吗?显然不能。平稳性检验,就是看时间序列的统计特性(均值、方差)是不是随时间变化。
ADF检验(Augmented Dickey-Fuller Test) 是最常用的单位根检验方法。它的原假设是:序列存在单位根(即非平稳)。
我记得刚入行时,有个老交易员跟我说:「ADF的p值小于0.05,你才能放心。」后来我自己踩过坑才发现,光看p值还不够,还得看检验统计量跟临界值的对比。
我的小技巧:实际项目中,我一般把显著性水平设到0.01。宁可漏掉一些假信号,也别被伪回归坑了。毕竟套利交易亏一次,可能把前面十次的利润都吐回去。
代码实现其实不复杂,Python里直接用 statsmodels 库:
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}')
print(f'Critical Values:')
for key, value in result[4].items():
print(f' {key}: {value:.4f}')
if result[1] < 0.05:
print(f'→ {name} 是平稳的')
else:
print(f'→ {name} 非平稳,需要差分')
这里要注意:ADF检验对滞后阶数的选择很敏感。我一般用AIC准则自动选滞后阶数,别手动瞎填。
避坑指南:我曾经在某个品种上,用默认的滞后阶数检验出平稳,换了滞后阶数后就不平稳了。后来发现是数据里有结构性断点。所以,ADF检验前,先画个图看看数据有没有明显的趋势突变。
4.2 协整关系检验(Engle-Granger两步法)
好,现在每只股票都检验完了,发现它们都是一阶单整(I(1))的。接下来怎么办?
Engle-Granger两步法,说白了就是「先回归,再检验残差」。
第一步:用OLS回归估计协整系数。
假设我们要检验股票A和股票B是否协整,就做回归:
A_t = α + β * B_t + ε_t
这里的β就是对冲比率。我习惯用这个β来构建价差序列:spread = A - β * B。
第二步:对残差序列ε_t做ADF检验。
如果残差是平稳的,就说明A和B存在协整关系。注意,这里检验残差时,要用专门的临界值表(MacKinnon临界值),不能用普通的ADF临界值。因为残差是从回归中估计出来的,自由度有损失。
关键点:Engle-Granger两步法有个隐含假设——协整关系是唯一的。如果存在多个协整向量,这个方法就不太灵了。不过对于配对交易,我们一般只考虑两只股票,所以问题不大。
代码实现:
import statsmodels.api as sm
def engle_granger_test(y, x):
# 第一步:OLS回归
x_const = sm.add_constant(x)
model = sm.OLS(y, x_const).fit()
beta = model.params[1]
alpha = model.params[0]
residuals = model.resid
# 第二步:残差ADF检验
adf_result = adfuller(residuals, maxlag=1, autolag='AIC')
return {
'alpha': alpha,
'beta': beta,
'adf_stat': adf_result[0],
'p_value': adf_result[1],
'critical_values': adf_result[4]
}
嗯,这里有个细节:回归时要不要加常数项?我个人习惯加。不加常数项的话,万一两只股票有固定的价差偏移,你就检测不出来了。
4.3 协整对的筛选
现在问题来了:市场上几千只股票,两两组合可能有几百万个对子。你总不能一个个去检验吧?
所以,筛选协整对需要一套流程。我一般分三步走:
- 粗筛:用相关系数或距离法,先选出走势相似的候选对。比如相关系数 > 0.8 的保留。
- 精筛:对候选对做Engle-Granger检验,保留p值 < 0.05 的对子。
- 验证:用样本外数据回测,看价差是否真的均值回归。
我的经验:粗筛阶段别用太严格的阈值。我一般设相关系数 > 0.7,先保留几百个对子。因为有些对子虽然相关系数不高,但协整关系反而很好。你想想看,两只股票走势不完全同步,但价差稳定,这不正是套利的机会吗?
另外,筛选时还要考虑实际交易成本。我曾经筛出一个协整关系特别好的对子,结果一算,两只股票的交易成本加起来占了预期收益的一半,根本没法做。
所以,我建议在筛选阶段就加入以下约束:
| 筛选条件 | 说明 | 我的常用阈值 |
|---|---|---|
| 协整p值 | Engle-Granger检验的显著性 | < 0.05 |
| 半衰期 | 价差回归均值所需时间 | 5-20个交易日 |
| 交易成本 | 双边交易成本占预期收益比例 | < 30% |
| 样本外表现 | 回测夏普比率 | > 1.5 |
半衰期这个指标,很多人会忽略。说白了,如果价差偏离后要半年才能回归,你还做不做?资金成本都耗死了。我一般要求半衰期在5到20个交易日之间,太短了信号太频繁,太长了等不起。
再提醒一句:协整关系是会变的!我见过一个对子,前两年协整关系特别好,第三年突然就崩了。所以,建议每个月重新检验一次协整关系,别一套参数用到底。
知识体系总览
下面这张图,是我自己梳理的协整检验全流程。你可以把它当作操作手册来用:
这张图把整个流程串起来了。你从数据准备开始,一路走到生成交易信号,每一步都有明确的判断标准。我个人建议你把这张图打印出来贴在工位上,做回测时对照着看,不容易漏步骤。
好了,协整检验这部分就讲到这里。记住一句话:没有协整,就没有套利。 别嫌麻烦,这一步做扎实了,后面的交易信号才有意义。
本章要点回顾:
- ADF检验用于判断序列是否平稳,注意滞后阶数选择和结构性断点
- Engle-Granger两步法:先回归求残差,再检验残差平稳性
- 筛选协整对要综合考虑p值、半衰期、交易成本和样本外表现
- 协整关系会随时间变化,建议月度重检