3、单整阶数确定:如何判断时间序列是I(0)、I(1)还是I(2)?实战中常见的陷阱。
好,咱们进入协整建模最基础、也最容易翻车的一步——单整阶数确定。
说白了,就是搞清楚你的时间序列到底“稳不稳”,以及它需要差分几次才能变稳。是 I(0)、I(1) 还是 I(2)?这一步错了,后面所有的协整检验都是白搭。我见过太多人,上来就做 Johansen 检验,结果全是错的,回头一看,序列阶数压根没搞对。
3.1 为什么单整阶数这么重要?
协整的前提是:所有序列必须是同阶单整的。比如两个 I(1) 序列可以协整,一个 I(1) 和一个 I(2) 就不行。你想想看,如果两个序列的“随机游走强度”都不一样,它们怎么可能长期稳定地走在一起?
我个人习惯,拿到数据第一件事不是建模,而是先画图、做单位根检验,把每个序列的阶数标清楚。这一步花的时间,往往能省下后面三天调试模型的时间。
3.2 如何判断?—— 单位根检验 + 差分检验
判断单整阶数,标准流程就三步:
- 对原序列做单位根检验(ADF、PP、KPSS 等)。如果拒绝单位根假设,说明是 I(0)。
- 如果不平稳,对一阶差分序列做单位根检验。如果一阶差分平稳,说明是 I(1)。
- 如果一阶差分还不平稳,对二阶差分做检验。如果二阶差分平稳,说明是 I(2)。
嗯,这里要注意:不要只依赖一种检验方法。ADF 检验的势(power)有限,尤其是样本量小的时候。我建议至少用 ADF 和 KPSS 两种方法交叉验证。ADF 的原假设是“有单位根”,KPSS 的原假设是“平稳”。如果两个都拒绝原假设,那就要小心了——可能序列有结构突变。
来看一段 Python 代码,我习惯封装成一个函数:
import pandas as pd
import numpy as np
from statsmodels.tsa.stattools import adfuller, kpss
def check_integration_order(series, max_order=2, alpha=0.05):
"""
判断时间序列的单整阶数
返回: (阶数, 各阶差分检验结果字典)
"""
results = {}
for d in range(max_order + 1):
if d == 0:
data = series.dropna()
else:
data = series.diff(d).dropna()
# ADF 检验
adf_stat, adf_pval, _, _, adf_crit, _ = adfuller(data, autolag='AIC')
# KPSS 检验
kpss_stat, kpss_pval, _, _ = kpss(data, regression='c', nlags='auto')
results[d] = {
'adf_pval': adf_pval,
'kpss_pval': kpss_pval,
'is_stationary_adf': adf_pval < alpha,
'is_stationary_kpss': kpss_pval > alpha # KPSS 原假设是平稳
}
# 如果 ADF 和 KPSS 都认为平稳,则确定阶数
if results[d]['is_stationary_adf'] and results[d]['is_stationary_kpss']:
return d, results
# 如果到最大阶数还不平稳,返回 None
return None, results
# 使用示例
order, details = check_integration_order(your_series)
print(f"单整阶数: I({order})")
3.3 实战中常见的陷阱
做单整检验这么多年,我踩过的坑真不少。下面这几个是最常见的,你一定要注意。
陷阱一:忽略结构突变
我曾经处理过一组宏观经济数据,ADF 检验显示不平稳,但一阶差分也不平稳。我当时就纳闷了,难道这是 I(2)?后来仔细一看,序列在 2008 年金融危机前后有一个明显的断点。这种结构突变会让单位根检验失效——它会把一个平稳的序列误判为非平稳。
怎么办? 用 Zivot-Andrews 检验或者 Perron 检验,它们能考虑结构突变。或者,你也可以分段检验。
陷阱二:季节性单位根
季度数据、月度数据经常有季节性。普通的 ADF 检验只能检测零频率的单位根,检测不了季节性单位根。比如一个季度数据,如果它在季度频率上有单位根,那就是 I(1) + 季节性单位根,需要做季节性差分。
我记得有一次做电力负荷预测,数据看起来是 I(1),但一阶差分后还有明显的季节性周期。后来用了 HEGY 检验(季节性单位根检验),才发现需要做 12 阶差分才能完全平稳。
陷阱三:样本量太小
单位根检验在小样本下(比如少于 50 个观测值)的检验势非常低。你很可能得到一个“不平稳”的结论,但实际上序列是平稳的,只是样本不够大。
我个人的经验是:少于 100 个观测值,单位根检验的结果要打折扣。这时候我会结合自相关图(ACF)和偏自相关图(PACF)来辅助判断。如果 ACF 衰减很快,那大概率是平稳的。
陷阱四:忽略确定性趋势
ADF 检验有三种形式:带截距、带截距和趋势、都不带。选错了形式,结果可能完全相反。比如一个带线性趋势的序列,你用“不带趋势”的 ADF 检验,很可能得出“有单位根”的结论,但实际上它是趋势平稳的(trend-stationary)。
我建议:先画图看趋势。如果有明显的上升或下降趋势,用“带截距和趋势”的形式。如果围绕零波动,用“都不带”的形式。如果围绕非零均值波动,用“带截距”的形式。
3.4 知识体系图:单整阶数判断流程
下面我用一张 SVG 图把整个判断逻辑串起来,方便你对照使用:
3.5 避坑指南:我的实战经验总结
最后,我把这些年踩过的坑总结成几条铁律,你直接拿去用:
- 不要只看 p 值。p 值小于 0.05 就认为平稳?不一定。还要看检验统计量是否远小于临界值。我习惯把 ADF 统计量和 1% 临界值比较,而不是 5%。
- 差分要适度。我曾经为了追求平稳,把一个序列差分到 I(3),结果模型完全没法解释。记住:经济金融数据很少超过 I(2)。如果差分两次还不平稳,大概率是数据有问题,或者有结构突变。
- 画图!画图!画图! 重要的事情说三遍。在跑任何检验之前,先画时序图、ACF 图、PACF 图。眼睛往往比统计检验更敏锐。
- 多方法交叉验证。ADF + KPSS + PP + DF-GLS,至少用两种。如果结果矛盾,不要强行解释,先回去看数据。
嗯,单整阶数确定这一步,看起来简单,但实战中翻车率极高。我见过太多人因为这一步没做好,后面整个模型都是错的。你花 80% 的时间在数据预处理和检验上,剩下的 20% 建模,往往是最顺利的。
好了,单整阶数确定就讲到这里。记住:这一步是地基,地基不稳,楼盖得再高也是危楼。