资料名称: statsmodels 官方示例 Notebook《Exponential smoothing》(文档为 dev 版,页面标注 Release 0.15.0)。
帖内资料: Notebook 的网页渲染全文(含可运行的代码单元、打印输出与七张图)、可直接下载的 .ipynb 源文件、以及 statsmodels 主仓库入口。
时间覆盖: 示例用三组年度数据(1996—2007 年沙特石油产量、1990—2005 年空气污染指标、牲畜产量序列)与一组季度数据;文档随 dev 版滚动更新,当前对应 0.15.0。
许可与引用: statsmodels 主仓库为 BSD-3-Clause,代码与文档可再分发,保留版权声明与免责条款;引用示例时注明来源页与所用版本。
适用任务: 时间序列预测的教学演示、指数平滑参数调优的对照实验、论文方法节的写法参考。
这份 Notebook 不是自己编例子,而是照着 Hyndman 与 Athanasopoulos 那本《Forecasting: principles and practice》第 7 章,把书里的例子一个个在 statsmodels 里跑一遍。所以它的价值不在「教你指数平滑是什么」,而在「同一批数据用不同设定跑出来的参数和误差长什么样」,这个对照关系书上是表格,这里是可执行代码加实际输出。
三个模型是递进的。最基础是简单指数平滑(SimpleExpSmoothing),只有水平项;往上是 Holt,加了趋势项;再往上是 Holt-Winters,趋势之外再加季节项。三者的调用接口都在 statsmodels.tsa.api 里,一行 import 就能拿到。
简单指数平滑那段用沙特石油产量做演示,跑了三个版本:第一个把平滑参数固定成 α=0.2,第二个固定成 0.6,第三个交给 statsmodels 自己优化。作者的评语是第三个才是推荐做法——前两个只是为了让你看见 α 变大时拟合线怎么贴紧原始波动。这里还埋了一个容易忽略的参数:initialization_method,固定 α 时用的是 heuristic(启发式定初值),交给优化时用的是 estimated(把初值也当参数估)。
换这个参数会改变结果,做 replicate 时如果只抄了 α 没抄它,数就对不上。
Holt 那段用牲畜产量序列一次跑了五个模型做横向对照:纯简单指数平滑、Holt 加法趋势、Holt 指数趋势、加法阻尼趋势、指数趋势加阻尼。输出是一张参数表,行是 α、β、φ、初始水平、初始趋势与残差平方和。实际跑出来的结果挺能说明问题:五种设定的 α 都落在 0.974 到 1.000 之间,β 除了简单平滑是 NaN 之外全部被优化到 0——也就是数据并不支持一个随时间变化的趋势项,趋势在这条序列上是常数。
阻尼那两组的 φ 分别是 0.98(这一组是人为固定的,作者特意说明 fit4 不让 φ 优化)和 0.9816(这一组是估出来的)。残差平方和最小的是纯 Holt 加法趋势,6004.1;纯简单平滑最差,6761.4。
Holt-Winters 那段换成季度数据(seasonal_periods=4),跑了四种组合:加法趋势配加法季节、加法趋势配乘法季节、加法阻尼配加法季节、加法阻尼配乘法季节,四组都打开了 Box-Cox 变换(use_boxcox=True)。结果表多出两个参数——季节平滑 γ 和季节初值。残差平方和从 44.03 一路降到 30.62,最低的是「加法阻尼 + 乘法季节」那一组,也就是说这条序列的季节波动幅度随水平一起放大,乘法设定更贴合。
这个结论不是靠看图形判断的,是表里的 SSE 直接给出来的。
后面还有一段专门讲内部组件:把原始值
y、水平
l、趋势
b、季节 s 与拟合值 并排成表,再画水平与斜率两条分量曲线。这一段对做诊断最有用——模型拟合得好不好,看残差之前先看水平项是不是被拉得太平、季节项是不是在年末年初跳变。作者在这里给了一句提醒:这些内部量只有在不做 Box-Cox 时才有原始量纲上的意义,转换之后它们活在变换后的空间里,别直接拿去和原序列比。
获取上有两个入口,用处不同。网页渲染版适合读和抄代码,.ipynb 源文件适合直接跑——后者是纯文本 JSON,909 KB 上下,下载下来在 Jupyter 里打开就能复现每一张图。需要注意的是文档是 dev 版,跟着主干走,版本号和函数签名都可能变;如果你引用的目的是论文复现,务必在方法节里写清 statsmodels 版本与 initialization_method 的取值,否则别人按同一段代码跑不出同样的参数。
最后说清它不适合干什么。这是教学示例,数据量小、单序列,不涉及交叉验证与滚动预测评估,也不做残差诊断的正式检验。要拿指数平滑做真实预测,缺的是样本外评估与模型选择流程,不是这段代码。
────────────────
Notebook 网页、.ipynb 源文件与主仓库的地址都放在下面,回帖就能看到。