资讯动态

时间序列预测经典方法实战:ARIMA与指数平滑全解析

发布时间:2026/10/14 16:05:51 来源:尧图企业网站定制
有一回我帮某零售企业做库存预测业务方看到我最初给的是带季节项的指数平滑模型第一反应是“这也太简单了吧”。结果后面上线跑对比那个“太简单”的模型把当时的深度学习基线按在地上摩擦。我讲这事不是想说深度学习不行而是时间序列预测这个领域经典方法的地位从来没被真正动摇过。这次就围绕经典方法综述这条线把自回归、ARIMA/SARIMA、指数平滑法这些看到标题就觉得眼熟、但真上手又容易用错的方法一层层拆开讲清楚。无论是刚入门的学生还是被业务指标追着跑的分析师这篇内容都能让你少走弯路文章里的坑都是我实际踩过的。1. 为什么现在还要认真学经典时序方法很多人一听到时间序列预测脑子里第一反应是LSTM、Transformer好像不提深度学习就不够前沿。但我接触过的真实业务项目里大部分序列只有几十到几百个样本点数据质量还远算不上干净这时候硬上深度学习模型效果大概率不如一个参数调好的经典模型。更关键的是业务决策者经常会问一个问题你预测出来的这个数凭什么深度学习给不出一个让人信服的答案ARIMA和指数平滑法反而能讲清楚这就是经典方法在工业界一直有人用的底层原因。经典方法的核心价值在于“稳”。它不像深度学习那样需要大量数据和算力一个中等配置的笔记本就能跑完大部分实验。它对数据分布的要求也相对宽松即使序列带有明显的趋势和季节性通过差分和季节分解也能处理。还有一个总被忽略的优势很多经典方法自带置信区间能直接给业务方一个预测范围而不是只给一个孤零零的数值。这一点在库存管理、销售预测这些场景里非常实用。这篇文章我打算沿着一条我自己的学习路径来写从最简单的自回归思想出发一步步过渡到ARIMA和SARIMA然后把指数平滑法家族单独拎出来讲最后再讲选型的判断框架和实操中容易翻车的细节。你会发现这些方法看着名字各不相同但背后的逻辑是相通的一旦理解了它们之间的关系面对新数据就不会再手足无措。2. 自回归家族从AR到ARIMA的那条递进线2.1 自回归的核心直觉你是在用自己预测自己先聊最朴素的自回归AR模型。什么叫自回归字面上理解就是“用自己回归自己”更准确地说是用过去时刻的自己来预测当前时刻的自己。公式写出来是这样y_t c φ1 * y_{t-1} φ2 * y_{t-2} ... φp * y_{t-p} ε_t看着有点吓人但道理和你看天气一样预测明天的气温你不会去看一张随机数字表而是会参考前几天的温度。如果连续三天下雨降温那明天大概率还是凉快如果已经出太阳两天了那明天回暖的可能性就大。AR模型把这种直觉量化了——用过去p天的数值做线性组合系数φ表示“昨天的值对今天有多大影响”。这里要注意AR模型并不是什么时间序列都能套。它默认序列是平稳的也就是均值和方差不会随时间漂移。如果一条序列整体向上爬升那“过去的值”和“现在的值”根本不是同一个基准AR模型硬做就会偏。所以后面ARIMA才引入了差分这一步来解决这个问题。2.2 移动平均项并不是你熟悉的“移动平均线”很多人听到移动平均第一反应是K线图里的MA5、MA10那条平滑曲线然后就以为MA模型是把历史数据算个平均值画条线。这个理解是错的。真实业务中MA在时间序列模型里指的是“用过去几步的预测误差来修正当前预测”不是数据本身的平均。为什么会有这种结构因为现实中的数据不完全是可控的线性关系总有一些突发冲击比如某天因为大促导致销量暴涨第二天因为库存不足又跌下来。这些冲击带来的偏差会在后面几步持续产生影响。MA项做的事情就是记住这些已经发生的偏差然后用它们去修正预测。它的方程形式是往当前值上加“前面几期误差的加权”可以说它补足了AR模型只关注历史水平、不关注预测偏差的短板。2.3 ARMA到ARIMA的关键一步为什么要做差分自回归模型AR和移动平均模型MA合在一起就是ARMA模型它能处理很多平稳序列。但问题来了真实业务数据几乎没有天然平稳的拿到的原始序列总带着趋势。这时候就轮到ARIMA里那个“I”出场了。I代表Integrated中文叫差分。所谓差分就是计算相邻时刻的差值y_t - y_{t-1}。这么做的目的是把一条有趋势的非平稳序列变成平稳序列。打个比方你站在河边观察水位只看水位高度没什么规律因为涨水期水位一直很高但如果观察水位每天的变化量就会发现它围绕某个均值波动。这个“变化量”就是我们建模的对象。所以ARIMA的完整含义就是先做差分让数据变平稳再对平稳后的数据拟合ARMA模型。链式结构是AR解决“历史值怎么影响现在”MA解决“过去的偏差怎么影响现在”差分解决“数据不平稳怎么办”。三者叠加就成了那一长串字母。3. ARIMA三参数拆解p、d、q到底各自解决什么问题3.1 用业务语言翻译三个字母ARIMA(p,d,q)这套参数很多教程直接写成“p是自回归阶数d是差分阶数q是移动平均阶数”背下来容易用起来糊涂。我换个方式讲。p是“模型回头看多少个时刻”。比如p2就是用前两天的值来预测今天相当于你在决策时参考最近两个时间点的信息。p越大模型参考的历史越长但也越复杂越容易过拟合。d是“差几次才能消除趋势”。d1表示用今天减昨天的差值来建模d2是在差值的基础上再差一次处理的是速率本身还在变化的数据比如加速上涨的曲线。q是“模型记住多少个预测偏差”。直观说如果昨天预测错了20件货这个信息是不是能帮你修正今天的预测如果这样的错误持续有规律q就会偏大。三个参数不是独立存在的它们描述的是同一段数据在水平、变化量、历史偏差三个维度上的规律定其中一个往往会影响另外两个的选择。3.2 定阶实操ACF和PACF到底该怎么看经典教材里定阶的方法是看自相关函数ACF和偏自相关函数PACF。PACF截尾ACF拖尾选ARACF截尾PACF拖尾选MA两个都拖尾就用ARMA。理论上没毛病实操中却很让人头疼。我的经验是绝大多数真实数据的ACF和PACF图都不会给你一个“干净”的截尾点尤其在样本量有限的时候相关系数本来就有噪声。你盯着图看半天这个阶数合理那个阶数也说得通根本无法形成一个确定结论。所以现在我做项目时ACF和PACF的作用主要是了解数据的整体特征比如季节周期大概是多少差分之后是否平稳而最终定阶靠的是信息准则自动搜索再叠加业务经验做判断。3.3 更快更稳的路线用信息准则做网格搜索信息准则的作用是在模型复杂度与拟合优度之间取平衡。AIC和BIC是两种最常见的标准BIC对参数数量惩罚更重因此在样本量不大的时候会倾向于选更简单的模型。这两者在自动定阶时都能用但别死抱着某一个最优结果最后的参数还要人工复核。实际项目里我一般直接用pmdarima的auto_arima做搜索代码很简单from pmdarima import auto_arima model auto_arima( y, start_p0, max_p5, start_q0, max_q5, max_d2, seasonalTrue, m12, stepwiseTrue, information_criterionaic, traceTrue ) print(model.order, model.seasonal_order)它会尝试一系列组合返回一个AIC最低的模型。但我必须提醒一句搜索出来的d阶数如果超过1一定要回到业务上审一审。我曾经遇到过自动搜索给某款快消品选出了d2差分两次之后预测结果里出现明显的负值根本没法向业务解释“为什么销量预测是负的”。后来我手动把d固定为1效果反而更好。自动搜索是提高效率的工具不是替你做决策的黑盒。4. SARIMA季节性不是把趋势放大而是另一套结构4.1 季节性与趋势的最大差别普通ARIMA处理不了季节性这是很多新手第一次碰到SARIMA时才意识到的。趋势是长期的方向性变化比如一个App用户量逐年增长季节性则是固定周期内的波动比如冰淇淋销量每年夏天高、冬天低又比如电商平台每个周五晚上订单量明显升一波。如果一条序列同时有趋势和季节你用普通ARIMA直接建模会非常别扭。因为差分只能去掉整体的趋势季节性的规律依然留在残差里。模型会试图用非季节项去拟合周期波动结果就是滞后一拍的预测夏天数据来了它还跟着春天走。所以季节性必须单独建模这就要用到带季节项的SARIMA。4.2 SARIMA的乘法结构怎么读顺便纠正一个标题里的笔误很多地方写SRIMA标准的写法应该是SARIMASeasonal ARIMA。它的完整形式是ARIMA(p,d,q) × (P,D,Q)s看起来像两套ARIMA嵌套在一起。小写的p,d,q处理非季节规律大写的P,D,Q处理周期之间的规律s是周期长度。举个例子对月度数据s12对周粒度数据s7。模型会额外加入“去年同期”“去年同月”“上周同期”这些维度的信息。这个设计背后的直觉是这个月的销量不仅跟前几个月相关还大概率跟去年同月份相关因为季节模式会在相同周期位置上重复出现。这种在时间维度上用同一套逻辑抓两次规律的思路就是SARIMA的核心。4.3 实操中季节参数怎么定以及最容易犯的错季节周期s首先看业务日历和统计口径月度数据用12周数据用7日数据也可以按周规律用7。但前提是数据长度足够。如果你只有一年零两个月的月度数据那季节项最多只能估计出一两个周期结果是极不稳定的。我的经验是至少要有3个完整周期SARIMA的季节项才有一点参考价值少于3个周期还不如用Holt-Winters或者干脆去掉季节项。另一个典型误用是拿季节性硬套节假日效应。国庆、春节这类假期的波动是日历效应它每年存在但不一定按固定相位出现SARIMA抓不住这种不规则冲击。如果你发现残差在某几个特殊月份总是爆大值那大概率是外部因素不是季节性。出现这种情况正确做法是把节假日变量作为外生回归因子而不是单纯依赖SARIMA。5. 指数平滑法从“最近的最重要”到完整趋势季节性模型5.1 指数平滑的核心思想越近的数据越有价值指数平滑法的名字听着专业思想却非常朴素做预测时不同时期的过去数据不是同等重要的越近的数据越能代表当前状态越远的数据信息价值越低。它给过去每个点分配一个权重这个权重随时间指数衰减所以叫指数平滑。用复习备考来类比就很好懂了你考试前一周做错的题目比两个月前做错的题目更有参考价值。你不会用两个月前的错题分布来预测这次考试的重点你更信任最近的状态数据。简单指数平滑就是这样一种动态加权平均写的公式很简单光滑系数alpha控制权重的衰减速度。alpha越大模型越“健忘”几乎只看最近的数据alpha越小模型越“念旧”历史数据参与决策的时间更长。alpha怎么选没有万能值我一般靠时间序列交叉验证去选在训练集上试0.1到0.3之间的几个值再看验证集表现。需要警惕的是alpha太大会让预测跟随近期噪声剧烈跳动alpha太小则反应迟钝。如果业务要求稳我倾向用小一点的alpha。5.2 Holt线性趋势在平滑基础上加一条斜率简单指数平滑只能处理没有明显趋势的序列一旦数据有整体爬升或者下降它就追不上。这时候升级版Holt线性趋势模型就派上用场了它由两部分构成一是水平值代表当前数据的基准位置二是趋势项代表水平值的变化速度。Holt模型本质上是在简单指数平滑的基础上同时对“当前值”和“当前斜率”做平滑。你爬楼梯的时候不会只看脚踩在哪一级还会感觉到是在上楼梯还是下楼梯以及每一步的高度变化。Holt模型就是把这种“感知”也建模出来了。用这个模型做的预测是以一个水平值为起点、沿着估计出来的斜率向前延伸适合那种整体走势稳定但没有季节性的序列。我这里踩过一个坑在某公司做月度活跃用户预测时一开始不加趋势项模型对上升期的预测严重偏低后来一想用户量明明每个月都在涨硬当平稳序列预测当然追不上。加上趋势项之后误差立刻降了一半。5.3 Holt-Winters加法季节性与乘法季节性的选择Holt-Winters模型是在Holt模型基础上加入了季节性成分也是在业务预测里最常见的指数平滑完全体。它同时考虑水平、趋势和季节三个分量因此能预测既有趋势又有固定周期的序列。这里有一个选择细节加法季节性和乘法季节性怎么选。加法模型假设季节波动的幅度是恒定的比如某个商品每个月销量波动大约都围绕均值上下差500件不会因为整体销量涨了波动就变大。乘法模型则假设季节波动幅度随着水平变化比如旺季整体销量高了季节波动也更大淡季销量低了波动也小。业务场景中怎么判断用散点图去看不同水平时期的季节波幅也可以直接拆成几个周期对比。我遇到过挺典型的一个例子某餐饮连锁的销量有明显的周末高峰但这个高峰的绝对量在周末上午和晚上差异很大加法模型老是低估高峰时段换成乘法模型才合理。还有一个更常见的技巧——把乘法模型取对数变换本质上就能用加法模型去拟合。实际建模时可以多试几种方式交叉验证谁更稳就选谁。另外提一句指数平滑和ARIMA并不是水火不容的两种理论。Brown和McKenzie等人很早就证明过一部分指数平滑模型可以被看作底层为ARIMA的特殊形式。所以在工程实践中两者经常会给出非常接近的结果选谁更多取决于实现成本和业务解释的方便程度。6. 拿到新数据怎么选三个问题加一张对照表6.1 先问数据有多长做选型之前我固定会问自己三个问题。第一个问题也是最容易被忽略的数据有多长没有足够样本再高级的模型也白搭。如果序列只有不到30个点我基本不碰ARIMA和SARIMA直接上简单指数平滑、Holt线性模型甚至移动平均基线。为什么因为ARIMA的参数估计本身要消耗样本p、q、季节项加起来可能就要十几个参数30个点的数据根本喂不饱这个模型最后的参数估计方差大得离谱。而指数平滑的alpha和趋势项加起来也就几个参数相对要可靠得多。如果数据在100个点左右可以考虑不带季节项的ARIMA或Holt模型。超过100个点而且有明显的年周期SARIMA和Holt-Winters才进入可选项。记住一个朴素原则样本量决定模型复杂度越大的模型需要越多的数据。6.2 再看数据里有什么成分第二个问题序列里到底有什么成分趋势、季节、噪声还是全都有判断方法很简单先画图肉眼看整体的走势。如果均值在持续抬升或降低这是趋势如果看到规律的波峰波谷比如每年12月高、2月低或者每周五高、周日低这是季节除了趋势和季节之外剩下的都是噪声。还可以看ACF的衰减速度如果自相关系数随着滞后阶数缓慢下降不截尾通常意味着存在趋势如果在滞后s阶处出现明显的高峰基本可以确定有季节性周期。判断完成分再选模型只有趋势没有季节性Holt模型、ARIMA(p, 1, q)只有季节性没有趋势简单可加的两个周期平均也可以Holt-Winters或者SARIMA趋势季节性都有直接上Holt-Winters或SARIMA如果既没有趋势也没有季节性一个简单指数平滑就够了。6.3 最后问业务要什么第三个问题是很多人不重视但实际上决定了最终交付形态的业务方到底要什么结果如果对方要解释性要你说明“为什么预测这个数”ARIMA和Holt-Winters都可以因为它们能拆解出趋势分量和季节分量清晰地告诉业务方“这个数是因为周期走到旺季被抬高了”。如果要的是批量自动预测几百条序列同时跑那就把auto_arima或ETS模型跑起来靠信息准则自动选参。如果真的要做特征工程把预测结果作为机器学习模型的一个输入特征那么一个简单的指数平滑模型往往就已经够用了没必要膨胀复杂度。下面这张对照表是我做选型时常用的一张便签模型适用场景主要参数/设置优势注意点简单指数平滑低波动、无趋势无季节的序列alpha简单可靠一句话能解释对趋势和季节性无效Holt线性趋势有明显趋势但无季节性alpha、beta能跟上直线趋势趋势会变缓变陡时可能滞后Holt-Winters趋势季节性并存水平、趋势、季节参数完全体指数平滑业务解释性好加法/乘法季节选择要验证ARIMA平稳或经差分平稳的序列p、d、q理论基础扎实可解释阶数定错容易过拟合SARIMA趋势固定周期季节(p,d,q)(P,D,Q)s同时处理趋势和季节数据长度要够周期判断要准三个问题问完之后你至少能给出一个可接受的baseline。我记得当年做某零售项目的库存预测就是从这张表一路排查下来最后用了带季节项的Holt-Winters上了线效率比大家一开始期待的深度学习模型高得多。7. 经典方法实操中最容易翻车的五个环节7.1 差分过头导致预测结果变得不可解释这是ARIMA实操里最典型的问题。自动定阶或者手动定阶时有些人为了追求平稳性会反复差分直到ADF检验的p值变得非常显著结果模型确实平稳了预测值却变成了负的销量、负的用户数连业务方都看不过去。我自己的判断标准是这样的d最多取到2超过2基本可以怀疑数据有异常值或者结构性突变靠差分是压不平的。而且每多做一次差分都是在对“变化率的变化率”建模业务解释的难度就上升一个数量级。负值预测往往出现在二次差分之后尤其在原始序列non-negative的场景下格外明显。如果ADF检验始终不显著我更倾向于先排查离群点、节假日效应而不是继续加深度差分。7.2 周期参数s搞错方向SARIMA里s是周期长度这个看似简单数据粒度一变就非常容易错。月度数据s12周数据s7日数据s7还是365要看业务周期是以周还是年为单位。曾经有一位合作过的工程师拿了每日数据直接设s12把日数据的季节周期当成月份来处理结果模型把12天当成一个周期整个预测曲线乱成一团。我的建议是设s之前先做一步数据探索按不同周期聚合看曲线有没有稳定重复的模式。比如日粒度数据先按周几做平均值对比如果周一和其他日差异很大s7再按月份看如果每年12月都有一波稳定的高峰s365的年周期通常数据量不够支撑那就宁可先只保留周季节。另外数据频率变化时s也要跟着变比如把日数据聚合成周数据后s就变成了52而不是7这一步很多人会漏掉。7.3 拿RMSE当唯一评价指标做时间序列预测评价指标用错了会得出完全相反的结论。RMSE对异常值和极端值特别敏感因为误差被平方之后一个大离群点的权重会非常大。这在库存类项目里很要命某些大促月份销量剧增误差自然也大RMSE被这些月份拉高模型在普通月份的稳定表现反而被掩盖了。我的习惯是至少同时看RMSE和MAE两组指标再结合业务场景判断。如果业务关心的是库存短缺风险那RMSE更合适因为大误差意味着缺货值得被放大关注如果业务关心的是整体预算精度那MAE更稳个别异常月份不应该主导判断。还有一种做法是分周期计算误差把大促月、普通月分开评估避免一个月的异常影响全局决策。7.4 在短序列上过度调参auto_arima很好用但它有个副作用在短序列上经常会选出一个复杂到不合理的模型。数据只有40个点它可能是出了个SARIMA(4,1,3)(2,1,0)12看着AIC很低实际上一到验证集就崩。在样本量有限的情况下宁可简化模型。我后来给自己定了一条线数据少于两个完整季节周期坚决不用季节项少于100个点p和q尽量不超过2d固定为1除非有极强的证据说明需要2。复杂模型的拟合优度永远更好在训练集上几乎一定会赢但时间序列预测拼的是样本外表现越复杂的参数在样本外不可控的风险越大。7.5 把训练测试集切分当普通分类任务来做最后一个翻车点更隐蔽有人做时间序列模型验证时像普通机器学习任务一样随机切分训练集和测试集违反了时间序列最基本的顺序约束。时间序列切分要保持时间顺序只能拿过去的样本训练、用未来的样本测试否则就是变相泄露未来信息验证结果的可靠性等于零。我一般用滚动预测方式做验证固定一个训练窗口预测后一段时间然后向前推进窗口重复这个过程。比如有100个月数据先用前60个月预测第61到第72个月再扩展到前72个月预测第73到第84个月循环到末尾。滚动预测更能贴近真实业务的使用方式因为模型的参数在线上也是定期更新的不是训一次就永久不变。这些年做下来我最大的体会是经典方法真正的门槛不在公式而在对数据形态的判断和对业务语境的敏感度。你花在搞清楚数据成分、验证方式、评价指标上的时间往往比调参本身更值钱。愿意静下心把ARIMA这几个字母背后的逻辑吃透指数平滑那套权重思想搞明白就已经能解决绝大多数业务预测问题比急着上深度学习要实在得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑