时间序列分析与预测的3个Statsmodels技巧
内容提要
statsmodels 拟合模型除点预测外还提供更多信息:用 get_forecast 可直接获取预测区间,无需手动计算;append 能在不重新拟合的情况下加入新数据并默认复用已有参数;STLForecast 将 STL 分解与 ARIMA 预测整合,避免手动还原季节性时的错误。这些内置方法比手写实现更短、更快、更准确。
延伸解读
预测区间:被忽视的内置能力
文章指出,res.forecast(12) 只返回点预测,而 res.get_forecast(12) 返回的 PredictionResults 对象还包含模型已估计的不确定性,如 conf_int 和 summary_frame()。这意味着预测区间并非额外计算,而是同一计算过程的产物,只是 forecast 方法将其丢弃。因此,发布预测时附上区间是更完整的信息呈现,且无需手动实现。
append 与 extend:增量更新的效率选择
当新数据到达时,append 可在不重新拟合的情况下更新结果对象,默认 refit=False 会复用已有参数。文章还区分了 append、extend 和 apply:append 会重新运行整个历史数据的滤波,extend 只对新观测进行滤波,在历史较长时更快,而 apply 用于不同数据集。这为增量预测提供了比重新拟合更高效的选项。
STLForecast:避免手动还原季节性的错误
手动进行 STL 分解预测需要三步:分解、预测去季节部分、加回季节成分,其中第三步容易出错。STLForecast 将整个流程封装为一个对象,自动完成这些步骤。使用时需注意传入 ARIMA 类本身而非实例,模型参数通过 model_kwargs 传递,这是该 API 容易误用的地方。
Q&A
statsmodels 中 get_forecast 和 forecast 有什么区别?
forecast 只返回点预测的数值数组,而 get_forecast 返回一个 PredictionResults 对象,其中包含预测均值、置信区间以及 summary_frame() 等,能直接获取预测的不确定性,无需手动计算。
如何在不重新拟合模型的情况下加入新数据?
使用 results 对象的 append 方法,并设置 refit=False(默认值),这样会复用已估计的参数,只在新数据上运行滤波,避免重新拟合所有参数。
append、extend 和 apply 这三个方法分别用在什么场景?
append 会在原始数据和新数据上重新运行滤波;extend 只对新观测值进行滤波,当历史数据很长时更快;apply 用于将模型应用到另一个不同的数据集,而不是当前序列的延续。
STLForecast 是如何工作的?
STLForecast 将 STL 分解与时间序列模型(如 ARIMA)结合,先减去 STL 估计的季节性,对去季节化后的数据用模型预测,再自动加回季节性成分,避免了手动还原时的符号错误和索引错位。
使用 STLForecast 时常见的错误是什么?
常见的错误是传入已实例化的 ARIMA 对象(如 ARIMA(...)),而正确做法是传入 ARIMA 类本身,并将参数通过 model_kwargs 传递。
为什么推荐使用 statsmodels 的内置方法而不是手动实现?
内置方法更短、更快、更准确,因为它们直接利用拟合结果对象中已计算好的信息,避免了手动实现时容易出现的错误,如符号错误和索引错位。