2. 平稳性概念:理解时间序列的平稳性,为什么协整需要平稳性?

各位同学,咱们今天聊一个在统计套利里绕不开的核心概念——平稳性

说实话,我刚开始做量化那会儿,觉得平稳性就是个数学定义,背下来就完事了。直到有一次,我用两组看起来高度相关的价格序列做配对交易,回测曲线漂亮得不行,结果实盘一跑,亏得我头皮发麻。后来一查,问题就出在平稳性上。

所以,今天咱们把这块彻底讲透。

2.1 什么是平稳性?

平稳性,说白了就是一个时间序列的统计性质不随时间变化。

你想想看,如果一组数据的均值、方差、自协方差这些指标,今天和明天、今年和明年都差不多,那它就是平稳的。反之,如果这些指标随着时间飘来飘去,那就是非平稳的。

举个例子:

  • 白噪声:完全随机,均值恒为0,方差恒定——这是最典型的平稳序列。
  • 随机游走:今天的价格 = 昨天的价格 + 随机扰动。它的方差会随时间越变越大——这是典型的非平稳序列。

我个人习惯把平稳性分成两种:

类型 定义 实际意义
严平稳 所有统计性质(联合分布)都不随时间变化 太严格,现实中几乎不存在
弱平稳 均值、方差恒定,自协方差只与时间间隔有关 够用了,我们平时说的平稳都指这个
我的经验:做统计套利时,我们只关心弱平稳。别被「严平稳」吓到,那玩意儿在金融数据里基本见不着。

2.2 为什么协整需要平稳性?

好,现在进入关键问题:协整和平稳性到底什么关系?

我直接说结论:协整的本质,就是让两个非平稳序列的线性组合变成平稳序列。

你想想看,我们做配对交易,找的是两只股票的价格差。如果这个价差是非平稳的,它会越飘越远,永远不会回归均值——那你还怎么交易?

所以,协整检验就是在验证一件事:这个价差序列是不是平稳的?

我曾经踩过一个坑:用两组看起来走势高度一致的股票做配对,相关系数高达0.95。结果协整检验没通过,我不信邪,硬着头皮上了。结果价差从2块钱一路飘到15块钱,亏得我怀疑人生。

后来我才明白:相关性 ≠ 协整性。两只股票可以高度相关,但它们的价差可能是非平稳的。只有协整关系才能保证价差会回归均值。

避坑指南:千万不要用相关系数代替协整检验!我见过太多人在这上面栽跟头。相关系数高只能说明走势像,不能说明价差会回归。

2.3 如何判断平稳性?

判断平稳性,常用的方法有两种:

2.3.1 肉眼观察法

把序列画出来,看看有没有明显的趋势、季节性、波动率变化。如果有,大概率是非平稳的。

但说实话,肉眼观察只能作为初步判断。我见过一些序列,看起来挺平稳的,结果一检验发现是非平稳的。所以,还是得靠统计检验。

2.3.2 单位根检验

最常用的是ADF检验(Augmented Dickey-Fuller Test)。

它的逻辑很简单:

  • 原假设 H₀:序列存在单位根(非平稳)
  • 备择假设 H₁:序列不存在单位根(平稳)

如果p值小于0.05,就拒绝原假设,认为序列是平稳的。

下面是我常用的代码模板:

import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller

def check_stationarity(series, name=''):
    result = adfuller(series.dropna())
    print(f'{name} ADF检验结果:')
    print(f'ADF统计量: {result[0]:.4f}')
    print(f'p值: {result[1]:.4f}')
    print(f'临界值:')
    for key, value in result[4].items():
        print(f'  {key}: {value:.4f}')
    
    if result[1] < 0.05:
        print('结论:序列平稳 ✓')
    else:
        print('结论:序列非平稳 ✗')
    print('-' * 40)

# 使用示例
check_stationarity(price_spread, '价差序列')
重要提醒:ADF检验对滞后阶数的选择比较敏感。我一般用AIC准则自动选择滞后阶数,代码里加个参数 autolag='AIC' 就行。

2.4 平稳性与协整的关系图

为了让你更直观地理解,我画了一张图:

平稳性与协整的关系 非平稳序列 均值/方差随时间变化 例如:股票价格、指数 有趋势、随机游走 平稳序列 均值/方差恒定 例如:收益率、价差 围绕均值波动 协整关系 核心逻辑 • 两个非平稳序列(如股票A和股票B)各自都不平稳 • 但它们的线性组合(价差)可能是平稳的 • 这个「线性组合平稳」就是协整关系 图:平稳性与协整的关系示意图

2.5 一个实战案例

我记得有一次做美股配对交易,选了可口可乐(KO)和百事可乐(PEP)。

先看它们各自的价格序列:

  • KO:非平稳(有长期上涨趋势)
  • PEP:非平稳(也有长期上涨趋势)

然后做协整检验:

from statsmodels.tsa.stattools import coint

# 假设 ko_price 和 pep_price 是价格序列
score, pvalue, _ = coint(ko_price, pep_price)
print(f'协整检验p值: {pvalue:.4f}')

if pvalue < 0.05:
    print('存在协整关系,可以做配对交易')
else:
    print('不存在协整关系,放弃这个配对')

如果p值小于0.05,说明价差是平稳的,可以放心做配对交易。否则,就算走势再像,也别碰。

我的习惯:做协整检验时,我会同时看ADF检验和Johansen检验。两个都通过了,我才敢上实盘。多一层验证,少一分风险。

2.6 总结一下

平稳性这个概念,说白了就是「数据是不是靠谱的」。非平稳的数据就像没拴绳的狗,到处乱跑;平稳的数据就像拴在院子里的狗,跑不出那个圈。

协整要的就是这个「圈」——让两个乱跑的序列,组合起来变成有圈可循的序列。这样我们才能做均值回归策略,才能赚钱。

嗯,今天就聊到这儿。记住一句话:没有平稳性,就没有协整;没有协整,就没有统计套利。


专注资料整理