ARIMA模型需先通过ADF检验确保序列平稳,d值由差分阶数确定,须正确还原差分和对数变换结果,使用SARIMAX处理季节性数据。

ARIMA模型跑不起来,大概率是没过平稳性检验
ARIMA不是套上数据就能预测的黑箱,ARIMA 要求输入序列是平稳的——均值、方差、自相关结构不随时间变化。直接对原始股价、销量、气温数据跑 ARIMA(p,d,q),常出现 LinAlgError: Singular matrix 或拟合结果完全漂移,根本原因是 d=0 时残差非平稳,模型无法收敛。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 先用
adfuller做 ADF 检验,p-value > 0.05就说明不平稳,别急着建模 -
d参数不是靠猜的,它等于使序列变平稳所需的差分阶数:对原始序列做一阶差分(df['y'].diff()),再检;还不行就二阶(.diff().diff()),但极少需要超过 2 阶 - 差分会丢失首行数据,注意对齐预测后的还原:用
np.cumsum或手动累加,别直接用shift补零
statsmodels 的 ARIMA 和 AutoReg 别混用
statsmodels.tsa.arima.model.ARIMA 是当前推荐接口(v0.12+),而旧版 statsmodels.tsa.ARIMA 已弃用,调用会报 AttributeError: module 'statsmodels.tsa' has no attribute 'ARIMA'。更常见的是误用 AutoReg——它只拟合 AR 部分,不支持差分和 MA,拿来跑带趋势的数据,预测必然塌陷。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 确认导入方式是
from statsmodels.tsa.arima.model import ARIMA,不是from statsmodels.tsa import ARIMA - 参数顺序是
(p, d, q),不是(p, q, d),写反会导致ValueError: order must be a 3-tuple - 训练前务必指定
enforce_stationarity=False(尤其d=0时),否则模型可能强行拒绝非平稳 AR 根,导致拟合失败
预测结果偏差大,检查是否忘了还原差分和对数变换
很多教程做完差分+建模就直接 model.forecast(),输出却是“差分后的增量”,不是原始尺度的预测值。如果还做了对数变换(比如为稳定方差),那更要双重还原:先指数,再累加差分。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 若用
df['y_log'] = np.log(df['y']),预测后必须np.exp(forecast),不能跳步 - 若用
df['y_diff'] = df['y'].diff(),预测得到的是Δyₜ₊₁,要还原成yₜ₊₁ = yₜ + Δyₜ₊₁;多步预测需迭代累加,别用单个差分值重复加 - 用
model.get_forecast(steps=5).predicted_mean获取均值,别只取.forecast()——后者不带置信区间,且 v0.14 后行为有变更
季节性强的数据,ARIMA 不够用就得切 SARIMAX
月度销售、周度访问量这类明显周期性数据,硬塞进普通 ARIMA,残差里全是季节峰,AIC 居高不下,预测在节日前后系统性偏高或偏低。这不是调参问题,是模型表达能力天花板到了。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 先画
seasonal_decompose(df['y'], period=12)看季节图谱,period 必须设对(月数据填 12,周数据填 52,千万别用默认的 7) - 改用
sm.tsa.SARIMAX(y, order=(p,d,q), seasonal_order=(P,D,Q,s)),其中s就是上面的 period,D是季节差分阶数(通常为 1) -
SARIMAX训练慢、参数敏感,初试建议固定seasonal_order=(0,1,0,12),只调非季节部分,避免爆炸式组合搜索
平稳性检验不是形式主义步骤,它是 ARIMA 的启动开关。差分阶数错一阶,整个预测链就断在第一步;还原逻辑漏一层,结果数字再漂亮也没法落地。这些地方没有“差不多”,只有对或不对。


















