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 协整对的筛选

现在问题来了:市场上几千只股票,两两组合可能有几百万个对子。你总不能一个个去检验吧?

所以,筛选协整对需要一套流程。我一般分三步走:

  1. 粗筛:用相关系数或距离法,先选出走势相似的候选对。比如相关系数 > 0.8 的保留。
  2. 精筛:对候选对做Engle-Granger检验,保留p值 < 0.05 的对子。
  3. 验证:用样本外数据回测,看价差是否真的均值回归。

我的经验:粗筛阶段别用太严格的阈值。我一般设相关系数 > 0.7,先保留几百个对子。因为有些对子虽然相关系数不高,但协整关系反而很好。你想想看,两只股票走势不完全同步,但价差稳定,这不正是套利的机会吗?

另外,筛选时还要考虑实际交易成本。我曾经筛出一个协整关系特别好的对子,结果一算,两只股票的交易成本加起来占了预期收益的一半,根本没法做。

所以,我建议在筛选阶段就加入以下约束:

筛选条件 说明 我的常用阈值
协整p值 Engle-Granger检验的显著性 < 0.05
半衰期 价差回归均值所需时间 5-20个交易日
交易成本 双边交易成本占预期收益比例 < 30%
样本外表现 回测夏普比率 > 1.5

半衰期这个指标,很多人会忽略。说白了,如果价差偏离后要半年才能回归,你还做不做?资金成本都耗死了。我一般要求半衰期在5到20个交易日之间,太短了信号太频繁,太长了等不起。

再提醒一句:协整关系是会变的!我见过一个对子,前两年协整关系特别好,第三年突然就崩了。所以,建议每个月重新检验一次协整关系,别一套参数用到底。

知识体系总览

下面这张图,是我自己梳理的协整检验全流程。你可以把它当作操作手册来用:

协整检验全流程 数据准备 价格序列、对数收益率 ADF平稳性检验 判断单整阶数 I(0)/I(1) EG两步法 OLS回归→残差ADF 是(协整) 否(放弃) 协整对筛选 半衰期 5-20天 | 交易成本 < 30% 样本外夏普 > 1.5 | 月度重检 生成交易信号 价差偏离 > 2σ → 开仓

这张图把整个流程串起来了。你从数据准备开始,一路走到生成交易信号,每一步都有明确的判断标准。我个人建议你把这张图打印出来贴在工位上,做回测时对照着看,不容易漏步骤。

好了,协整检验这部分就讲到这里。记住一句话:没有协整,就没有套利。 别嫌麻烦,这一步做扎实了,后面的交易信号才有意义。


本章要点回顾:

  • ADF检验用于判断序列是否平稳,注意滞后阶数选择和结构性断点
  • Engle-Granger两步法:先回归求残差,再检验残差平稳性
  • 筛选协整对要综合考虑p值、半衰期、交易成本和样本外表现
  • 协整关系会随时间变化,建议月度重检

专注资料整理