ADF检验中p值小于0.05且ADF统计量小于临界值(如-3.43)才可判定序列平稳;若p值大于0.05或存在明显趋势/季节性,需差分,通常一至二阶即可,超过二阶易导致过差分。

怎么判断一个序列是否需要差分
看 adfuller 返回的 p-value —— 小于 0.05 才算平稳;大于 0.05 就得差分。但别只盯 p 值,还要看 adf 统计量是否小于临界值(比如 -3.43),否则可能误判。常见陷阱是:原始序列带明显趋势或季节性,adfuller 却返回 p=0.07,这时不能硬扛,该差分还得差分。
实操建议:
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 先画
plot()看趋势和方差是否随时间变化;突增、缓升、周期震荡都是非平稳信号 - 用
adfuller(series, autolag="AIC"),别省掉autolag参数,否则滞后阶数选得不准,检验效力下降 - 如果一阶差分后仍不平稳(p > 0.05),再试二阶,但超过二阶要警惕——可能过差分导致噪声放大、模型失真
Statsmodels里怎么正确做ADF检验
adfuller 默认只检验无常数项、无趋势项的单位根,但现实数据大多带漂移或趋势,直接调用容易漏检。必须根据序列形态手动指定 regression 参数。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 纯随机游走(均值不变、无趋势)→ 用默认
regression="c"(含截距) - 有线性趋势(如逐年增长)→ 改成
regression="ct"(含截距 + 时间趋势项) - 季节性强的数据(如月度销售)→ 先用
seasonal_decompose拆解,再对残差做 ADF,别直接对原序列硬上 - 检验前务必 drop 掉 NaN:差分后头几个值是 NaN,
adfuller遇到会报ValueError: array must not contain infs or NaNs
ARIMA建模时d参数怎么定,和差分操作怎么对齐
ARIMA(p, d, q) 中的 d 必须等于你实际做的差分阶数,且差分操作必须在拟合前完成——Statsmodels 不会在内部自动帮你差分原始序列。很多人把 d=1 和原始序列直接喂给 ARIMA,结果模型拟合的是差分后序列,但预测时却反向还原错位,导致结果全偏。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 先用
series.diff(d).dropna()得到平稳序列,再用它跑adfuller验证 -
d取值后,建模时传入原始序列 +d参数:ARIMA(series, order=(p, d, q)),内部会按需差分 - 预测后用
model.forecast(steps=10)得到的是差分域结果;要还原到原始尺度,得用model.get_forecast().predicted_mean配合series.iloc[-1]手动累加(尤其d=1时) - 别用
diff().diff()做二阶差分——它会把索引搞乱,改用series.diff(2)
差分后建模效果差,可能是这几点没注意
差分只是手段,不是万能解。很多情况下,差分完 ADF 过了,但 ARIMA 拟合残差仍有自相关,说明差分没解决根本问题——比如季节性未剥离、外生变量缺失、或波动率时变(需 GARCH)。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 画
plot_acf/plot_pacf看差分后序列:如果滞后 12 处还有显著峰,大概率是残留季节性,得考虑SARIMAX而非普通 ARIMA - 检查残差是否异方差:用
plot(series.diff().std())看标准差是否随时间跳变,跳变明显就别硬上 ARIMA,试试对数变换或 ARCH 类模型 - 差分会丢失首部信息,样本量变少,小数据集(
d 值,在不同数据上意义可能完全不同——关键是你差分之后,是否还相信这个序列的未来是由它的过去线性决定的。

















