3、单整阶数确定:如何判断两个时间序列是否为同阶单整?I(1)与I(0)的实战意义

做协整分析,第一步不是跑回归,而是先搞清楚你的序列是几阶单整。说白了,就是看看这两个时间序列是不是「同一级别」的选手。如果一个是I(1),另一个是I(0),那它们之间就不可能存在协整关系——这是协整分析的基本门槛。

我记得刚入行那会儿,有个同事拿了两组数据直接跑Johansen检验,结果出来一堆伪回归。我一看,一个序列是股价对数,另一个是成交量,单整阶数都不一样。嗯,这就是典型的「先开枪后瞄准」。

3.1 什么是单整阶数?

单整阶数,记作I(d),表示一个时间序列需要差分d次才能变成平稳序列。

  • I(0):序列本身就是平稳的。均值、方差不随时间变化。
  • I(1):序列本身不平稳,但一阶差分后变成平稳序列。
  • I(2):需要差分两次才能平稳。这种情况在金融数据里比较少见。

你想想看,股票价格通常就是I(1)的典型代表。今天的价格和昨天的价格高度相关,但今天的收益率(价格的一阶差分)基本就是白噪声了。

核心原则:协整分析要求两个序列必须是同阶单整。如果一个是I(1),另一个是I(0),那它们之间不可能存在长期均衡关系。

3.2 如何判断单整阶数?

我个人习惯用两种方法交叉验证:ADF检验和KPSS检验。为什么用两个?因为单个检验的统计功效有限,容易误判。

3.2.1 ADF检验(单位根检验)

ADF检验的原假设是「序列存在单位根」,也就是非平稳。如果p值小于0.05,拒绝原假设,认为序列平稳。

from statsmodels.tsa.stattools import adfuller

# 对原始序列做ADF检验
result_price = adfuller(price_series)
print(f'原始序列ADF统计量: {result_price[0]:.4f}')
print(f'p值: {result_price[4]:.4f}')

# 对一阶差分序列做ADF检验
diff_series = price_series.diff().dropna()
result_diff = adfuller(diff_series)
print(f'一阶差分ADF统计量: {result_diff[0]:.4f}')
print(f'p值: {result_diff[4]:.4f}')

我在项目中遇到过这样的情况:原始序列的p值是0.32,明显不平稳。一阶差分后p值变成0.001,平稳了。那这个序列就是I(1)。

3.2.2 KPSS检验(平稳性检验)

KPSS检验的原假设正好相反——「序列是平稳的」。如果p值小于0.05,拒绝原假设,认为序列非平稳。

from statsmodels.tsa.stattools import kpss

# KPSS检验
result_kpss = kpss(price_series, regression='c')
print(f'KPSS统计量: {result_kpss[0]:.4f}')
print(f'p值: {result_kpss[1]:.4f}')
实战技巧:我建议同时使用ADF和KPSS。如果ADF说非平稳、KPSS也说非平稳,那基本确定是I(1)或更高阶。如果ADF说平稳、KPSS也说平稳,那就是I(0)。如果两个检验结果矛盾,需要进一步分析。

3.3 I(1)与I(0)的实战意义

搞清楚了单整阶数,我们来看看它在实际交易中意味着什么。

序列类型 实战特征 交易含义
I(0) 序列 均值回归,围绕固定均值波动 可以直接做均值回归策略,比如布林带
I(1) 序列 随机游走,没有固定均值 不能单独做均值回归,但可以配对交易
两个I(1)序列 各自随机游走,但可能存在共同趋势 协整配对交易的核心标的

说白了,I(1)序列就像喝醉了酒的人,走路东倒西歪没有固定方向。但如果你把两个醉汉绑在一起,他们反而可能走得稳——这就是协整的精髓。

避坑指南:我曾经犯过一个错误——用I(1)和I(0)的序列做回归,结果R²很高,但其实是伪回归。后来我养成了一个习惯:在做任何协整分析之前,先跑一遍单整阶数检验,确保两个序列是「同一级别」的。

3.4 单整阶数判断流程

下面是我在实际项目中使用的判断流程,画成了一张图,方便你理解。

单整阶数判断流程图 获取时间序列 ADF检验:原假设H0=存在单位根 p值 < 0.05? 序列平稳 I(0) 序列非平稳 一阶差分 再次ADF检验 p值 < 0.05? 序列为 I(1) 需要更高阶差分

3.5 实战中的注意事项

最后,分享几个我在实战中总结的经验:

  1. 样本量要够:ADF检验对样本量敏感,少于50个数据点的话,检验结果不太可靠。我一般要求至少100个数据点。
  2. 滞后阶数要选对:ADF检验需要指定滞后阶数,用AIC或BIC准则自动选择比较靠谱。
  3. 趋势项要判断:序列有趋势的话,ADF检验要包含常数项和趋势项。我习惯先用肉眼看一下序列图,再决定检验形式。
  4. 不要只看一个检验:ADF和KPSS结合使用,能大大降低误判概率。
一个小技巧:如果你不确定两个序列是否同阶单整,可以先对它们分别做ADF检验。如果都是I(1),那就可以放心做协整分析了。如果一个是I(1)另一个是I(0),那就别浪费时间了——它们不可能协整。

嗯,单整阶数确定这一步看似基础,但恰恰是很多量化交易者容易忽略的环节。我见过太多人跳过这一步直接跑协整,结果回测漂亮、实盘亏钱。记住:基础不牢,地动山摇。