☰
ARMA模型原理与实操:从平稳性检验到定阶预测
2026/10/15 14:29:13 网站建设 项目流程

1. 从“知道概念”到“用它分析”:为什么上一篇结束后要聊ARMA

如果你是通过系列文章读到这里的,那么你对时间序列的基本画风应该有概念了:一堆按时间顺序排列的数据点,往往带有相关性、趋势、季节性,甚至随机波动。上篇我们处理了如何把非平稳序列“弄稳”——差分、变换、理解ADF检验这类工具。这一篇,我们可以进入一个更有“建模感”的话题——ARMA模型,也就是自回归移动平均模型,它面向的是已经平稳下来的时间序列。

说白了,ARMA要干的事,是在一个序列“稳定”之后,把序列自身的过去值、过去的预测误差,组合成一套可解释的数学关系,用来描述当前值是怎么产生的。它不是拍脑袋预测未来,而是想尽量准确地捕捉序列中的“惯性”——今天和昨天有没有关系,昨天的误差会不会影响今天的观测,诸如此类。

为什么不能忽略ARMA呢?因为它是时间序列建模的“地基”之一。拿建筑来打比方,如果你把ARIMA比作一栋能住的房子,ARMA就是支撑房子的钢筋混凝土框架。ARIMA全称是差分自回归移动平均模型,它中间的“差分”就是把非平稳数据变平稳,“自回归移动平均”就是在平稳之后用ARMA来建模。换句话说,几乎你后面会碰到的所有经典时序模型,ARIMA、SARIMA,甚至一些稍复杂的变形,底座都离不开ARMA的逻辑。把ARMA吃透,后续再看其他模型就轻松很多。

这一篇的内容,主要面向已经会做基本数据检查、会画ACF/PACF图,又不想停留在“调用一下工具包”层面的学习者。我们会从ARMA到底在做什么聊起,然后把建模步骤拆开,把定阶、参数估计、模型诊断这些关键环节掰开揉碎地讲清楚,最后再分享一些实操里容易踩的坑。内容不烧脑,但信息密度比较高,边看边配合一个小例子走一遍流程,效果会很好。

2. ARMA的理论骨架:自回归和移动平均到底在“回归”什么

2.1 自回归(AR)部分:序列在模仿自己的过去

ARMA的第一个组成单元是AR,也就是自回归。这个名字听起来有点唬人,但本质很直白:用序列前几天的值,来预测今天的值。比如今天是某产品的日销量,明天会是多少?一个朴素的想法是,明天销量和今天的销量往往有关,我们可以写成这样:

[ y_t = \varphi_1 y_{t-1} + \varphi_2 y_{t-2} + \varepsilon_t ]

这个式子里,(y_{t-1})和(y_{t-2})是过去两个时间点的观测值,(\varphi_1)和(\varphi_2)是它们对应的权重系数,(\varepsilon_t)是今天这个时间点的随机误差,一般假设它服从均值为0、方差恒定的白噪声过程。

这个思路和我们做线性回归有点像——但本质上又有区别。普通线性回归的自变量是各种外部特征,比如天气、促销等;AR的自变量却是序列自身的滞后项。为什么这么做?因为很多现实数据确实存在“惯性”,波动会沿时间传导。今天的温度不会突然从20度跳到40度,往往是今天20度、明天21度这样的平滑变化。AR就是在刻画这种“昨天影响今天”的平滑逻辑。

AR的阶数p就是这个模型看多远——是只看昨天,还是看昨天和前天,还是更久。p=1那就是AR(1),p=2就是AR(2)。选多少,后面用ACF/PACF图来辅助判断,先记下这一步。

2.2 移动平均(MA)部分:序列在吸收过去的“意外”

MA部分就稍微绕一点了。MA不是对过去观测值做平均,而是对过去若干个时间点的“预测误差”建立关系。它考虑的问题是:今天的结果,除了受昨天的值影响,是不是还受到昨天“没被预测到的随机冲击”影响?

举个例子。某天的销量突然暴增,可能是因为某个突发事件。这个突发事件是随机且无法提前预测的,它带来的“冲击”可能还会影响后面的销量——但不一定持续很久。MA模型就把这种“冲击的后续影响力”建模出来:

[ y_t = \varepsilon_t + \theta_1 \varepsilon_{t-1} + \theta_2 \varepsilon_{t-2} ]

(\varepsilon_t)就是当天的随机冲击,(\theta_1)和(\theta_2)是过去冲击对今天还残留的影响系数。注意,这里没有(y_{t-1})这种项,只有(\varepsilon_{t-1})。

为什么要单独关心MA?因为有些序列相邻时间的相关性,不完全来自“值本身”的传导,而是来自“随机冲击的平滑效应”。比如做数据修匀时,某个外生事件error会在后续多个时间点产生涟漪,MA就能很好地捕捉这种“误差带记忆”的模式。很多只学过AR概念的人会忽略MA,但实践中大部分真实数据的相关结构,实际上靠MA部分描述得更好。

2.3 合二为一:ARMA(p, q)的完整表达

当AR和MA合体,那就是ARMA(p,q)了。完整形式可以写成:

[ y_t = \sum_{i=1}^{p} \varphi_i y_{t-i} + \varepsilon_t + \sum_{j=1}^{q} \theta_j \varepsilon_{t-j} ]

看起来式子比较复杂,但理解起来没那么难:今天的值,一部分由过去的“实际值”决定,另一部分由过去的“随机误差”及其残存效应决定。p和q分别是AR和MA的阶数,它们共同决定了模型的复杂程度。

为什么要把二者合起来?因为很多平稳序列,单靠AR或者单靠MA,都难以用尽可能少的参数把相关结构描述清楚。你如果只用AR,可能需要很高的阶数,模型参数多、估计方差大,说白了就是“不精简”;只用MA,也可能面临同样的问题。ARMA把两种机制结合起来,往往能用比较少的参数达到同样的拟合效果。这个思想在模型选择中也叫“简约性”,是非常重要的建模原则。

需要说明的一点是,ARMA适用于平稳序列。如果你的数据被差分过一次或几次,再套ARMA,那本质上就是ARIMA,即差分处理加ARMA组合。所以这篇聊的ARMA是基础,但在实际项目中你一般会看到ARIMA。

3. 建模前必须想清楚的事:平稳性、白噪声与数据检查

3.1 平稳性:ARMA的敲门砖

ARMA模型的数学推导,是建立在序列“弱平稳”的假设上的。所谓平稳,通俗来说就是序列的统计性质不随时间改变。比如一个序列的均值在某一水平附近保持稳定,方差不随时间段大幅变动,同时任意两个时点的相关性只取决于它们之间相隔多远,而不取决于它们处在什么时间段。

为什么ARMA强烈依赖平稳?因为模型的参数估计原理主要依赖大数定律和中心极限定理,只有序列平稳时,这些统计规律才能稳定地帮助我们估计系数。如果序列有趋势或周期性,ACF图会出现衰减缓慢、结构复杂的变化,无法准确判断阶数,预测也会偏差重重。

实操上,怎么判断序列是否平稳?最常用的套路是几种手段结合:

  • 画时序图,看是否有明显的趋势带或周期性;
  • 用ADF检验,原假设是“存在单位根,序列非平稳”,如果p值显著小于0.05,就拒绝原假设,认为序列平稳;
  • 还可以配合KPSS检验(原假设是平稳)作为交叉验证,避免单一检验可能出现的误判。

这里有个细节很多人会忽略:ADF检验对滞后阶数的选择很敏感。滞后阶数太少的检验结果可能不靠谱,太少会忽略残差的自相关,太多又可能降低检验功效。一般可以用信息准则自动选,或者根据经验对年度数据用低频滞后、对高频日度数据适当增加滞后。

3.2 白噪声测试:别给噪声建模

如果你把序列变平稳了,也通过了检验,下一步还不能急着拟合ARMA。要做个简单的白噪声检验。核心是:既然平稳序列的相关性可能来自噪声的随机扰动,那我们就先看看这个平稳序列本身到底有没有值得建模的自相关结构。

判断方法很多,最常用的是Ljung-Box检验。它的原假设是序列是白噪声,也就是自相关系数都统计上与零无异。如果检验结果不拒绝原假设,说明这个数据基本上就是在“随机游走”,用ARMA建模也意义不大——硬建模只会去拟合噪声,预测效果自然也好不了。

这一点我特意强调,是因为我见过不少项目里,建模者把步骤跑得飞快,一拿到平稳序列就开始刷ARMA,最后用一个“显著性”看着很漂亮的模型去预测,结果效果奇差。回过头一查,原始序列在平稳化之后,ACF/PACF几乎全线在置信区间内乱跳,压根就没有可建模的动态结构。这种情况就像在菜市场捡一根烂甘蔗,非要榨汁,付出多收益少。先花两分钟跑个白噪声检验,能帮你省下大量无效劳动。

3.3 数据量:样本太小,谈模型等于空中楼阁

还有一点容易被忽略——ARMA对样本量是有基本要求的。阶数一旦稍微增加,参数数量就跟着涨,对样本量的需求当然也会增加。理论上,拟合ARMA(p,q),至少要确保样本量够多,经验上不建议低于50,更稳妥的说法是起码100以上,特别是你还需要留出测试集做验证时,样本量就更要宽裕。

如果你手里的数据一共只有30个点,不建议去拟合ARMA(2,2)这种稍微复杂的模型。参数估计方差会巨高,预测区间宽到没有参考价值。这种情况下,你可能需要考虑更简单的模型,或者换成更适合小样本的建模思路。

4. 谁来定阶:ACF/PACF图的“截尾”与“拖尾”

4.1 两把刷子:ACF和PACF各管什么

定阶是ARMA建模中最核心、也最容易让人蒙圈的一步。很多学习者在这步卡壳,本质是没搞清楚ACF和PACF各自看的是什么。

自相关函数ACF,衡量的是序列与其自身滞后k期之间的线性相关性。比如lag1的ACF较大,说明今天和昨天的相关性较强;lag2的ACF较大,说明今天和前天的相关性还明显。ACF是从“总量”上看相关性,包含了中间各期传导的影响。

偏自相关函数PACF,则要过滤掉中间滞后项的干扰。比如要看今天和前天之间的“纯”相关,PACF会先把昨天的影响剔除掉,还原今天的值与前天值的直接相关。就好比你想判断A和C之间有没有直接联系,但B也可能在中间起传导作用,PACF就是把B的影响先拿掉,再看A和C直接的关系。

这两个工具结合,就能形成一种“眼神定阶法”。

4.2 经典判读口诀

关于截尾和拖尾的判断,下面这个表是必须吃透的:

模型ACF表现PACF表现
AR(p)拖尾:ACF缓慢衰减或呈类似正弦、指数混合的衰减趋势截尾:PACF在p阶后迅速落入置信区间内
MA(q)截尾:ACF在q阶后迅速落入置信区间内拖尾:PACF缓慢衰减
ARMA(p,q)拖尾:ACF缓慢衰减拖尾:PACF缓慢衰减

举个例子,假如一个平稳序列的ACF图在lag1、lag2处值很大,lag3开始突然掉到置信区间之内,后面几乎不再越界,那这看起来就是ACF在2阶截尾,对应MA(2)的特征。再看PACF图,如果它呈现缓慢衰减而非突然截尾,那基本就可以初步定为MA(2)。

反过来,如果ACF图呈现拖尾式衰减,而PACF在lag1后开始截尾,那可能是一个AR(1)过程。

实操中你要看的是“置信区间”,一般情况下是正负两倍标准误形成的带状区域,落在区间内就认为该阶相关性不显著。同时注意,截尾并非意味着后续所有值都必须严格为零,只要落在区间内,一般就当作“不显著”处理。这个“业内普适”的宽松程度,需要结合样本量和项目背景掌握,不必死抠零值。

4.3 为什么要谨慎对待“双拖尾”

如果ACF和PACF都呈现缓慢衰减,没有明显的截断点,那么可以考虑ARMA(p,q)。但是注意——光靠看图很难直接确定p和q,这时候要配合信息准则做取舍,比如AIC或BIC。它们能帮你在不同阶数组合之间比较模型的拟合优度与复杂度,选一个相对更优的搭配。

还要提防一种情况:ACF图看起来拖尾,PACF图也拖尾,一冲动就直接上ARMA(3,3),结果模型又复杂又难解释。实际处理中,我们往往先用信息准则去搜索几个候选阶数,再结合ACF/PACF图手动微调。图和信息准则互相印证,而不是只看图拍脑袋。

5. 完整实操:从数据预处理到模型诊断的一个小例子

说了这么多,上点实操。这里用一段模拟数据来走通完整流程。注意,下面用到的是某平台或某框架下的常见做法,过程本身是通用的。

假设我们有一个序列,原始数据带有明显趋势,要先做一阶差分来平稳化。实际操作中我们会先检查差分后序列的ADF检验p值。这个p值越小越好,小于0.05就说明平稳了。如果一次差分不够,可能还要二次差分,但不要“一上来就差分两次”,因为过度差分会导致信息损耗,模型解释力反而下降。

差分平稳后,画ACF和PACF图观察。假设我看到ACF图在lag1处有很大负值,lag2之后迅速落入置信区间内,这表现为“1阶截尾”;再看PACF图,它呈现出类似衰减的形态,无法明显截尾,那可以初判为MA(1)模型。也就是说,差分后的序列适用ARIMA(0,1,1),对应原序列的模型。

为了更严谨,我会同时拟合几个候选,比如ARMA(0,1)、ARMA(1,1)、ARMA(1,0),然后比较AIC/BIC。假设ARMA(0,1)的AIC最低,那就确定选择MA(1)。这里不建议只看某一个指标定生死,最好是信息准则“投票表决”。

选好模型后,参数估计出来了:比如MA部分的系数是-0.532,常数项是0.013之类。要检查这些系数是否显著。如果某个系数的p值大于0.05,说明这一项没贡献,应该把阶数降下来重新拟合。注意,我们还要看残差是否还有自相关。残差白噪声检验,即Ljung-Box检验,原假设是残差无自相关,如果检验结果不能拒绝原假设,说明残差已经像噪声一样“干净”了。

最后一步是做预测。基于这个模型,预测未来若干个时间段的值。我更推荐的做法是滚动预测:用前面一段数据训练,预测下一段时间,然后把真实值拉进来,再更新模型。模拟多次,综合评估模型的稳定性,而不只是给出一个“静态预测”。这样获得的误差指标,才是对未来更真实的预期。

6. 实操高频问题与排查记录

6.1 模型定阶结果不稳定,换个图就不一样?

面对ACF/PACF图的截尾判断,如果延迟阶数刚好落在区间边界,很容易出现“看起来截尾,实际上没截尾”的情况。这往往和样本量小、延迟阶数偏短有关。

建议先增加延迟阶数再看全貌。其次,不要只依赖视觉判断,一定要用信息准则做二次验证。我自己常用一个简单策略:把p和q各从0扫到3或4,排列组合出候选表,按AIC或BIC排序,取最前面的几个,再看它们是否在图上“自圆其说”。两套方法对上了,就可以定。

6.2 拟合后残差仍有自相关,怎么办?

这说明模型没有完全吸收掉数据中的相关结构。常见原因有三种:

第一,阶数定低了。比如该用ARMA(2,1),但你定了ARMA(1,1),残差里还留有lag2的相关性。这时把p或q调高一阶再试。

第二,序列可能还有季节性。如果数据是按月或按季度采集的,ACF图常常在周期倍数上出现峰值。此时单靠普通ARMA是抓不住季节性的,需要用带季节性项的季节ARIMA模型,也就是SARIMA。

第三,异常值或结构突变未处理。模型会把某些异常当作随机冲击来吸收,但异常值如果过多,诊断就会出问题。

6.3 模型复杂就一定更好吗?

很多学习者看到AIC随着阶数增加而下降,忍不住一路加到ARMA(5,5),还觉得自己发现了新大陆。这其实是过拟合的典型陷阱。

AIC的原则是拟合优度与参数数量之间的权衡,不是越低越好。阶数增加意味着模型自由度变低,虽然样本内拟合可能更好,但样本外预测往往会变差。建议用简单性原则:在两个模型效果接近时,选择参数更少的那一个。别让模型复杂到难以解释,预测上又帮不上忙。

6.4 预测结果为什么看起来“太平滑”?

如果你用ARMA做多步预测,会发现预测值逐渐走向序列均值,预测区间也越来越宽。这是正常现象。因为ARMA模型本质上依赖历史值,时间越远,历史影响越小,模型最终会收敛到“什么都没有”的状态——均值回归。很多初学者看到预测曲线“拉平了”就以为模型出错了,其实模型是对的,只是你要理解:它对长程预测的自信度本来就不高。

如果需要更远的预测,可能得考虑引入外生变量、改用更丰富的模型结构,或者接受预测不确定性。

6.5 参数估计为负数,正常吗?

太正常了。AR和MA系数不像相关性系数那样在[-1,1]直接取值,它们需要保证模型平稳和可逆,但这并不妨碍单个系数为负。比如一次差分后的销量序列,常会出现MA系数为负的情况,解读为“昨天的冲击对今天有反向修正效应”,符合很多业务逻辑。不要因为数字是负的,就以为计算错误。

7. 最后一个建议:把ARMA放进更大的工具箱

从理论到实操,ARMA的路线已经走完大半,但我还想提醒一点:ARMA并不包打天下。

它适合平稳、无强季节性的序列,适合做中期甚至短期预测,也是理解更复杂模型的重要跳板。遇到明显季节性数据、非线性数据或高维外生变量介入的场景,ARMA可能就不是最优解了,那时候需要你了解SARIMA、GARCH、状态空间模型等方法,但那些模型的很多逻辑仍然有ARMA的影子。

我个人用过ARMA做销量预测、流量异常检测、趋势平滑分析,最深刻的体会是:ARMA不是万能法宝,但它是一种“用过去解释现在”的思想框架。你一旦习惯了这个框架,看数据的方式就不一样了——你会在波动里找惯性,在噪声里找记忆。

如果你正准备拿自己的数据练手,建议取某个长度适中、有平稳性的指标序列,严格按“平稳性检验-白噪声检验-定阶-拟合-诊断-预测”的流程走一遍。第一次做可能会卡在定阶,没关系,多跑几个模型对比,把AIC和残差白噪声检验结合起来看,你很快就能找到手感。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询