3、平稳性检验:ADF检验原理、KPSS检验、如何解读检验结果

说到时间序列建模,有个坎儿你绕不过去——平稳性检验

我刚开始做时间序列那会儿,总觉得这步是形式主义。数据拿来就直接上ARIMA,结果模型跑出来一塌糊涂。后来被导师骂了一顿,才老老实实回来补课。说白了,平稳性检验就是给数据做个「体检」,看看它是不是个「乖孩子」——均值稳定、方差稳定、自相关结构稳定。

如果数据不平稳,你做的预测就是空中楼阁。嗯,这话一点不夸张。

3.1 什么是平稳性?

先明确一个概念。平稳性分两种:

  • 严平稳:整个时间序列的联合分布不随时间平移而改变。这个条件太强,现实中几乎不存在。
  • 弱平稳(宽平稳):均值恒定、方差恒定、自协方差只与时间间隔有关。我们平时说的「平稳性检验」,指的就是这个。

我个人习惯把弱平稳理解成「数据的行为模式不随时间变化」。比如一个机器每天生产的零件数量,如果均值一直在100左右波动,方差也差不多,那它就是平稳的。如果均值从100慢慢涨到200,那就不平稳了。

核心要点:平稳性是时间序列建模的前提。非平稳数据直接建模,容易出现「伪回归」——两个毫无关系的序列,因为都有趋势,相关系数却很高。

3.2 ADF检验:单位根检验的扛把子

ADF检验,全称Augmented Dickey-Fuller Test。名字挺长,但原理其实不复杂。

它检验的是:序列中是否存在单位根

什么叫单位根?你想想看,如果一个时间序列的当前值完全等于上一期的值加上一个随机误差,即 yt = yt-1 + εt,那这个序列就是随机游走。它的特征方程有一个根等于1,所以叫「单位根」。有单位根的序列,一定不平稳。

ADF检验的原假设 H0:序列存在单位根(非平稳)。
备择假设 H1:序列不存在单位根(平稳)。

检验结果看p值:

  • p值 < 0.05:拒绝原假设,序列平稳
  • p值 ≥ 0.05:不能拒绝原假设,序列非平稳

我在项目中遇到过一个问题:ADF检验对滞后阶数的选择很敏感。滞后阶数选少了,自相关没消除干净;选多了,检验功效下降。我一般用AIC或BIC自动选择滞后阶数,Python的statsmodels里可以直接设置autolag='AIC'

小技巧:ADF检验有三种形式——含截距项、含截距和趋势项、什么都不含。我通常先画个时序图,看看数据有没有明显趋势,再决定用哪种形式。如果拿不准,就三种都跑一遍,取最保守的结果。

3.3 KPSS检验:和ADF互补的好搭档

ADF检验有个问题:它的原假设是「非平稳」。这意味着,如果数据量不够大,或者序列刚好处于平稳和非平稳的边界上,ADF很容易犯第二类错误——明明不平稳,却说它平稳。

这时候就需要KPSS检验登场了。

KPSS检验的原假设正好反过来:H0 序列是平稳的。备择假设 H1 序列存在单位根(非平稳)。

解读方式:

  • p值 < 0.05:拒绝原假设,序列非平稳
  • p值 ≥ 0.05:不能拒绝原假设,序列平稳

你发现没有?ADF和KPSS的假设是互补的。我个人的习惯是:两个检验一起做,交叉验证。

ADF结果 KPSS结果 结论
平稳 平稳 序列平稳,放心建模
非平稳 非平稳 序列非平稳,需要差分
平稳 非平稳 可能存在趋势平稳,需去趋势
非平稳 平稳 可能存在差分平稳,需差分

我曾经遇到过一个案例:ADF说平稳,KPSS说非平稳。后来仔细一看,数据是「趋势平稳」——去掉线性趋势后就是平稳的。这种情况用差分反而会过度处理,应该用去趋势而不是差分。

避坑指南:千万不要只看一个检验就下结论。我曾经因为只看了ADF结果,把一个趋势平稳的序列做了差分,结果引入了负的自相关,模型效果反而变差了。两个检验一起看,才能避免这种尴尬。

3.4 如何解读检验结果?

光知道p值怎么判断还不够。你得学会看完整的检验输出。

以Python的statsmodels为例,ADF检验的输出包含:

from statsmodels.tsa.stattools import adfuller

result = adfuller(data, autolag='AIC')
print(f'ADF统计量: {result[0]}')
print(f'p值: {result[1]}')
print(f'临界值: {result[4]}')
print(f'滞后阶数: {result[2]}')
print(f'样本量: {result[3]}')

输出示例:

ADF统计量: -3.452
p值: 0.009
临界值: {'1%': -3.432, '5%': -2.862, '10%': -2.567}
滞后阶数: 5
样本量: 195

怎么解读?

  • p值=0.009 < 0.05,拒绝原假设,序列平稳
  • ADF统计量=-3.452,小于1%临界值-3.432,说明在1%显著性水平下也显著
  • 滞后阶数=5,说明用了5阶滞后消除自相关

我个人习惯先看p值,再看统计量和临界值的比较。如果p值在0.05附近徘徊,我会更关注统计量是否小于5%临界值。如果两者矛盾,那就回到数据本身,画个图看看。

经验之谈:对于金融数据(股票价格、汇率等),ADF检验往往很难拒绝原假设,因为这些数据通常是随机游走。对于经济数据(GDP、CPI等),差分一次后基本都能平稳。如果你发现差分两次还不平稳,那就要怀疑数据本身是不是有问题了。

3.5 知识体系总览

下面这张图,是我自己梳理的平稳性检验核心逻辑。你看一眼,心里就有谱了。

平稳性检验知识体系 平稳性检验 ADF检验 H₀:存在单位根(非平稳) p < 0.05 → 平稳 KPSS检验 H₀:序列是平稳的 p < 0.05 → 非平稳 建议:ADF + KPSS 联合使用,交叉验证

这张图把ADF和KPSS的关系讲得很清楚。一个从「非平稳」出发,一个从「平稳」出发,两个方向夹击,基本不会漏掉问题。

3.6 实操建议

最后,给你几个我踩坑踩出来的建议:

  1. 先画图,再检验。时序图、自相关图、偏自相关图,这些可视化工具能给你第一印象。别一上来就扔进检验函数里。
  2. 两个检验一起做。ADF + KPSS,就像买保险,多一份保障。
  3. 注意样本量。样本太少(比如小于50),检验功效很低。样本太多(比如大于500),检验会过于敏感,轻微偏离也会被判为非平稳。
  4. 差分不是万能的。如果数据是趋势平稳,差分反而会破坏结构。先判断清楚再动手。
  5. 记录检验参数。滞后阶数、检验形式(是否含趋势项),这些信息在写报告时都要写清楚,方便别人复现。

平稳性检验这件事,说难不难,说简单也不简单。关键是要理解它背后的逻辑,而不是机械地看p值。你想想看,如果连数据的基本性质都没搞清楚,后面的建模再花哨又有什么用呢?

一句话总结:ADF检验看「有没有单位根」,KPSS检验看「是不是平稳」。两者结合,才能准确判断数据的真实状态。

公众号:蓝海资料掘金营,微信deep3321