游乐场里有两架秋千,站在旁边看三分钟,你就能理解今天的主角。第一架秋千很“恋家”:不管孩子先前被推得多高,只要停下来,它晃着晃着总会回到垂直的位置,之后每次摆起的高度也都差不多。第二架秋千很“记仇”:大人推了它一把,它就带着这股劲头越荡越歪,半天不肯回原点,好像过去的每一次推动都刻在了骨子里。时间序列分析中,“恋家”的秋千叫“平稳序列”,“记仇”的秋千叫“带单位根的非平稳序列”。股票价格、GDP、传感器读数……无数真实数据都像第二架秋千。在给这类数据建模之前,我们必须先回答:它到底有没有“家”?ADF检验就是回答这个问题的标准工具。它帮你判断序列是否平稳,从而决定要不要做“差分”——把“记仇”的秋千改造成“恋家”的秋千。本文将用这个秋千比喻贯穿始终,带你逐步掌握ADF检验的每个环节。
对AI从业者而言,ADF检验是时间序列建模的第一道“体检关卡”:先判断数据是否平稳,才能决定要不要差分、能不能建立ARIMA等有效模型。掌握它,你的时序预测就不怕“伪回归”。
可视化演示
展示机器人机械臂在正常与奇异位形下的运动学特征,包括雅可比矩阵行列式变化与可操作度椭球变形,直观理解运动学奇点的本质。
本节配有交互动效(进入视口后自动加载,约 3KB)。
奇异位形 正常位形:雅可比矩阵满秩,末端执行器可全方向运动 奇异位形:雅可比矩阵降秩,某些方向运动能力丧失 可操作度:椭球面积趋零时标志奇异位形 w = sqrt(det(J·J^T)) 奇异位形是机器人运动学的重要约束
平稳性概念
回到游乐场。第一架秋千的“家”,就是那个垂直下垂的位置。不管被推到哪,只要没人继续推,它都自己回到那个点附近;更妙的是,它来回荡的幅度也很有规律,不会这一下冲上天、那一下纹丝不动。统计学家把这种“有家可回、行为稳定”的序列,称为平稳时间序列。
当然,数据不会像秋千那样肉眼可见地晃动。我们说的平稳,是统计规律上的平稳:序列的均值、方差,以及任意两点的相关关系,不会随着时间推移而改变。严格平稳要求所有高阶矩都不变,现实中太苛刻;我们常用的“弱平稳”(也叫宽平稳)只需要三条核心条件。
弱平稳的三个条件是:第一,期望恒定,整个序列的均值是一个固定常数 μ;第二,方差恒定,波动幅度不随时间变大变小;第三,任意两个时间点的协方差只和它们相隔多远(滞后期 k)有关,与具体位置无关。
换句话说,平稳序列无论被观察多久,它的“行为档案”始终不变——秋千的回定点、摆动幅度、前后摆的连贯性都像刻在石头上一样稳定。这份稳定,正是后续一切时间序列建模的底气。
- 均值恒定要求序列所有时点的期望都是同一个常数,秋千的回定点不会漂移。
- 方差恒定要求序列波动幅度在各时点保持一致,秋千摆动烈度不随时间改变。
- 协方差只依赖时距要求两个时点的相关程度只由它们相隔多远决定,与身处何时无关。
单位根含义
现在看第二架秋千。你轻轻推了一把,它没有像第一架那样荡回原点,而是停在了更远的地方;第二天你又推了一下,它又记住了一次,位置再次永久改变。它的每一次“经历”都完整地留在当前位置里,永不消逝。这种“记仇”的机制,在时间序列里有个专门的名字——单位根。
最典型的单位根过程是随机游走:今天的值等于昨天的值加上一个随机噪声。此刻的位置,是全历史所有噪声的累计之和。为了看清这种机制,我们先看一阶自回归模型 AR(1):它假设本期值等于上期值乘以记忆系数 ρ,再加一个新噪声。
当 |ρ| < 1 时,昨天的记忆会随时间衰减到零,序列最终回到均值附近,这就是平稳;当 ρ = 1 时,昨天的记忆 100% 被保留,所有冲击都永久累积——这就是单位根。ADF检验的本质,就是检验 ρ 是否等于 1。
单位根序列的本质就是“永不遗忘”:每一场噪声都写进账本,导致它的位置、它的统计特征永远在变。这正是它和“恋家”秋千最根本的区别。
- 记忆系数 ρ表示上一期的值对本期的影响强度,是秋千惯性的量化。
- 递推展开把 Y_{t-1} 不断递归替换,得到全历史噪声的累积。
- 均值不收敛方差随时间线性增长,说明没有固定均值可回。
ADF检验原理
我们怎么知道一架秋千是“恋家”还是“记仇”?光看它荡多高不够——有时“记仇”的秋千恰好停在原点附近,会骗过眼睛。更可靠的办法是:轻轻推一下,测量它“试图回去”的回拉力有多大。
ADF检验(Augmented Dickey-Fuller,增广迪基-富勒检验)干的就是这件事。它不直接看序列的绝对水平,而是看“每个时刻的变化量”和“上一时刻的水平”之间有没有负向的拉力。如果上一期位置越高、本期回落得越多,说明存在均值回归的“回拉力”。
ADF回归方程如下。其中 γ 就是回拉力系数:γ = 0 表示没有回拉力,序列带着单位根流浪;γ < 0 表示有回拉力,序列会回到均值。方程中的 α 是常数项,βt 是时间趋势项,ΣδᵢΔYₜ₋ᵢ 是滞后差分项,它们分别处理水平漂移、确定性趋势和残差自相关污染。
ADF检验就像给秋千装上了“回拉力测力计”:它关心的是每次被推出去后,秋千会不会自己往回使劲。这个“回拉的力气”,决定了秋千是恋家还是记仇。
- 差分项 ΔY_t本期与上一期的变化量,也就是秋千“这一次摆动出去的幅度”。
- 常数项 α吸收序列没有趋势时的平均漂移量,相当于测力计的校准基线。
- 时间趋势项 βt吸收确定性线性趋势,把“趋势型”与“随机游走型”区分开。
- 核心项 γY_{t-1}上一期水平对本期变化的拉力,这是ADF检验的主角。
- 滞后差分项吸收残差中残留的自相关,让检验更稳健。
检验执行步骤
测力计读数出来了,但数字总是有波动的。我们说“回拉力明显存在”,到底多大算明显?统计学家把这个问题装进假设检验的框架。
ADF检验的原假设是 γ = 0,即存在单位根(记仇的秋千);备择假设是 γ < 0,即平稳(恋家的秋千)。检验统计量是 γ 估计值与其标准误的比值,越负越说明回拉力显著。
流程很清晰:先看 p 值。若 p < 0.05,测力计响亮地宣告“这秋千有家”;若 p ≥ 0.05,说明数据还不足以证明回拉力存在,我们暂且认定它是“记仇”的秋千,需要进一步改造(差分)。
- γ 估计值从样本数据中估出的回拉力系数,相当于测力计的表盘读数。
- 标准误 SE读数的不确定度,衡量这个估计算得有多准。
- 判定规则当 t 小于临界值(等价于 p < 0.05)时拒绝原假设,宣布序列平稳。
差分变换方法
如果秋千确实“记仇”,工程师的改造方案很巧妙:既然绝对位置老是离家出走,那干脆不看位置,改看每次摆动之间的距离变化。把“荡到哪”换成“这次比上次多荡了多少”,这个“变化量”往往就安分了。
这个“相邻值相减”的运算,就是差分。一阶差分 ΔYₜ = Yₜ − Yₜ₋₁ 描述单位时间内的变化量。随机游走差分后变成纯噪声序列(即平稳的),因为“位置”里的永久记忆被一步抵消。如果一阶差分后还不平稳,可以对差分序列再差分,得到二阶差分。
差分不是“换一架秋千”,而是换一种观察角度:记仇的秋千位置没个准,但它每一次摆动的“增量”却很有规律。改造后,原来的流浪汉也变成了有家可回的乖孩子。
- 一阶差分本期减上期,抹掉随机游走累积的历史位置。
- 二阶差分对一阶差分再差分,处理某些趋势更顽固的序列。
- 还原关系差分不是丢弃数据,完成预测后通过累加可以回到原始尺度。
建模实践流程
现在把完整的流程看成一次“秋千体检 + 定制训练”:体检判断性格,训练改变性格,最后才能放心预测它下一秒荡向哪里。
实际工作中,拿到一条时间序列后,第一步永远是画图 + ADF检验;若 p ≥ 0.05 判为非平稳,就做一阶差分再检验;直到差分后的序列通过检验,才进入 ARIMA 等模型构建。差分次数就是 ARIMA(p,d,q) 中的 d。
建模实践就像一套标准动作:体检(ADF)判断秋千性格,差分训练改变性格,再体检确认改造成功,最后才上预测模型。严谨走完这套流程,你的时间序列模型才算真正“站在平稳的地面上”。
- p<0.05(d=0)序列本身平稳,直接用原序列建模。
- 一阶差分后平稳(d=1)最常见的处理方式,随机游走加一阶差分即可搞定。
- 二阶差分(d=2)一阶后仍不平稳才考虑,同时要警惕过度差分。
AI 应用场景
金融风控:股价收益率预处理
阶段:数据预处理 / 特征工程
解决的问题:传统做法直接对股价价格序列建模,未察觉其非平稳性,导致模型出现“伪回归”——两个无关序列因共同趋势被误判为高度相关。先用ADF检验识别价格序列存在单位根,再对收益率(一阶差分)建模,才能得到有效模型。
具体案例:某量化团队拿到沪深300指数日频收盘价,ADF检验得到 p=0.72,无法拒绝单位根,判定为“记仇的秋千”;对价格做一阶差分得到日收益率序列,ADF检验 p<0.01,确认平稳。团队随后才用 ARIMA-GARCH 族模型对收益率建模,回测中夏普比率显著提升。
工业物联网:传感器基准漂移检测
阶段:异常检测 / 时序监控
解决的问题:工厂传感器在安装初期常出现参考基准漂移,传统固定阈值告警会把漂移误报为“设备异常”。先对信号做ADF检验区分“趋势性漂移”和“真实故障波动”,再决定是否用差分消除基准漂移。
具体案例:某工厂振动传感器上线首周读数持续爬升,ADF检验 p=0.31 判为非平稳。工程师判定这是安装沉降导致的基准漂移,对信号做一阶差分后 p<0.05,且差分后信号落在稳定带宽内,于是取消告警、重新标定基准,避免了每周约40次误报。
电商销量预测:非平稳序列的差分建模
阶段:预测模型构建与评估
解决的问题:电商日销量受促销、季节性影响,均值随时间变化,直接建模预测误差大。先用ADF检验确认非平稳,再通过差分和季节性调整把序列变为平稳,最后用 ARIMA 等模型预测。
具体案例:某电商平台对一款爆款商品做销量预测,原始日销量 ADF p=0.08,勉强非平稳;一阶差分后 p<0.001。随后构建 ARIMA(1,1,1) 模型,预测未来14天销量,MAE 比直接对原始序列建模降低了23%。
Python 演示
import numpy as npfrom statsmodels.tsa.stattools import adfuller def check_stationarity(series, name="series"): """对序列执行ADF检验并打印结果,返回是否平稳.""" result = adfuller(series, autolag="AIC") stat = result[0] p_value = result[1] critical = result[4] print(f"--- {name} ---") print(f"ADF统计量: {stat:.4f}") print(f"p值: {p_value:.4f}") print(f"1%临界值: {critical['1%']:.4f}") print(f"5%临界值: {critical['5%']:.4f}") print(f"结论: {'平稳' if p_value < 0.05 else '非平稳(存在单位根)'}\n") return p_value < 0.05 def main(): rng = np.random.default_rng(42) n = 200 # 生成随机游走(非平稳) random_walk = np.cumsum(rng.standard_normal(n)) # 生成平稳AR(1) ar = np.zeros(n) for i in range(1, n): ar[i] = 0.7 * ar[i - 1] + rng.standard_normal() print("===== 随机游走 =====") is_rw = check_stationarity(random_walk, "random_walk") if not is_rw: print("对随机游走做一阶差分:") diff_rw = np.diff(random_walk) check_stationarity(diff_rw, "diff(random_walk)") print("===== AR(1) =====") check_stationarity(ar, "ar(1)") if __name__ == "__main__": main()
random_walk = np.cumsum(rng.standard_normal(n))对噪声做累加生成随机游走,相当于“记仇秋千”不断叠加历史冲击result = adfuller(series, autolag="AIC")调用 ADF 检验,autolag="AIC" 让函数自动选最优滞后阶数p_value = result[1]取出 p 值,这是判定平稳与否的关键依据if p_value < 0.05:小于 0.05 拒绝原假设,判定序列平稳(有“回拉力”)diff_rw = np.diff(random_walk)一阶差分:相邻值相减,清空“历史账本”critical['5%']输出 5% 显著性水平下的临界值,与 ADF 统计量对照
常见误区
误区我觉得序列画出来如果绕着一条水平线上下波动就是平稳,如果有明显上升趋势就是不平稳,看图就够了吧,为什么要跑检验?
正解视觉判断非常不可靠。随机游走(单位根过程)在某一段时间窗口内看起来也可能“绕着一条线摆动”,而一个带断点的趋势序列也可能骗过眼睛。ADF检验的作用就是把“有没有回拉力”量化成统计证据,而不是靠感觉拍板。就像判断秋千是否恋家,光看它现在停在哪儿不够,要测“被推后回不回得去”。
为何常见:教材和科普文章常配平稳/非平稳对比图,视觉印象先入为主,让人误以为看图就能代替检验。
误区ADF检验的 p 值越小说明序列越“差劲儿”,p 越大才说明序列越平稳、越适合建模。
正解ADF检验的原假设是“存在单位根(非平稳)”。p < 0.05 意味着拒绝原假设,即序列平稳;反之 p ≥ 0.05 意味着没有足够证据拒绝“非平稳”。所以 p 值小反而是好消息——它是“恋家秋千”的证据。
为何常见:很多初学者把“小概率事件”和“结果不好”绑定,忘记了检验的方向由原假设决定。
误区既然差分能让序列“看起来更平稳”,那建模前不管三七二十一先做一阶差分,肯定最保险。
正解过度差分会损失信息、引入额外噪声(相当于把已经平稳的好秋千拆了重装),还会影响模型的可解释性,比如让 ARIMA 出现 MA 单位根。正确做法是:先 ADF 检验,只有确认非平稳(p ≥ 0.05)才差分,差分后再检验确认效果。
为何常见:很多教程示例恰好都是“非平稳→差分”的流程,读者机械照搬,忽略了前置判断。
误区ADF检验通过了(p < 0.05),序列就绝对平稳,直接建模万事大吉。
正解ADF检验有自身局限:对结构突变、长记忆过程检验功效不足,滞后阶数和模型设定不同也可能得到不同结论。工程实践中建议结合 ACF/PACF 图、KPSS 检验(原假设为平稳)做交叉验证。就像体检,单项指标正常不代表全身都健康。
为何常见:把统计检验的结论当成“盖章确认”,忽略了任何单一检验都有前提假设和误差。
误区我用 adfuller 默认参数跑一遍,p 值大于 0.05 就说“非平稳”,换一组数据又跑一遍就完事,没注意回归里有没有常数项和趋势项。
正解ADF回归方程有三种常见设定:无常数无趋势、含常数、含常数+趋势。若序列有确定性趋势但用了无趋势模型,可能错误地判为有单位根;反之也会误判。statsmodels 的 regression 参数("c"/"ct"/"ctt"/"n")应结合序列特征选择,并观察结果稳定性。
为何常见:初学者不了解 ADF 的模型变体,以为所有参数都只是“默认值”而无所谓。
面试题
Q1. ADF检验的原假设是什么?
- A.序列一定是平稳
- B.序列存在单位根← 正确答案
- C.序列是白噪声
- D.序列有确定性趋势
答案:B。ADF检验的原假设是 H₀: γ=0,即序列存在单位根、是非平稳的。选项 A 是备择假设的方向;C 和 D 是其他概念,不是ADF的原假设。把原假设和备择假设记反是初学者最常见的错误。
Q2. 以下哪种序列适合直接建立ARIMA模型?
- A.随机游走序列
- B.带漂移随机游走
- C.平稳AR一阶模型← 正确答案
- D.有线性趋势序列
答案:C。ARIMA 建模要求序列平稳。平稳AR(1)(|ρ|<1)均值回归、方差稳定,可直接建模。随机游走及其带漂移版本、有线性趋势的序列都是非平稳的,需要先差分处理。
Q3. ADF检验结果中,哪个p值最能说明序列平稳?
- A.零点五零
- B.零点二零
- C.零点零三← 正确答案
- D.零点九五
答案:C。p < 0.05 时拒绝“存在单位根”的原假设,判定序列平稳。0.03 是唯一小于 0.05 的选项。注意方向:p 小代表平稳,这和某些人直觉相反,就像“测力计读数越极端越有把握”。
Q4. ADF回归方程中,判断是否存在单位根主要看哪个系数?
- A.常数项α显著不为零
- B.趋势项β显著不为零
- C.滞后项γ显著小于零← 正确答案
- D.残差平方和达到最小
答案:C。ADF回归方程 ΔYₜ = α + βt + γYₜ₋₁ + ΣδᵢΔYₜ₋ᵢ + ε 中,γ 是“回拉力”系数。γ 显著为负说明上一期水平对本期变化有负向拉力(均值回归),序列平稳;γ=0 则存在单位根。
Q5. 关于随机游走模型 Yₜ=Yₜ₋₁+εₜ,其自回归系数ρ的正确描述是?
- A.滞后系数等于零
- B.滞后系数等于一← 正确答案
- C.滞后系数小于零
- D.滞后系数大于一
答案:B。随机游走的 AR(1) 形式是 Yₜ = ρYₜ₋₁ + εₜ,其中 ρ = 1,即单位根情形。ρ=0 是白噪声,|ρ|<1 是平稳AR,ρ>1 是爆炸性非平稳过程。
Q6. 下列哪些属于弱平稳(宽平稳)的条件?
- A.均值恒定不变← 正确答案
- B.方差恒定不变← 正确答案
- C.协方差依赖时距← 正确答案
- D.偏度必须等于零
答案:ABC。弱平稳三条件:期望恒定、方差恒定、协方差只依赖时间间隔(时距)k。偏度是否为零不属于弱平稳的定义,它属于更高阶的分布性质。注意 C 的表述在“只依赖时距”的意义下是正确的。
Q7. 某非平稳序列一阶差分后ADF检验p值仍大于0.05,下一步最合适的操作是?
- A.直接使用原序列进行建模
- B.进行二阶差分处理一下← 正确答案
- C.放弃这组时间序列的数据
- D.给模型加上一个趋势项
答案:B。一阶差分后仍不平稳,说明一次“清账”不够,需要对差分序列再做差分(二阶差分)。直接建模违反平稳假设;放弃数据过于草率;加趋势项无法解决单位根问题,那是确定性趋势的应对方式。
Q8. 关于差分变换,下列说法正确的有?
- A.一阶差分能消除随机游走← 正确答案
- B.过度差分会损失序列信息← 正确答案
- C.差分后的序列一定保持平稳
- D.差分过程可能引入额外噪声← 正确答案
答案:ABD。一阶差分能把随机游走变成平稳噪声序列,A 正确。差分次数过多会损失信息、引入额外噪声,B、D 正确。差分后的序列不一定平稳——比如一阶差分后的序列可能仍有单位根或结构突变,必须再检验,C 错误。
Q9. 在Python statsmodels库中,执行ADF检验的函数是?
- A.adfuller函数← 正确答案
- B.stationary函数
- C.diff_test函数
- D.unit_root函数
答案:A。statsmodels.tsa.stattools 模块中的 adfuller 是标准的ADF检验函数,返回统计量、p值、临界值等。其他选项都不是 statsmodels 中存在的时间序列检验函数。
Q10. 关于ADF检验模型设定,下列说法正确的有?
- A.包含常数项设定← 正确答案
- B.包含时间趋势设定← 正确答案
- C.滞后阶数影响功效← 正确答案
- D.模型设定不影响结论
答案:ABC。ADF回归方程可以设定为无常数无趋势、含常数项、含常数+趋势项三种变体,A、B 正确。滞后阶数 p 的选择会显著影响检验功效,选错可能漏检或误检,C 正确。模型设定当然影响结论——序列有确定性趋势却用无趋势模型,可能错误判定为有单位根,D 错误。