ARIMA模型拟合前必须进行平稳性检验,因ARIMA要求序列平稳(均值、方差不随时间系统变化);月度销售额具趋势和季节性,需先用ADF检验(如statsmodels的adfuller)判断p值是否显著。

ARIMA模型拟合前必须做平稳性检验
ARIMA不是万能的,直接套用ARIMA(data, order=(1,1,1))大概率报错或预测失真。核心前提是时间序列得是平稳的——均值、方差不随时间系统变化。月度销售额天然带趋势和季节性,adf_test(Augmented Dickey-Fuller)是绕不开的第一步。
实操建议:
- 用
statsmodels.tsa.stattools.adfuller跑检验,重点关注p-value是否d=2常导致过差分,残差自相关变强 - 画出原始序列、一阶差分后序列的
plot_acf和plot_pacf,观察拖尾/截尾特征,辅助定p和q - 月度数据大概率存在年周期(12个月),若差分后仍有明显季节峰,说明需要SARIMA,不是纯ARIMA
order参数不能靠猜,要用AIC/BIC自动搜索
手动试(0,1,1)、(1,1,0)、(1,1,1)组合效率低,且容易陷入局部最优。auto_arima(来自pmdarima库)是更可靠的选择,它内部用网格搜索+信息准则筛选最优order。
注意点:
立即学习“Python免费学习笔记(深入)”;
-
auto_arima默认开启seasonal=False,月度数据务必设seasonal=True并传m=12,否则会漏掉季节项 - 设
max_p=5、max_q=5足够覆盖常见场景,再大不仅慢,还易过拟合;stepwise=True可加速收敛 - 如果训练集太小(比如auto_arima可能选不出合理结果,这时得回退到人工看ACF/PACF图
预测时必须处理索引对齐和频率推断
用model.predict()或model.forecast()后,结果常出现索引错位或缺失月份,尤其当原始index是datetime但没设freq时。Pandas会误判下期时间戳,导致画图时横轴乱跳。
关键操作:
- 建模前确保
data.index是DatetimeIndex,且调用data.asfreq('MS')(Month Start)显式指定频率,避免隐式推断出错 - 预测时用
forecast(steps=6)比predict(start=..., end=...)更安全;若必须用predict,start和end必须是真实存在的日期索引位置,不能填数字 - 把预测结果转成
pd.Series后,立刻用.asfreq('MS')重设频率,再.plot()才不会漏月或重复
残差诊断比预测值本身更重要
即使RMSE看着不错,若残差不服从白噪声(即非随机),模型就是不可信的。月度销售数据常因促销、节假日等产生结构性残差,单纯看误差大小会掩盖问题。
检查清单:
- 画
residuals.plot()看是否有趋势或明显波动簇;跑acorr_ljungbox(residuals, lags=12),p-value > 0.05才说明无显著自相关 - 直方图+
stats.normaltest验证正态性——ARIMA假设残差近似正态,严重偏态时需考虑Box-Cox变换 - 如果残差在某几个月份持续偏高(比如每年12月),说明模型没捕获季节性突变,应转向SARIMAX加外生变量(如是否含春节、是否促销)
月度销售额预测真正卡点不在代码几行,而在差分是否恰到好处、季节结构是否被显式建模、以及残差里藏着的真实业务信号有没有被忽略。


















