想象你是深巷面馆里守着一锅老汤的厨师。每天打烊前,你都会舀一勺尝尝,然后决定明天要不要加盐。要预测明天的味道,你靠三样本事:一是记住昨天的味道——汤不会一夜之间从清淡变齁咸,这叫自相关;二是记住上次手抖放多盐的教训——意外会有惯性,需要纠正,这叫误差记忆;三是不看绝对咸度,而看“比昨天又咸了多少”——锅底在慢慢收汁,口味基线在漂移,这叫差分。你还有一条铁律:每周五老主顾多,汤要更咸一点,这叫季节性。即使把这一切都记在册子上,你也明白:明天猜得准,明年猜不准——预测越远,心里越没底。这本“老汤账本”,就是时间序列分析里的 ARIMA 与 SARIMA 模型。本文带你从“尝味道”到“写账本”,看懂这套传统方法如何在销售预测中继续发光。

岗位关联

时间序列的看家本领,机器学习建模的对照基准。掌握 ARIMA/SARIMA,你就有了稳定的“兜底方案”,还能读懂数据中的趋势、季节与不确定性——面试与实战都绕不开。

目录
  1. 可视化演示
  2. 序列特征基础
  3. AR自回归
  4. MA滑动平均
  5. ARIMA整合
  6. SARIMA扩展
  7. 模型诊断
  8. 预测区间
  9. 实战应用
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

动态演示ARIMA/SARIMA的核心机制,通过架构/数据/状态/性能四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

ARIMA/SARIMA:ARIM ARIMA模型基本原理与三大组 自回归AR组件与移动平均MA组 核心机制可视化 ARIMA/SARIMA整体架构与关键组件

序列特征基础

老厨师要学的是“这锅汤的脾气”。如果汤今天像清水、明天像卤汁、后天烧糊了,任何经验都无从谈起。同样,时间序列建模的第一问是:这条曲线有没有一个“稳定的性格”?如果序列的均值(基础咸度)和方差(咸淡起伏程度)不随时间的起点而改变,我们就说它是平稳的。平稳,是 ARIMA 能施展记忆术的前提。

为什么平稳如此重要?因为 ARIMA 的本质是“用过去的规律推未来”。如果序列本身在漂移——汤越煮越咸、锅底越收越浓——昨天的规则今天就失效了。判断平稳性最直观的办法是看曲线是否围绕一条水平线上下波动;更严谨的做法是用单位根检验,比如 ADF 检验,它相当于问厨师:“汤的性格有没有越走越偏?”

如果汤的性格变得太快,厨师还有一招:不看“今天多咸”,而看“今天比昨天又咸了多少”。这个“又”字,就是差分。对非平稳序列先做一阶差分,把它变成“变化量的序列”,往往一下子就安稳了。反过来,如果差分后的序列纯属随机——今天咸一点、明天淡一点且毫无关联——那就是白噪声,像一锅完全失忆的汤,没有任何规律可学,建模到此为止。

回到面馆:厨师把“咸度台账”改写成“每日变化台账”之后,发现这个新序列终于稳定了。于是,他可以在“变化”的基础上,重新谈记忆与教训——这正是通往 ARIMA 的桥梁。

yt′=yt−yt−1\displaystyle y'_t = y_t - y_{t-1}
一阶差分:拿今天的读数减去昨天的读数,把“水平”翻译成“变化”,是驯服趋势的入门招。
  1. 今天读数 y_t今天从汤锅里舀出的咸度读数,代表当前时刻的观测值。
    yty_t
  2. 昨天读数 y_{t-1}昨天同一时刻的咸度读数,是离我们最近的历史记忆。
    yt−1y_{t-1}
  3. 一阶差分 y'_t两者相减得到的“变化量”,是后期建模真正使用的序列。
    yt′=yt−yt−1y'_t = y_t - y_{t-1}

AR自回归

汤不会一夜之间从清淡变齁咸。厨师的经验是:如果昨天的汤偏咸,今天的汤十有八九还偏咸,只是程度略有收敛。这种“今天的值依赖昨天的值”的直觉,就是自回归(AR)模型:用过去的自己解释现在的自己。

最朴素的 AR(1) 模型只有一句口诀:“今天的味道 = 一个基准水平 + 昨天的味道按 φ 的比例延续 + 一点随机扰动”。系数 φ 是这锅汤的“惯性系数”:φ 接近 1,说明昨天和今天几乎一个样,记忆很长;φ 是负数,说明今天总跟昨天唱反调;|φ| 必须小于 1,否则记忆无限放大,汤的味道会爆炸,这对应数学上的平稳性要求。把记忆扩展到过去 p 天,就得到 AR(p) 模型。

那么 p 取几才算合适?这就要用到偏自相关函数(PACF)。PACF 回答的问题是:“排除昨天、前天……层层传递的间接影响之后,第 k 天前的味道对今天还有没有直接作用?”它就像厨师逐一审问前几天的记录:剔除中间链条后,谁的“直接责任”最大。如果 PACF 在第 p 阶之后突然接近 0(俗称“截尾”),说明记忆只往前延伸 p 天,这就是 p 的选法。

老厨师合上账本:自回归部分解决的是“汤自己有惯性”这一层规律。但账本还有另一半——光记住值还不够,还得记住自己犯过的错。

yt=c+φyt−1+εt\displaystyle y_t = c + \varphi y_{t-1} + \varepsilon_t
AR(1):今天的咸度由昨天的咸度按 φ 的力度延续,c 是长期基准,ε_t 是今天的意外口味。
  1. 当前值 y_t今天的咸度读数,是我们想预测的对象。
    yty_t
  2. 常数项 c厨师心中“长期基础咸度”的恒定水平,汤味最终的归宿。
    cc
  3. 记忆项 φy_{t-1}昨天的味道以 φ 的力度延续到今天,φ 越大记性越好。
    φyt−1\varphi y_{t-1}
  4. 随机扰动 ε_t今天无法预知的意外,比如手一抖多撒了把盐。
    εt\varepsilon_t

MA滑动平均

有一次,厨师手抖多放了二两盐。第二天,他下意识少放了一点,把昨天的失误扳回来。这类“记住上次的意外,并做补偿”的机制,就是滑动平均(MA)模型。它不直接记昨天的咸度,而记昨天的“失误量”——也就是模型上一期的预测误差。

MA(1) 的公式可以读成:“今天的味道 = 基准水平 + 今天的意外 + 昨天意外带来的后续影响”。θ 决定了对昨日失误的补偿力度:若 θ 是负的,昨天咸过头,今天就自动淡一档;若 θ 是正的,昨天的意外会“惯性延续”一段时间。MA 特别擅长刻画一次性冲击——比如某天盐罐打翻了、某天来了个临时大厨——这类冲击不会永久改变汤的性格,但会留下短期的涟漪。

定 q 阶数靠的是自相关函数(ACF)。ACF 记录的是“相隔 k 天的两次读数之间还有多大相关”。如果 ACF 在 q 阶后突然截尾,说明意外的影响只延续 q 天,忘记之后天地清净,这就是 MA(q) 的定阶方式。打个比方:AR 是“汤的记忆”,MA 是“失误的记忆”;PACF 用来审问“谁直接影响今天”,ACF 用来追踪“错误的涟漪传多远”。

面馆的账本越来越完整了:一页记“味道的惯性”,一页记“失误的涟漪”。可厨师还面临一个烦恼——锅底在慢慢收汁,口味基线一路漂移。他需要把两页账本和“差分”这味调料放在一起熬。

yt=c+εt+θεt−1\displaystyle y_t = c + \varepsilon_t + \theta \varepsilon_{t-1}
MA(1):今天的值由今天的意外和昨天意外的残留共同决定,是对短期冲击的记忆与纠偏。
  1. 今日扰动 ε_t今天调味时的随机误差,是全新的、没法提前知道的意外。
    εt\varepsilon_t
  2. 昨日误差残留 θε_{t-1}昨天的失误在今天的补偿或延续,θ 控制补偿力度。
    θεt−1\theta \varepsilon_{t-1}
  3. 完整方程基准加上今日扰动和昨日误差的影响,构成今天的味道。
    yt=c+εt+θεt−1y_t = c + \varepsilon_t + \theta \varepsilon_{t-1}

ARIMA整合

ARIMA 就是把三样东西炖进一锅:AR(对过去值的记忆)、I(差分,把非平稳驯成平稳)、MA(对过去失误的记忆)。记成 ARIMA(p,d,q),就像一张配方卡:p 是记几天的味道,d 是差几次分,q 是记几天的失误。

差分在这里真正登场。如果汤越煮越咸(趋势),我们不直接预测咸度,而是先做 d 次差分得到“变化量的变化量”,再对这个稳定序列谈 AR 和 MA。d 的本质是“剥掉几层趋势外衣”:d=1 对付线性趋势,d=2 对付加速变化,但绝大多数业务数据一次差分就够——剥多了,连规律本身也被剥没了。

建模有五步:第一步,检验平稳性,不平就差分;第二步,用 ACF/PACF 或信息准则初定 p、q;第三步,拟合参数;第四步,诊断残差,确认没有遗漏规律;第五步,预测并给出区间。这套流程像厨师试菜:先确认汤的性格稳定,再定菜谱,按谱下料,最后尝一口确认“没有意外的味道”。整合后,ARMA 的公式整体作用在差分后的序列上。

厨师长舒一口气:有了 ARIMA,普通日子的咸度基本能拿捏。可每到周五,老主顾扎堆,汤总得偏咸两分——账本上有一股“每周准时”的力量,普通 ARIMA 学不会。这就到了 SARIMA 登场的时候。

yt′=c+∑i=1pφiyt−i′+∑j=1qθjεt−j+εt\displaystyle y'_t = c + \sum_{i=1}^{p} \varphi_i y'_{t-i} + \sum_{j=1}^{q} \theta_j \varepsilon_{t-j} + \varepsilon_t
通用 ARIMA(p,d,q):在差分后的平稳序列上,叠加 p 项自回归记忆和 q 项误差记忆。
  1. 差分序列 y'_t对原始序列做 d 次差分后的结果,是模型真正“谈判”的对象。
    yt′y'_t
  2. 自回归部分过去 p 期变化量的加权记忆,权重由 φ_i 决定。
    ∑i=1pφiyt−i′\sum_{i=1}^{p} \varphi_i y'_{t-i}
  3. 滑动平均部分过去 q 期误差的补偿,权重由 θ_j 决定。
    ∑j=1qθjεt−j\sum_{j=1}^{q} \theta_j \varepsilon_{t-j}
  4. 完整方程基准加上自回归记忆、误差补偿和今日扰动,构成对变化量的预测。
    yt′=c+∑i=1pφiyt−i′+∑j=1qθjεt−j+εty'_t = c + \sum_{i=1}^{p} \varphi_i y'_{t-i} + \sum_{j=1}^{q} \theta_j \varepsilon_{t-j} + \varepsilon_t

SARIMA扩展

面馆有个铁律:周五多放盐,周一少放盐。这股“每周重复”的节奏,就是季节性。普通 ARIMA 只记得“昨天”和“前几天的失误”,却不知道“去年的今天”或“上周五”同样重要。SARIMA 就是在 ARIMA 的基础上,再叠加一套“同期记忆”:既有普通差分,也有季节差分;既有普通 AR/MA,也有季节 AR/MA。

SARIMA 的完整记法是 SARIMA(p,d,q)(P,D,Q)_s。括号里的 p,d,q 是“日常记忆”,第二个括号的 P,D,Q 是“季节记忆”,s 是周期长度——月度数据 s=12(一年12个月),日度数据 s=7(一周7天)。季节差分 D 的含义是“和去年同期比,今年变化了多少”,它专门对付“每年同月都更旺”这类规律。

公式里的季节自回归项 Φ y'_{t-s},读作“去年同月的变化量,以 Φ 的力度影响今年本月”;季节滑动平均项 Θ ε_{t-s} 则是“去年同期的意外,给今年一个提示”。把日常记忆和季节记忆写在同一本账上,模型才真正看得懂“周五效应”和“年货季”。识别 s 的办法很简单:画出按月或按周聚合的曲线,看峰值是否周期性地重复——就像厨师发现每周五客人变多一样。

现在,老厨师连“去年腊月那锅咸到发苦的汤”都记进账本了。但他还不敢立刻挂牌营业——他得先尝一口预测剩下的“余味”,确认没有漏掉任何规律。

yt′=c+∑i=1pφiyt−i′+∑i=1PΦiyt−is′+∑j=1qθjεt−j+∑j=1QΘjεt−js+εt\displaystyle y'_t = c + \sum_{i=1}^{p} \varphi_i y'_{t-i} + \sum_{i=1}^{P} \Phi_i y'_{t-is} + \sum_{j=1}^{q} \theta_j \varepsilon_{t-j} + \sum_{j=1}^{Q} \Theta_j \varepsilon_{t-js} + \varepsilon_t
SARIMA 完整方程:在普通差分与季节差分的双重处理下,同时学习短期记忆与同期记忆。
  1. 处理后序列 y'_t经过普通差分和季节差分双重处理的序列,新账本的书写对象。
    yt′y'_t
  2. 非季节记忆过去 p 期变化量和 q 期误差的常规记忆,与 ARIMA 相同。
    ∑i=1pφiyt−i′+∑j=1qθjεt−j\sum_{i=1}^{p} \varphi_i y'_{t-i} + \sum_{j=1}^{q} \theta_j \varepsilon_{t-j}
  3. 季节自回归过去 P 个“同期”的值,如去年、前年同月的变化量。
    ∑i=1PΦiyt−is′\sum_{i=1}^{P} \Phi_i y'_{t-is}
  4. 季节滑动平均过去 Q 个“同期”的误差提示,如去年同月的意外。
    ∑j=1QΘjεt−js\sum_{j=1}^{Q} \Theta_j \varepsilon_{t-js}
  5. 完整方程把日常项和季节项拼在同一本账本上,形成 SARIMA 的完整配方。
    yt′=c+∑i=1pφiyt−i′+∑i=1PΦiyt−is′+∑j=1qθjεt−j+∑j=1QΘjεt−js+εty'_t = c + \sum_{i=1}^{p} \varphi_i y'_{t-i} + \sum_{i=1}^{P} \Phi_i y'_{t-is} + \sum_{j=1}^{q} \theta_j \varepsilon_{t-j} + \sum_{j=1}^{Q} \Theta_j \varepsilon_{t-js} + \varepsilon_t

模型诊断

厨师有个职业习惯:预测明天的咸度后,他会把实际味道和预测值之间的差(残差)端起来闻一闻。如果残差里还残留着“可辨认的规律”——比如总是逢周五就偏咸——说明模型还没学透;如果残差纯属随机、淡而无味,说明该记的都记下了,这就是“残差白噪声”。

判断残差是否白噪声有两条路子:一是看残差的 ACF 图,如果几乎全部落在置信带内,没有显著的钉子,就算干净;二是用 Ljung-Box 检验,它给出一个 p 值,p 值大(比如大于 0.05)说明“没有证据表明残差还有相关”——相当于化验单显示汤里没有异常添加物。

另一个问题是:p、q 到底取多大?加参数总能降低训练误差,但会把噪声也背下来,这叫过拟合,好比厨师把 100 天前某个客人随口一句“淡了”也记进配方,反而干扰了判断。赤池信息准则(AIC)就是来当裁判的:它把“拟合得好不好”和“参数多不多”放在同一个天平上,惩罚花哨的模型。选 AIC 最小的模型,就是在“记得牢”和“不过度设计”之间找平衡。

残差干净、AIC 叫好,厨师的菜谱终于可以贴到墙上。可明天开店前,他还要回答老板娘一句话:“明年的这时候,咸度能保证吗?”答案显然不能——预测越远,心里越没底。

AIC=−2ln⁡(L)+2k\displaystyle \mathrm{AIC} = -2\ln(L) + 2k
AIC 越小越好:前半项惩罚“解释不了数据”,后半项惩罚“堆参数”,是模型选择的裁判。
  1. 对数似然 ln(L)模型对当前数据解释能力的指标,似然越大说明模型越贴合数据。
    ln⁡(L)\ln(L)
  2. 损失项 -2ln(L)把“解释力”翻转为损失,让数值越小代表越贴合。
    −2ln⁡(L)-2\ln(L)
  3. 复杂度惩罚 2k参数个数 k 乘以 2,参数越多、惩罚越重,防止过度设计。
    2k2k
  4. 完整准则贴合损失加复杂度惩罚,取最小者为优选模型。
    AIC=−2ln⁡(L)+2k\mathrm{AIC} = -2\ln(L) + 2k

预测区间

面对“明天有多咸”和“明年今天有多咸”这两个问题,厨师的底气完全不同:明天只要原料不变、火候稳定,误差很小;明年则要叠加 365 天里无数个意外,谁也不敢打包票。时间序列预测的置信区间,正是这种“越远越虚”的量化表达。

点预测只是区间的中心——它是模型给出的最佳猜测。而置信区间则回答:“真实值以 95% 的可能性落在哪个范围?”关键规律是:误差会随预测步数 h 累积。每多预测一步,就多背一个随机扰动,方差近似按 h 线性增长,于是区间半宽按根号 h 变宽。所以才会有“扇形图”:紧贴今天的地方很窄,越往后越宽,像一把张开的折扇。

公式里的 z 是标准正态分布的分位数:95% 置信水平对应约 1.96,90% 对应 1.645。它决定了扇子的“开度”。σ̂ 是单步预测误差的标准差估计,相当于厨师对“自己手抖程度”的日常评估。把中心、分位数、误差标准差和步数累积乘在一起,就得到了诚实且有边界的预测区间。

老板娘看着那把“折扇”满意地点点头:“知道什么时候敢打包票,什么时候该留余地,这才叫专业。”现在,这套手艺要离开深巷,开进连锁店了。

y^n+h±z 1−α/2⋅σ^h\displaystyle \hat{y}_{n+h} \pm z_{\,1-\alpha/2}\cdot \hat{\sigma}\sqrt{h}
预测区间:以点预测为中心,半宽随步数 h 按根号增长,越往远处越宽的“扇面”。
  1. 点预测中心 ŷ_{n+h}第 h 步前方的点预测,是区间的对称中心。
    y^n+h\hat{y}_{n+h}
  2. 正态分位数 z_{1-α/2}由置信水平决定的分位数,95% 时约为 1.96。
    z 1−α/2z_{\,1-\alpha/2}
  3. 单步误差 σ̂一步预测误差的标准差估计,刻画厨师日常手抖程度。
    σ^\hat{\sigma}
  4. 累积因子 √h误差随步数 h 按平方根累积,这一步让区间越扇越开。
    h\sqrt{h}

实战应用

老厨师开了连锁分店。他不再只为一锅汤操心,而要同时预测 50 家门店未来一个月的销量:备多少面粉、卤多少牛肉、雇多少人手。这就是 ARIMA/SARIMA 最常见的舞台——销售预测与需求预测。数据按月汇总、天然带旺季淡季,SARIMA 简直是为它量身定做。

实战工作流通常是:拿到三到五年的历史销售数据,清洗异常值、对齐节假日,做平稳性检验;然后用 ACF/PACF 和 AIC 初定 p、d、q 与季节阶数;接着用工具库(如 Python 的 statsmodels)拟合 SARIMA;最后在留出的“未来一段真实数据”上评估效果。行业里有个心照不宣的做法:任何复杂的深度学习模型,都要先赢过 SARIMA 这个“老厨师”才算有说服力——它参数少、可解释、训练快,是标准的基准线。

评估指标常用 RMSE(均方根误差):把每个样本的真实值与预测值的差平方、求平均、再开方。它像一把统一的尺子,量出“平均每次预测偏出去多远”。RMSE 对大误差特别敏感,适合销售这种“一次备货错了就亏一整车”的场景。此外 MAPE(平均绝对百分比误差)则更直观——“平均偏了百分之几”,适合向业务方汇报。

从深巷一口锅,到连锁五十家店,老厨师的账本方法论始终没变:稳定性格、记住值、记住失误、看见周期、保持谦逊。这份“传统手艺”,至今仍是数据科学工具箱里最锋利的一把刀。

RMSE=1n∑i=1n(yi−y^i)2\displaystyle \mathrm{RMSE} = \sqrt{\frac{1}{n}\sum_{i=1}^{n}\left(y_i - \hat{y}_i\right)^2}
RMSE 越小越好:把每个点的预测误差平方平均后开方,与原始数据同单位、同量纲,直观可比。
  1. 残差 y_i - ŷ_i第 i 个样本的真实销量减去预测销量,是判断偏差的起点。
    yi−y^iy_i - \hat{y}_i
  2. 平方放大残差平方处理,让大偏差被格外惩罚,同时避免正负相抵。
    (yi−y^i)2\left(y_i - \hat{y}_i\right)^2
  3. 均方误差对所有样本的平方误差求平均,得到整体平均偏差水平。
    1n∑i=1n(yi−y^i)2\frac{1}{n}\sum_{i=1}^{n}\left(y_i - \hat{y}_i\right)^2
  4. 开方还原量纲开根号让指标回到“份/月”等单位,方便和业务直接对话。
    1n∑i=1n(yi−y^i)2\sqrt{\frac{1}{n}\sum_{i=1}^{n}\left(y_i - \hat{y}_i\right)^2}

AI 应用场景

电商月度销售预测

阶段:模型训练与预测

解决的问题:传统做法靠运营拍脑袋或“同比去年增长 10%”,既看不透趋势拐点,也接不住大促后的回落惯性。SARIMA 自动完成趋势分解、季节记忆和误差补偿,把“凭感觉”变成“有账本”。

具体案例:某服装电商积累 5 年 60 个月的销售额,年中有 618、年末有双 11。用 SARIMA(2,1,1)(1,1,1,12) 建模,预测未来 3 个月销量并给出 95% 区间,采购按区间上沿备货、财务按下沿做保守预算。

连锁便利店日需求预测

阶段:特征工程与需求预测

解决的问题:生鲜牛奶保质期短,备少了缺货流失顾客,备多了到期报废。日粒度数据带有明显的“周季节”(周末销量高),普通模型抓不住 7 天节律。

具体案例:对某连锁便利店每家门店的牛奶日销量单独建立 SARIMA(1,1,1)(1,0,1,7) 模型,输出未来 7 天逐日点预测与区间,门店采购员按区间上沿下订单,报废率下降约 18%。

酒店入住率预测

阶段:数据准备与预测

解决的问题:酒店定价与人力排班都依赖未来数周的需求预判;入住率受周末和节假日双重周期影响,线性回归难以同时刻画两套节律。

具体案例:某连锁酒店用季度数据训练 SARIMA 模型,以周(s=7)为季节周期,预测未来 14 天入住率。前台根据区间宽度决定是否开启“当日特价”,旺季收益提升约 8%。

Python 演示

python40 行
# -*- coding: utf-8 -*-"""SARIMA 月度销售预测演示"""import numpy as npimport pandas as pdfrom statsmodels.tsa.statespace.sarimax import SARIMAX  def main():    # 1. 生成 10 年的月度销售序列: 趋势 + 年度季节 + 噪声    np.random.seed(42)    n = 120    months = np.arange(n)    trend = 0.12 * months    season = 15 * np.sin(2 * np.pi * months / 12)    noise = np.random.normal(0, 3, n)    sales = 100 + trend + season + noise    index = pd.date_range("2014-01-01", periods=n, freq="MS")    series = pd.Series(sales, index=index)     # 2. 前 9 年训练, 最后 12 个月测试    train = series.iloc[:-12]    test = series.iloc[-12:]     # 3. 拟合 SARIMA(1,1,1)(1,1,1,12)    model = SARIMAX(train, order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))    result = model.fit(disp=False)     # 4. 预测未来 12 个月并取 95% 置信区间    fc = result.get_forecast(steps=12)    mean = fc.predicted_mean    ci = fc.conf_int(alpha=0.05)     # 5. 输出预测与真实值的对比误差    rmse = float(np.sqrt(np.mean((test.values - mean.values) ** 2)))    print("预测均值:", mean.round(2).tolist()[:6])    print("RMSE:", round(rmse, 2))  if __name__ == "__main__":    main()
目的:生成带趋势和年度季节的模拟月度销量,训练 SARIMA 模型预测未来 12 个月并计算 RMSE。
  1. series = pd.Series(sales, index=index)把 NumPy 数组包装成带时间索引的序列,方便按月份切片和对齐。
  2. train = series.iloc[:-12]用前 9 年训练,留最后 12 个月当“考场”,防止模型作弊。
  3. SARIMAX(train, order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))声明模型结构:日常项 p=1,d=1,q=1,季节项 P=1,D=1,Q=1,周期 s=12。
  4. result = model.fit(disp=False)让模型在训练数据上估计所有系数,不打印迭代过程。
  5. fc = result.get_forecast(steps=12)生成未来 12 步的预测对象,相当于一次性算出未来一年的账。
  6. mean = fc.predicted_mean取出每一步的点预测值,即“扇面”的中心轴线。
  7. ci = fc.conf_int(alpha=0.05)取出 95% 预测区间,展示“越远越宽”的不确定性。
  8. rmse = float(np.sqrt(np.mean((test.values - mean.values) ** 2)))在测试集上计算 RMSE,量化平均偏差。

常见误区

误区觉得序列“不平稳就多差几次”,反正 d 越大处理得越干净,折腾到平稳为止。

正解一次差分通常就足以消除趋势,过度差分会把真实规律也洗掉,让信号变成噪声,相当于厨师为求汤清,反复换水把鲜味全煮没了。判断是否还需要差分,应借助 ADF 等单位根检验,而不是凭感觉多次操作。

为何常见:“平稳”听起来像“更干净”,于是误把反复处理当成打磨,忽略了建模要的是保留规律而非消灭一切波动。

误区p、q 加到 5、6 甚至更大,觉得参数越多、拟合越精细,预测当然越准。

正解真实的时间序列记忆通常是有限的——没人会记得 100 天前某次失误的细节。阶数过高会背下噪声,即过拟合,在训练集上漂亮、在测试集上翻车。AIC/BIC 正是用来惩罚这种“记太多”的模型。

为何常见:训练误差随阶数单调下降的直观体验,让人误以为“更贴合历史”就等于“更会预测未来”。

误区认为 ARIMA 能预测任何数据,给它足够多的历史,它就能学到一切规律。

正解ARIMA 本质是线性模型,擅长捕捉平稳化后的线性自相关;对非线性交互、突变拐点、外部变量冲击,它无能为力。数据里有促销、天气等外生因素,应该考虑 ARIMAX 或更复杂的模型。老厨师的经验再丰富,也算不准突然改行做火锅的店。

为何常见:古典教科书把 ARIMA 讲得神乎其神,加上名字里带“整合”显得高深,放大了它的能力边界。

误区把回归模型里“上下等宽”的置信带直接套到时间序列上,以为未来 30 步的区间和明天一样宽。

正解时序预测的误差会随步数累积,区间半宽按根号 h 增长,呈现扇形。只报点预测不报区间,等于只告诉老板“明天大约咸”,却不告诉他“一个月后可能齁死也可能没味”。

为何常见:大多数教程的配图只画了中心线,业务汇报也习惯只给一个数,区间概念被长期忽视。

误区觉得 SARIMA 只是多两个参数,直接用 ARIMA 拟合带周期的数据差别不大。

正解如果序列存在稳定周期而模型不设季节项,模型会把“每年腊月的峰值”当成无法解释的冲击,残差里每个周期都残留强相关,诊断必然不通过。正确做法是用季节差分和季节 AR/MA 显式建模,把周期写进配方。

为何常见:季节周期肉眼可见却容易被“数据预处理”环节忽略,尤其是初学阶段还没养成画 ACF 检查残差的习惯。

面试题

Q1. 在 ARIMA(p,d,q) 中,参数 d 表示什么?

单选题 · easy

  • A.自回归项的阶数
  • B.差分运算的次数← 正确答案
  • C.滑动平均项的阶数
  • D.季节循环的周期

答案:B。ARIMA 的三个字母中,I 代表整合(Integrated),对应的 d 就是差分次数,用来把非平稳序列变平稳。A 是 p 的含义,C 是 q 的含义,D 是 SARIMA 中 s 的含义。想象厨师处理“越煮越咸”的趋势——差分几次就剥几层趋势外衣,这就是 d。

Q2. AR(1) 模型的系数 φ 接近 1 时,意味着什么?

单选题 · easy

  • A.序列是纯粹的白噪声
  • B.今天与昨天几乎无关
  • C.今天会明显延续昨天的状态← 正确答案
  • D.模型一定会预测失败

答案:C。φ 是“昨天的味道延续到今天的力度”,接近 1 说明惯性极强,今天的值几乎复刻昨天,汤的味道一天一变不了多少。白噪声要求序列前后无关,与 φ≈1 矛盾;“一定失败”也太绝对,强惯性同样可以被建模。

Q3. 下列哪个序列最接近白噪声的特征?

单选题 · easy

  • A.稳步上升的销售曲线
  • B.每月固定重复的周期
  • C.前后无关的随机波动← 正确答案
  • D.严格等于常数的直线

答案:C。白噪声意味着序列完全失忆:每个点都是独立随机波动,任何历史信息都无法预测下一个点。稳步上升和固定周期都存在可学规律,常值直线则是确定性信号,三者都不构成“纯随机”。就像一锅完全随机的汤,昨天咸淡和今天毫无关系。

Q4. 判断 MA(q) 模型的阶数时,通常观察什么特征?

单选题 · mid

  • A.ACF 在 q 阶后截尾← 正确答案
  • B.PACF 在 q 阶后截尾
  • C.ACF 呈缓慢拖尾
  • D.PACF 呈缓慢拖尾

答案:A。MA(q) 描述“失误的涟漪”,误差的影响只延续 q 天,所以 ACF(相关性随滞后的衰减)会在 q 阶后突然归零,即截尾。PACF 截尾指向 AR(p);ACF 拖尾则是 AR 或 ARMA 的线索。定阶口诀是:PACF 截尾选 AR,ACF 截尾选 MA。

Q5. 对月度销售数据做 SARIMA 建模时,季节周期 s 通常取多少?

单选题 · mid

  • A.4(季度数据周期)
  • B.7(周数据周期)
  • C.12(年度循环月数)← 正确答案
  • D.30(每月天数近似)

答案:C。月度数据的年度季节效应逐月重复,一年 12 个月,所以 s=12,对应“今年 1 月和去年 1 月相关”。s=4 适用于季度数据,s=7 适用于日度数据的周季节。选对 s,等于告诉模型该翻哪一页旧账本。

Q6. 关于 AIC,下列说法正确的是?

单选题 · mid

  • A.AIC 越小说明过拟合越严重
  • B.AIC 越小说明拟合与复杂度的权衡越优← 正确答案
  • C.AIC 越小说明残差一定是白噪声
  • D.AIC 越小说明样本数量越充足

答案:B。AIC = -2ln(L) + 2k,前半项奖励拟合好,后半项惩罚参数多。取最小值时,模型在“解释数据”和“保持简洁”之间达到平衡。AIC 只用于模型间相对比较,不保证残差白噪声,也不反映样本量本身。

Q7. 哪些方法可用于判断模型残差是否为白噪声?

多选题 · mid

  • A.观察残差 ACF 是否显著相关← 正确答案
  • B.借助 Ljung-Box 检验的 p 值← 正确答案
  • C.比较残差均值是否接近零← 正确答案
  • D.直接增大 p 和 q 的阶数

答案:ABC。残差白噪声的标准是“没有任何可学规律”:ACF 无明显尖峰、Ljung-Box 检验 p 值偏大、均值接近零且无系统模式。增大 p、q 是在调整模型结构而非诊断残差,属于“开药方”而不是“做体检”。

Q8. 随着预测步数 h 增大,ARIMA 的预测区间通常会怎样变化?

单选题 · hard

  • A.始终保持不变
  • B.按根号 h 的比例逐渐变宽← 正确答案
  • C.先变宽再变窄
  • D.随 h 增大反而变窄

答案:B。每多预测一步都要叠加一个新的随机扰动,误差方差近似线性累积,所以区间半宽按根号 h 增长,形成扇形。区间不可能收窄,因为信息只会随距离减少。这就像问厨师“明年今天多咸”——他只能给出一个比明天宽得多的范围。

Q9. 关于差分操作,下列说法正确的有哪些?

多选题 · hard

  • A.差分能让带趋势的序列变平稳← 正确答案
  • B.差分次数越多模型一定越稳定
  • C.过度差分会损失真实信息← 正确答案
  • D.SARIMA 还需考虑季节差分← 正确答案

答案:ACD。差分通过“相邻相减”剥离趋势,是让非平稳变平稳的常用手段;但差分次数不是越多越好,过度差分会把长期规律一并洗掉,如同反复换水煮没了鲜味;季节差分专门处理周期性的漂移。差分的目的不是“数值稳定”,而是“保留规律的同时消除趋势”。

Q10. 同一训练集上,模型 A 的 AIC=1200,模型 B 的 AIC=1180,以下结论正确的是?

单选题 · extreme

  • A.模型 A 一定比模型 B 更准确
  • B.模型 B 的拟合与复杂度权衡更优← 正确答案
  • C.两个模型的残差必为白噪声
  • D.AIC 越小说明过拟合越严重

答案:B。AIC 是相对比较准则,越小代表“拟合度与复杂度”的综合权衡越好,所以 B 优于 A,但不代表 B 已是最佳或绝对无缺;更不保证残差白噪声。D 恰好说反,AIC 的惩罚项正是用来抑制过拟合的。选模型时要结合残差诊断和业务验证,而不是只看一个数字。