ADF检验p值仅是统计参考,非平稳性判定需结合KPSS、趋势图、ACF及业务逻辑;盲目差分易致过差分,破坏可预测性。

为什么只看adfuller的p值就差分,模型反而更差
因为adfuller返回的p值只是统计显著性参考,不是平稳性“通关证书”。你看到p > 0.05就认定非平稳、立刻差分,很可能把本已近似平稳的序列推入过差分陷阱——差分后ACF在滞后1期出现强负相关(比如acf[1] ),残差方差陡增,预测区间发散。
正确做法是三看:
- 看result[0](ADF统计量)是否小于临界值result[4]["1%"],而不仅是p值
- 看时序图有无明显趋势或波动聚集,哪怕p=0.049,若有结构性断点,仍需谨慎
- 差分后必须重跑adfuller,同时画plot_acf,确认没有负自相关主导
差分阶数d设为2,为什么预测结果全成直线或剧烈震荡
二阶差分对大多数业务序列(销量、访问量、温度)属于过度处理。它会放大噪声、抹平真实动态,导致拟合出的AR系数趋近0、MA系数异常大,最终forecast输出要么平坦如尺,要么高频抖动。
实用判断法:
- 优先尝试d=1,哪怕ADF的p值=0.06~0.08,也先用kpss反向验证:kpss(series, regression='c')若p > 0.05,说明KPSS接受平稳,此时不差分可能更优
- 若必须用d=2,检查原始序列是否含明确二次趋势(如连续三年年均增长15%+),否则大概率是误判
- 用np.diff(series, n=2)后,计算标准差,若比一阶差分后高3倍以上,立即回退
auto_arima推荐(1,1,0),但你手动试(2,1,2) AIC更低,该信哪个
信auto_arima的推荐,除非你有明确业务理由拒绝它。AIC更低不等于预测更好——它可能在训练集上过拟合了短期波动,尤其当样本量小(
验证要点:
- 把最后20%数据留作测试集,用get_forecast(steps=20)对比两组参数的rmse和mape
- 检查(2,1,2)残差的acorr_ljungbox p值是否auto_arima默认开启seasonal=False,如果你的数据是月度/周度,漏掉季节性结构才是准确率崩塌的主因
做完差分、选好p和q,残差还是自相关,下一步卡在哪
残差自相关不是调p/q就能解决的,大概率是前置步骤出了问题:原始序列里藏着没被识别的季节性、外部冲击(如促销、疫情)、或异方差(波动随均值增大)。
立即学习“Python免费学习笔记(深入)”;
快速排查项:
- 对月度数据,不做seasonal_decompose就直接ADF检验,等于闭眼开车;先用STL或seasonal_decompose分离趋势/季节/残差,再对去季节项做ADF
- 残差方差是否随时间上升?画residuals.rolling(12).std(),若持续走高,得先用Box-Cox变换稳定方差
- 检查是否有已知事件点(如某天服务器宕机),这些点的残差必然异常,应作为离群点剔除或加虚拟变量,而非硬塞进ARIMA
真正难的不是跑通ARIMA,而是判断什么时候不该用它——当差分后序列的ACF拖尾缓慢、或残差Ljung-Box检验在多个lag上反复失败,说明线性平稳假设已失效,该切SARIMAX或树模型了。


















