想象你要给一台精密的仪器做手术,术前的第一件事是什么?是量血压、测心率,确认各项指标稳定。如果仪器本身“带病、不稳定”,任何手术方案都是纸上谈兵。时间序列建模也是这个道理——你想用 ARIMA 等模型去预测股价、销量、服务器流量,第一关就是要判断这个序列“稳不稳定”。统计上把这种稳定叫做“平稳”:均值不飘、波动幅度不涨、过去与未来的关系不随日历翻页而改变。 那怎么判断呢?统计学家发明了三台“体检仪器”:ADF 检验像血压计,先假设你血管里有“病根”(单位根),再找证据反驳;PP 检验是它的升级版,遇到血管硬化(自相关和异方差)也照样测得准;KPSS 检验则像血糖仪,反过来先假设你健康(平稳),再找证据反驳。三台仪器一起上,再加上 p 值这条“化验单参考线”,你就能给任何时间序列开出一份可靠的体检报告。这篇文章,就把这三台仪器的原理、用法和报告解读一次讲明白。
学透平稳性检验,你才算真正拿到时序建模的“入场券”——无论是做金融风控、销量预测还是运维监控,建任何时序模型前先跑一遍三大检验,是 AI 从业者绕不开的专业基本功。
可视化演示
动态演示时序平稳吗?三大检验告诉你的核心机制,通过输入/处理/存储/输出四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
时序平稳吗?三大检验告诉你:时序平稳 时序平稳性的概念与建模前提 ADF检验:单位根原假设与差分 核心机制可视化 时序平稳吗?三大检验告诉你整体架构与关键组件
平稳性基础
体检时,医生总是让你先安静坐五分钟,再量血压、测心率。为什么?因为只有指标稳定在一个区间,医生的判断才有意义。时间序列建模也一样——你想用 ARIMA 去预测,前提是这段数据的“身体状态”稳定,统计上叫“平稳”。如果均值一路飙升、波动忽大忽小,模型算出来的参数就像对着漏斗做衣服,永远不合身。
数学上,平稳性有两条路。第一路叫“严平稳”,它要求无论把时间轴平移多少,序列的概率分布都保持不变。这就像要求一个人每时每刻的心率、体温、血压分布一模一样,现实数据几乎不可能满足。第二路叫“宽平稳”,也叫弱平稳,它只检查三个关键指标:均值是否固定、方差是否固定、任意两个时刻的相关性是否只由时间间隔决定。实际建模时默认说的“平稳”就是宽平稳。
把宽平稳的三个条件写成公式:
回到体检的比喻:均值是“参考线”,方差稳定是“血压不失控”,协方差稳定是“各器官协同模式不变”。三项都通过,你的序列才有资格上 ARIMA 这张“手术台”。而这三大指标,正是后面三大检验要替你把关的“体检项目”。
- 均值恒常不管在第 1 期还是第 1000 期看,序列的平均水平都钉在 μ 这个点上,不会随时间的推移整体上移或下移。
- 方差恒常序列的波动幅度始终是 σ² 这个尺度,不会出现“前面风平浪静、后面惊涛骇浪”的情况。
- 协方差只依赖间隔任意两个时刻的联动关系只与它们隔了多少期(k)有关,与具体是哪两个时点无关,说明“过去影响现在”的模式稳定。
单位根概念
体检报告里有一种可怕的字眼叫“慢性病根子”:它一旦扎根,今天的伤口不会自己愈合,会一直被身体背着走。时间序列里也有这样的病根,名字叫“单位根”。最典型的病例是随机游走:今天的股价等于昨天的股价加上一个随机扰动,看起来每一步都很温和,但累积起来却越走越远,永远回不到原点附近。
把随机游走写成模型,就是:
单位根之所以叫“单位根”,是因为特征方程里有一个恰好等于 1 的根(1 在数学里也叫“单位元”)。它就像一个埋在血管里的慢性病根:平时不疼,但会让所有基于均值回归的模型集体失灵。接下来出场的三大检验,目标就是专门排查这颗病根。
- 一阶自回归形式把今天的观测 y_t 看成昨天的 y_{t-1} 的某个比例再加上随机扰动 ε_t,一步只看一个“脚印”。
- 系数 ρ 的三种身世|ρ|<1 时扰动被逐步遗忘,序列最终回到均值附近——这叫平稳;ρ=1 时扰动被完整记住,一路累积——这是“病根”;|ρ|>1 时序列爆炸,现实中很少见。
- ρ=1 的连锁反应方差会随时间线性增长,均值失去意义,“过去影响现在”的记忆永不消退——这就是随机游走一步一个脚印却越走越远的数学原因。
ADF检验
量血压前,医生会先给你套上袖带。ADF 检验就像这台血压计,而且它的测量逻辑是“有罪推定”:先假设你血管里埋着单位根这颗病根,再测量数据,看看有没有足够强的证据推翻这个假设。原假设 H0 就是“序列有单位根、不平稳”,如果证据足够有力(p 值小),就宣判“平稳”。
ADF 的全称是 Augmented Dickey-Fuller(增广迪基-富勒检验),它在一代目 DF 检验的基础上,在回归方程里加了一串“滞后差分项”,专门用来清理序列中的自相关,让检验结果更可信。核心回归方程是:
用体检比喻收个尾:ADF 这台血压计测的是“γ 的 t 统计量”这个读数。读数足够异常(p<0.05),说明袖带下的血管没有病根,序列可以进入建模流程。读数正常(p 很大),也别急着绝望——后面还有 PP 和 KPSS 两位大夫等着会诊。
- 左边 Δy_t把“这一期比上一期多了多少”当作被解释对象,相当于在测“变化的速度”。
- α(漂移项)表示序列长期平均的步调,就像一个人正常走路时稳定的脚步频率。
- βt(确定性趋势项)时间每前进一期,序列整体移动 β,用来吸收“长期上涨/下跌”这种肉眼可见的趋势。
- γy_{t-1}(核心诊断项)检验的靶心。γ=0 与 ρ=1 等价,统计量越负,越说明数据不像是带病根的序列。
- 滞后差分求和项把过去 p 期的变化量加进来,像“空气净化器”一样滤掉自相关噪声,保证残差是干净的白噪声。
- ε_t(白噪声残差)做完一切过滤后剩下的纯随机扰动,是检验统计量成立的地基。
PP检验
有些病人血管硬化,普通血压计袖带压上去读数会抖。时间序列里也有类似的“血管硬化”——自相关很强、波动忽大忽小(异方差)。这时候,ADF 那套“滞后差分项目清器”如果阶数选不好,读数就不太靠谱。PP 检验(Phillips-Perron)就是升级版血压计:袖带加了“防抖垫”,不需要你逐期清理自相关,而是用非参数的方法直接把自相关和异方差“折算”进读数的方差修正里。
PP 检验的统计量,是把原始 DF 的 t 统计量乘上一个修正系数:
PP 这台升级版血压计的妙处是:你不需要纠结“滞后阶数 p 到底选几”。它用非参数修正把自相关与异方差一次性收拾干净。所以在金融数据这种“血管粗、噪声大”的场景里,PP 经常和 ADF 搭配使用,互为替补。
- tγ(原始读数)DF 回归里 γ 的 t 统计量,也就是普通血压计的读数。
- 修正系数读数的“防抖缩放”,长期方差越大、短期方差越小,修正越明显。
- 长期方差估计 ω̂²在短期方差 γ̂² 基础上,把各阶自协方差 λ̂_j 加权累加,权重形状是 Bartlett 核函数。
- 权重 (1 - j/(q+1))离当下越远的自相关协方差,权重越小——久远的记忆对长期方差贡献递减,符合直觉。
KPSS检验
前面两台血压计的思维都是“有罪推定”。但凡是体检,总得有个“无罪推定”的检查吧?KPSS 检验就是那台血糖仪:先假设你身体健康(原假设:序列平稳),只有当血糖值高到离谱(统计量超大、p 值很小),才认定你有问题。它的名字来自四位统计学家 Kwiatkowski、Phillips、Schmidt 和 Shin 的姓氏首字母。
KPSS 的步骤是:先把序列对常数(或常数+趋势)做回归,把“趋势”这个因素剥掉,得到残差 e_t;然后看残差累积和 S_t 是否在 0 附近老实待着。如果累积和一路狂奔,说明“平稳”这个假设遭到重击。
KPSS 和 ADF 就像一对“欢喜冤家”:一个假设平稳、一个假设不平稳。结论一致时你信心翻倍;结论打架时,恰恰暴露了序列的复杂真相(比如存在确定性趋势或结构突变)。聪明的数据分析师,从来不会只带一台仪器去体检。
- 残差 e_i把趋势从序列里剥掉后剩下的部分——如果序列本身是趋势平稳的,残差应该像白噪声一样干净。
- 残差累积和 S_t把小残差一点点加起来。平稳序列的残差有正有负、快速抵消,S_t 只会在 0 附近小幅摆动。
- 分子 ΣS_t²把所有累积和的平方加总,累积偏航越厉害,分子越大。
- 分母 σ̂²T²用残差方差 σ̂² 和样本量 T 的平方做标准化,让不同长度、不同尺度的序列可以互相比较。
p值解读
化验单上每个项目旁边都有一条参考线,比如空腹血糖参考上限 6.1 mmol/L,超过它才叫“异常”。统计学里的“参考线”就是显著性水平 α,通常取 0.05。p 值则是“你的指标偏离参考线的剧烈程度”的度量:p 越小,数据越反常,越有底气把“正常”这个假设撕掉。
p 值的严谨定义是:在原假设 H0 成立的前提下,观察到当前统计量这么极端甚至更极端的概率。写成公式:
回到化验单:p 值从来不说“病根存在的概率是 80%”,它只说“如果没病,这份单子有多像中彩票”。理解了这条参考线,再看三大检验输出的三行数字,你就知道哪一行该红、哪一行该绿。
- 条件概率 P(A|H0)意思是“在 H0 这个假设的世界里,事件 A 发生的概率”。注意 H0 在这个概率计算里是被当作背景的假设,不代表 H0 真的为真。
- 事件 T ≥ t_obs统计量比本次观测值还要极端的方向。ADF 里 t 统计量越负越极端,所以这个方向是“更负”。
- 比较规则p < α(通常 α=0.05)→ 数据足够反常,拒绝 H0;p ≥ α → 数据还与 H0“过得下去”,不能拒绝。
检验策略
体检科大夫从来不会单凭一台仪器开刀。成熟的流程是:先上血压计(ADF),再上血糖仪(KPSS),必要时加测升级版血压计(PP),把几份报告摆在一起会诊。因为 ADF/PP 是“有病推定”,KPSS 是“无病推定”,两者镜像互补,组合使用能大幅降低误诊风险。
组合判断可以浓缩成一张决策表:
在实际建模流水线里,这一步通常封装成一个函数:输入原始序列,输出“平稳 / 非平稳 / 需诊断”的一句话报告。它会自动决定要不要走差分这一步,避免人为主观误判。
- 第一分支(双证平稳)ADF 拒绝了“有单位根”,KPSS 没能拒绝“平稳”,两份报告相互印证,可以放心建模。
- 第二分支(双证非平稳)ADF 没能拒绝“有单位根”,KPSS 却拒绝了“平稳”,两份报告都指向非平稳,先处理再建模。
- 第三分支(证词冲突)两检方向不明或同向拒绝,通常提示存在确定性趋势、结构突变,或样本太短导致功效不足,需要画图、去趋势或差分后复查。
不平稳应对
如果会诊结论是“非平稳”,相当于体检亮红灯,不能直接上手术台(建模)。怎么办?医生会开三张经典处方:处理单位根用“差分”、稳定波动幅度用“对数变换”、对付外来趋势用“去趋势”。三者可以单独用,也可以配合用。
差分是最常用的武器:把相邻两期的差当作新序列。对随机游走做一次差分,积攒下来的“病根记忆”当场清零,新序列变成白噪声。一阶差分和二阶差分的定义是:
要注意:差分不是越多次越好。差分的目的是“刚好达到平稳”,过度差分会把真实信号也抹掉,就像吃药过量会伤身。每次差分之后,一定要把三大检验再跑一遍——这就是“复查”。
- 一阶差分 Δy_t用本期减上期,单位根从 ρ=1 变成 ρ=0,序列瞬间“降维”,随机游走被治成本质上接近白噪声,这是最经典的处方。
- 二阶差分 Δ²y_t对差分序列再差分,适合处理“变化的速度还在变化”的序列,比如曲率很明显的趋势。
- 对数变换辅助 ln(y_t)把乘法型的波动变成加法型,专治“方差随水平放大”的序列,比如销量和物价指数。
AI 应用场景
场景一:量化交易的“盘前体检”
阶段:数据预处理与特征工程
解决的问题:量化研究员常把股票收盘价直接塞进模型做价格预测,但价格序列几乎都有单位根,两个互不相关的股票价格也能算出虚假的高相关(伪回归)。用 ADF + KPSS 组合检验先给每只股票的收益率序列“体检”,确认平稳后再进模型,是正规流水线的基本盘。
具体案例:某私募量化团队每天收盘后对全市场 300 只股票跑三大检验,把未通过检验的个股自动标记,下一根 K 线改用收益率序列或差分序列。改造后,原本“回测很赚钱、实盘很亏钱”的配对交易策略,净值曲线的相关性分析终于靠谱了。
场景二:电商大促前的“销量体检套餐”
阶段:时序建模(ARIMA 训练前检查)
解决的问题:电商销量序列带着明显的季节性和大促脉冲,直接对原序列做 ARIMA 会得到“伪拟合”——模型把趋势当规律,预测永远滞后。分析师先用 KPSS 确认“趋势平稳”的成分,再对非平稳分量做差分和对数变换,让模型只学习真正可泛化的模式。
具体案例:某美妆品牌 618 备货前,数据分析师对 730 天日销序列跑 ADF 与 KPSS,发现原序列不平稳但一阶差分后平稳,于是用 SARIMA 建模,把滞销库存减少了约 18%,爆款断货天数从 5 天降到 1 天。
场景三:云平台的“服务器指标监护”
阶段:异常检测前的信号预处理
解决的问题:运维团队用 CPU 使用率序列做异常检测,但负载会随业务波峰漂移,直接设固定阈值会误报不断。先把序列做平稳性检验:平稳段用统计控制图,非平稳段先差分再去抖,异常检测的误报率大幅下降。
具体案例:某在线教育平台大促期间,监控系统对每个实例的 CPU 序列自动做 KPSS 检验,识别出“漂移型”实例后在差分域做 3-sigma 告警,误报率降低约 60%。
Python 演示
import warningsimport numpy as npfrom statsmodels.tsa.stattools import adfuller, kpss warnings.filterwarnings("ignore")np.random.seed(42)n = 300eps = np.random.normal(0, 1, n) # 平稳序列:AR(1),系数 0.5y_stable = np.zeros(n)for t in range(1, n): y_stable[t] = 0.5 * y_stable[t - 1] + eps[t] # 非平稳序列:随机游走y_unit_root = np.cumsum(eps) def judge(adf_p, kpss_p, alpha=0.05): adf_ok = adf_p < alpha kpss_ok = kpss_p >= alpha if adf_ok and kpss_ok: return "平稳,可以直接进入 ARIMA 建模" if (not adf_ok) and (not kpss_ok): return "不平稳,建议先做差分或对数变换再复检" return "结果矛盾,建议观察序列图并结合业务判断" def exam(name, series): adf_stat, adf_p = adfuller(series, autolag="AIC")[:2] kpss_stat, kpss_p = kpss(series, regression="c", nlags="auto")[:2] print(f"===== {name} =====") print(f"ADF : stat={adf_stat:.4f}, p={adf_p:.4f}") print(f"KPSS : stat={kpss_stat:.4f}, p={kpss_p:.4f}") print("结论:", judge(adf_p, kpss_p), "\n") exam("平稳 AR(1)", y_stable)exam("随机游走", y_unit_root)
y_unit_root = np.cumsum(eps)对标准正态扰动逐期累加,一步生成带单位根的随机游走序列。adfuller(series, autolag="AIC")[:2]调用 ADF 检验,autolag="AIC" 会自动选滞后阶数,返回前两个值:统计量和 p 值。kpss(series, regression="c", nlags="auto")[:2]调用 KPSS 检验,regression=“c“ 表示只含常数项的”水平平稳”版本。adf_ok = adf_p < alphaADF 的 p 值越小越有底气拒绝“有单位根”,所以用“小于”判断平稳。kpss_ok = kpss_p >= alphaKPSS 的 p 值越大越不能拒绝“平稳”,所以用“大于等于”判断平稳。
常见误区
误区我跑完 ADF 看到 p 值为 0.31,大于 0.05,说明序列是平稳的,可以放心建模了。
正解方向搞反了!ADF 的原假设是“有单位根、不平稳”,p 值大说明“没有足够证据推翻不平稳假设”,也就是“不能排除不平稳”。这就像血压计没有报异常,不代表身体一定健康,只是这台仪器没找到病根。正确姿势是同时看 KPSS:如果 KPSS 的 p 值也不小,才叫“两个方向都过不去”;更严谨的做法是用 ADF 与 KPSS 组合判断,而不是单看一个 p 值。
为何常见:很多人把“p 值小 = 显著 = 有差异”的通用记忆直接套过来,却忽略了不同检验的原假设方向完全不同,尤其容易把 ADF 的“拒绝”和“接受”搞反。
误区ADF 说平稳,KPSS 说不平稳,这两台“仪器”打架了,一定是我代码参数没设对。
正解这其实是三类“边缘情况”的正常信号:序列可能包含确定性趋势(趋势平稳)、结构突变、周期成分,也可能是样本太短导致检验功效不足。处理方式是先画序列图看趋势,再做差分或去趋势后复检,而不是怀疑软件 bug。就像两份体检报告数据源不同,医生会先复查而不是直接改病历。
为何常见:小白期待检验结果是“非黑即白”,但统计检验的结论永远带着概率语气,两种检验的角度本来就不同,冲突恰恰是信息量所在。
误区ADF 没通过就一阶差分,还不过就二阶差分,直到 p 值足够小为止,反正差分总能“搞定”。
正解差分是“破坏性清理”:过度差分会把平稳序列的真实信号也抹掉,导致模型拟合优度反而下降,还引入了本不需要的移动平均阶数。正确做法是先判断不平稳的来源:确定性趋势用去趋势/回归,方差随水平放大用对数变换,只有单位根(随机游走型)才需要差分。差分后要做 KPSS 等复查,确认“恰到好处”而非“矫枉过正”。
为何常见:网上教程常把“差分”当作万金油,初学者照抄流程,不知道差分每一步都在消耗数据中的信息量。
误区折线图绕着一根水平线小幅波动,看起来挺平稳,没必要跑检验。
正解肉眼只能感知趋势和大尺度漂移,对“方差随时间缓慢增大”这类问题不敏感;而且视觉系统会自动缩放坐标轴来“迁就”数据,掩盖真实问题。正确的姿势:用三大检验给出定量结论,把直觉转化为可复现的证据,尤其在自动化管道里,必须用代码完成判断,而不是带着个人偏见。
为何常见:可视化判断非常自然,但人眼对尺度和坐标轴的感知是可以被欺骗的,统计检验本质上是“固定尺度的眼睛”。
面试题
Q1. ADF 检验的原假设是什么?
- A.序列是平稳的
- B.序列存在单位根(不平稳)← 正确答案
- C.序列存在确定性趋势
- D.序列是白噪声
答案:B。ADF 采用“有罪推定”逻辑,原假设是“有单位根、不平稳”,所以 p 值小才能拒绝 H0 支持平稳。B 正确。A 是 KPSS 的原假设方向,C 和 D 与 ADF 的假设体系不符。
Q2. KPSS 检验的原假设是什么?
- A.序列有单位根
- B.序列存在趋势
- C.序列平稳(或趋势平稳)← 正确答案
- D.序列方差无限
答案:C。KPSS 是“无罪推定”,默认假设序列平稳,所以判断规则与 ADF 相反:p 值大(不拒绝)才让人放心。B 的“存在趋势”不严谨——KPSS 有两种回归设定,其中“趋势平稳”版本的原假设是去趋势后平稳。
Q3. 对某个序列做 ADF 检验,得到 p 值 = 0.03(显著性水平 α=0.05),正确结论是?
- A.接受原假设,序列不平稳
- B.拒绝原假设,序列平稳← 正确答案
- C.接受备择假设,序列有单位根
- D.无法判断
答案:B。p=0.03 < 0.05,在 ADF 的“有单位根”原假设下,出现这么极端统计量的概率不足 5%,所以拒绝 H0,有证据支持序列平稳。A 把方向和 p 值都搞反了;C 的“接受备择假设”语义错误且方向相反;D 的“无法判断”是混淆了“拒绝”和“接受”的统计语气。
Q4. ADF 检验与 PP 检验最本质的区别是什么?
- A.ADF 用非参数修正,PP 用滞后差分项
- B.ADF 用滞后差分项处理自相关,PP 用非参数修正处理自相关和异方差← 正确答案
- C.两者没有区别,只是名字不同
- D.PP 的原假设是序列平稳
答案:B。ADF 靠“增广滞后差分项”来吸收自相关;PP 不添加滞后项,而是通过 Newey-West 非参数修正统计量的方差,对异方差和自相关都更稳健。B 正确,A 把两者的手段说反了,D 的原假设方向错误。
Q5. 下列哪些做法可以用来应对“不平稳”的序列?
- A.一阶差分← 正确答案
- B.对数变换← 正确答案
- C.去除确定性趋势← 正确答案
- D.直接增加训练集长度
答案:ABC。差分消除单位根,对数变换稳定随水平放大的方差,去趋势处理趋势平稳序列,三者都是处理非平稳的常用处方。D 的“增加训练集长度”不能改变序列内在的统计结构,属于无效操作。
Q6. 随机游走序列 y_t = y_{t-1} + ε_t 是否平稳?
- A.平稳,因为每次只加一个小扰动
- B.不平稳,因为方差随时间线性增长← 正确答案
- C.平稳,只要 ε_t 是白噪声
- D.无法判断
答案:B。ρ=1 时 Var(y_t)=tσ²,方差随 t 线性增大,均值参考线失去意义,所以不平稳。随机游走“越走越远”正是单位根病根的表现。A 和 C 被“每一步很小”的直觉误导,D 不成立,因为模型结构已经明确告诉我们答案。
Q7. 一个序列的 ADF 检验 p<0.05 且 KPSS 检验 p<0.05,正确的解读是?
- A.平稳,两个检验都支持
- B.不平稳,两个检验都反对
- C.结果矛盾,需要进一步诊断(看图、找趋势、差分后复检)← 正确答案
- D.先取对数再看
答案:C。ADF 拒绝了“有单位根”(倾向平稳),KPSS 拒绝了“平稳”(倾向不平稳),两份证词相反。常见原因包括确定性趋势、结构突变或样本功效不足,必须结合序列图和业务判断,不能一锤定音。C 正确,A、B 把同向和反向搞混了,D 是“盲目开药”。
Q8. 关于单位根,下列说法正确的有哪些?
- A.ρ=1 时,扰动的影响会永久保留← 正确答案
- B.特征方程存在等于 1 的根,因而得名“单位根”← 正确答案
- C.单位根序列的方差随时间线性增大← 正确答案
- D.单位根序列经过一阶差分后仍不平稳
答案:ABC。A 是 ρ=1 的本质——冲击永不消散;B 是名称的由来;C 是随机游走方差的数学结论。D 错误,一阶差分是消除单位根的标准武器,随机游走差分后变成白噪声。
Q9. 关于 ADF 检验中滞后差分项的阶数 p,正确的说法有哪些?
- A.通常用 AIC / BIC 信息准则选择← 正确答案
- B.p 越大越好,一定能消除全部自相关
- C.p 选得太小可能残留自相关,影响检验功效← 正确答案
- D.p 选得太大浪费自由度,也会降低功效← 正确答案
答案:ACD。信息准则在拟合优度与模型复杂度之间权衡,是最常用的定阶方式。p 太小清不干净自相关,p 太大会浪费自由度并降低检验功效,因此 B“越大越好”错误,C、D 是对称的正确提醒。
Q10. 关于 p 值,下列哪些理解是错误的?
- A.p 值是原假设为真的概率← 正确答案
- B.p 值小于 0.05 表示效应量(差异程度)很大← 正确答案
- C.p 值是在原假设成立时,观察到当前统计量或更极端结果的概率
- D.p 值大于 0.05 说明原假设一定为真← 正确答案
答案:ABD。p 值不是 H0 为真的概率,A 错;p 值不能度量效应大小,B 错;p 值大只是“证据不足”,不能说 H0 一定为真,D 错。C 是 p 值的标准定义。把 p 值想象成化验单上的参考线:它衡量的是“在健康假设下这张单子有多反常”,而不是“你病得有多重”。