(五十一)时间序列分析二:平稳时间序列分析(ARMA)
这个系列写到第五十一篇,前面铺垫了白噪声、平稳性、自相关函数这些基础概念,今天终于要进入真正能动手建模的核心环节了。这篇文章要聊的ARMA模型,也就是自回归移动平均模型,可以说是整个时间序列分析里被引用最多、也最容易被误用的一个模型。如果你已经知道什么是平稳序列、什么是白噪声,但一直没搞明白ARMA的定阶、参数估计和检验到底是怎么串起来的,那这篇文章就是为你准备的。
其实ARMA这个名称听起来有点吓人,但剥开来看,它的本质就是一个说法:今天的数值,既受过去自身数值的影响,也受过去几期“意外冲击”的影响。很多做数据分析的朋友初次接触时,容易卡在“为什么要分AR和MA”“怎么判断该用几阶”“拟合完怎么看效果”这几道坎上。这篇我会把整个流程串一遍:从平稳性检验出发,讲清ARMA的核心逻辑,然后带你把建模的完整步骤走通,最后整理一些我在实际项目中反复踩过的坑。
1. 动手建模前的第一关:确认序列到底稳不稳
1.1 为什么平稳性是ARMA建模的前提
很多人拿到数据就直接套模型,结果拟合出来的效果看着不错,一做预测就完全跑偏,问题往往出在平稳性上。ARMA模型的数学基础建立在一个关键假设上:序列的统计性质不随时间平移而改变。也就是说,序列的均值、方差、自相关结构在每一个时间段上都应该是稳定的,这样“用过去预测未来”才是合法的。
打个比方,如果我们要根据一个人的身高历史去预测他未来的身高,那前提是他的发育阶段已经结束,身体处于一个相对稳定状态。如果在青春期做预测,趋势是向上的,均值和方差都在变,用历史均值去推测未来就没有意义。时间序列的平稳性检验,本质上就是在判断序列是否还处在“发育期”。
统计上有两种平稳的定义:严平稳和宽平稳。严平稳要求所有阶数的联合分布都随时间平移不变,这个条件太苛刻,实际中基本没人去验证。我们平时说的平稳,几乎都是宽平稳,也就是满足三个条件:均值恒定、方差恒定、任意两个时点的协方差只取决于时间间隔而不取决于具体时点。ARMA模型要求的就是宽平稳。
1.2 用ADF检验给平稳性下结论
看自相关图判断平稳性是一种主观做法,更可靠的办法是用单位根检验。目前使用最广的是ADF检验(增广迪基-富勒检验),几乎所有统计工具都内置了这个函数。ADF检验的原假设是“序列存在单位根,即非平稳”,备择假设是“序列平稳”。
使用逻辑很简单:检验统计量对应的p值小于显著性水平(通常取0.05),就拒绝原假设,认定序列平稳;反之则说明序列非平稳。我在实际工作中习惯同时看两个指标:ADF统计量和p值。如果统计量是绝对值很大的负数,且p值极小,基本就可以放心往下走了。
注意:ADF检验对滞后阶数的选择比较敏感。很多工具会自动选择最优滞后阶,但如果你感觉结果异常(比如同一个序列换几个参数结论就变了),可以手动传入不同的最大滞后阶数多跑几次对比,不要盲目相信工具默认。我遇到过某工具自动选择的滞后阶数过小,把本来平稳的序列误判成非平稳的情况。
1.3 白噪声检验:检验通过后才能开始“找规律”
平稳性确认之后,还有一道容易被忽视的关卡:白噪声检验。如果一个序列本身就是纯随机波动,前后没有相关性,那ARMA模型对它毫无意义,建模纯属给自己找事做。
白噪声检验常用的方法是LB检验(Ljung-Box Q检验),原假设是“序列不存在相关性,即白噪声”。如果p值小于0.05,说明序列存在显著的相关结构,有建模价值;如果p值很大,说明序列就是随机噪声,可以直接放弃建模。
一个常见的错误认知是:平稳序列就一定存在可建模的规律。实际上平稳和白噪声不矛盾,白噪声本身就是一种特殊的平稳序列。判断是否有建模价值,必须结合白噪声检验,而不是看到“平稳”就兴奋。
2. ARMA模型的核心逻辑:两种“记忆”的叠加
2.1 拆开看AR部分:自己对自己的记忆
AR部分,即自回归,表达的是一个朴素的直觉:今天的结果和过去几天的结果有关。比如餐厅的客流量,今天的客流大概率跟昨天的客流存在关联,因为回头客、口碑传播、消费习惯都有惯性。
AR(p)模型的数学形式是当前值是过去p期值的线性组合加上一个随机扰动项。这里有个重要的约束:特征方程的根必须在单位圆外,这保证了由AR部分主导的序列是平稳的。在实际操作中,一个隐晦的问题是阶数p的确定,后面我会专门讲。
有一类常见的误读:AR模型系数越大说明历史影响越强,所以系数接近1就是最好的模型。实际上系数过大会导致序列趋向于随机游走,平稳性会被破坏。AR部分的系数必须满足一定的约束条件,这不仅仅是统计问题,更是数学上模型能否有意义的问题。
2.2 拆开看MA部分:意外冲击的余波
MA部分,即移动平均,表达的是另一种直觉:今天的数值,受到过去几天“意外事件”的残余影响。比如某天突然出现一条爆款内容,流量当天冲到顶峰,但它的影响不会当天就消失,而是在随后的几天内逐渐衰减。这些异常冲击的作用就是MA部分在刻画的内容。
MA(q)模型把当前值表示为过去q期随机扰动项的线性组合。和AR部分不同,MA部分对平稳性的影响较小,但对异常波动的描述能力很强。一个纯MA过程几乎总是平稳的,因为它的记忆是短期的,不会无限累积。
2.3 AR和MA怎么选:看ACF和PACF的“截尾”与“拖尾”
这是ARMA建模中最考验经验的环节。ACF是自相关函数,PACF是偏自相关函数,前者量的是当前值和过去值之间的总体相关性,后者量的是在剔除中间变量影响后,当前值和某个特定滞后值的直接相关性。
判断规则不算复杂:
- ACF拖尾(衰减缓慢)且PACF在p阶之后截尾(突然归零),适合用AR(p)
- ACF在q阶之后截尾且PACF拖尾,适合用MA(q)
- ACF和PACF都拖尾,才考虑ARMA(p,q)
我在实际工作中发现,很多入门者在这步会犯一个共同的错误:盯着图找“绝对归零的那一阶”。真实数据的样本ACF和PACF几乎不会出现教科书式的完美截尾,更多的只是“落入置信区间后再也没出去”。判断截尾时,应该看某一阶之后是否大部分点都在置信区间内,而不是逐个点要求零。
实操心得:当ACF和PACF都拖尾、看不出明显截尾点时,不要过度纠结于手工识别。直接让AIC/BIC信息准则来帮你决策,通常比肉眼判断更稳定。我后面会细说信息准则怎么用。
2.4 定阶的取与舍:从人工观察到信息准则
定阶是ARMA建模中最容易被反复推翻的环节。理论上有两条路:一条是前面说的ACF/PACF图人工识别,另一条是信息准则自动筛选。AIC(赤池信息准则)和BIC(贝叶斯信息准则)是两种最常用的准则,它们的共同逻辑是:在拟合优度和模型复杂度之间找平衡。模型越复杂(阶数越高),拟合优度通常越好,但过拟合的风险也越大,信息准则对此做了惩罚。
在工具里遍历阶数的组合(比如p从0到5,q从0到5),计算每个组合的信息准则值,取最小值对应的一组(p,q)作为候选。实际工作中,BIC通常比AIC更保守,倾向于选择更简洁的模型。我的习惯是同时打印AIC和BIC的排名,如果两者给出的最优阶数一致,就放心选用;如果不一致,我会偏向BIC的结果,因为它的惩罚更严格,过拟合风险更低。
特别提醒:信息准则选出的“最优阶数”不一定就是最好的预测模型。统计意义上的最优,在实际业务场景中未必稳定。我经常跟团队说,信息准则只是候选者的筛选器,最终要结合残差检验和业务解释性来做决定。
3. 从数据到模型:一套完整的ARMA建模实操流程
3.1 数据准备与探索性分析
在进入正式的模型拟合之前,先把数据清洗和数据探索做扎实。我用一个模拟的数据场景来说明整套流程:假设我们有某商品近500天的日销量数据,波动比较平稳,没有明显的趋势和季节性,适合尝试ARMA建模。
数据准备阶段,需要处理三件事:缺失值、异常值、时间索引。缺失值最简单的处理方式是前向填充,但要注意如果缺失比例超过5%,直接填充会引入偏差,需要结合插值或模型预测来判断;异常值需要先确认是真实业务事件还是记录错误,如果是记录错误,可以考虑用前后几天的均值替代。
时间索引一定要设置为标准的时间格式并排序。数据顺序错乱会导致自相关计算完全失效,这个看起来很小的问题,实际工作中出现频率不低。
3.2 分步走通建模流程
我将完整的建模流程拆成六个步骤,每一步都配套输出解读方法:
第一步,做ADF检验,确认序列平稳。如果p值大于0.05,先不要急着差分,可以尝试对序列做对数变换或开方变换,非线性变换有时能解决方差带来的非平稳。
第二步,做LB白噪声检验,确认序列存在建模价值。如果检验结果表明序列是纯随机噪声,停止建模,去检查数据源或者重新定义目标变量。
第三步,绘制ACF和PACF图,初步判断候选阶数。在这个阶段,你只需要一个大致的范围,不需要精确确定p和q。
第四步,遍历候选阶数组合,用AIC/BIC寻找最优模型。为了可靠,遍历时最好配合交叉验证,尤其是样本量不大的时候。我常用滚动预测的方式:用前90%的数据训练,后10%的数据验证,比较不同阶数组合下的预测误差。
第五步,对最优模型做残差检验。残差需要满足两个条件:没有显著的自相关、服从白噪声分布。这一步如果没过,前面选的最优阶数就要推翻重来。
第六步,利用模型进行后续若干期的预测,并计算预测误差。这一步通常有三种误差指标结合使用:MAE(平均绝对误差)、RMSE(均方根误差)和MAPE(平均绝对百分比误差)。MAPE直观但靠近0的分母会导致指标爆炸,实际使用时要注意。
3.3 参数估计的两种路径
参数估计是ARMA建模中技术含量最高的环节。传统的方法有两种:矩估计和最小二乘估计。矩估计通过Yule-Walker方程求解,计算速度快,但精度一般;最小二乘估计的精度更高,但对初值敏感,迭代可能不收敛。
现代统计工具默认使用的通常是极大似然估计或条件最小二乘,这些方法已经封装得很完善,使用者不需要手动实现算法细节,但需要理解输出结果中的几个关键数字:每个系数的估计值、标准误、t统计量和p值。系数不显著时,说明该项可能是多余的,可以考虑降阶重估。
实操细节:拟合ARMA模型时,不同工具对常数项的默认处理不一样。有的工具默认包含常数项,有的默认不包含。如果序列均值明显不为零,应该显式设置包含常数项,否则残差中会残留均值偏移,导致检验失败。这是我踩过最多次的坑,说出来给后面的人提个醒。
3.4 一个模拟案例的完整输出解读
我模拟了一组500天的销量数据,均值约为100,方差稳定,带有轻微的AR(1)结构和MA(1)结构。通过ADF检验,p值约为0.001,序列平稳;LB检验的p值小于0.001,说明存在自相关结构。
ACF图呈现拖尾形态,PACF图在一阶处有一根明显的超出置信区间的柱状图,后续阶数基本都落在区间内,初步判断是AR(1)的结构。但看ACF图,一阶处也有明显的相关性,而且拖尾不太规则,这让我额外考虑ARMA(1,1)的可能。AIC对比显示,ARMA(1,1)的AIC值比AR(1)低了约30,BIC也低一些,因此最终选择了ARMA(1,1)。
模型输出的AR系数约为0.72,MA系数约为0.45,两项都非常显著。常数项约为98.6,接近序列的真实均值100。残差的LB检验p值为0.38,无法拒绝白噪声的原假设,说明残差中已经没有可提取的信息。预测未来10天的销量,平均误差在2.3%左右,效果可以接受。
4. 常见问题与排查技巧实录
4.1 序列明明看着平稳,ADF却判断非平稳
这种情况我在实际数据分析中遇到比较多。原因往往是数据中存在局部结构性变化,比如突然的均值跳变,虽然整体均值稳定,但某个局部区间的均值发生了偏移,导致单位根检验的统计量失效。
排查方向有两类:一是检查数据中是否有明显的断点,如果有,可以考虑分段建模或在模型中引入结构突变项;二是检查ADF检验的滞后阶数设定,用不同的滞后阶数重新检验。如果多种滞后阶数下结论一致,那非平稳的结论就比较可靠;如果不一致,需要进一步深挖数据结构。
4.2 信息准则选出的阶数很高,但预测效果很差
信息准则倾向于选择拟合优度更高的模型,高阶模型在训练集上通常表现很好,但在预测集上可能严重过拟合。特别是样本量不大的时候,高阶模型的参数太多,微小的样本波动都会被当作规律学习进去。
一个有效的矫正手段是:在AIC/BIC选出的阶数基础上,搜索邻近的简单模型,比较它们在滚动预测中的表现。我常说,用预测误差来选择最终模型,比用信息准则直接定阶更贴近实际业务需要。
4.3 残差检验不通过,该如何处理
残差检验是判断模型是否合适的关键指标。如果残差的LB检验p值小于0.05,说明残差中仍有信息未被提取,常见原因有三个:阶数选择过低、模型形式不匹配、或者数据中存在非线性结构。
我通常的处理顺序是:先在低阶模型的邻近范围内搜索更高阶数的组合,观察是否能够改善残差的白噪声性质;如果增加阶数无效,就要考虑数据是否有非线性特征(比如波动聚集效应),此时需要转向其他模型族。有时候数据中隐藏的季节性成分也会导致残差自相关,这种情况下需要引入季节项。
4.4 预测结果整体“偏平”,没有波动趋势
这是ARMA模型对平稳序列做长期预测时的正常现象。ARMA的预测会随着预测期数的增加,逐渐收敛到序列的长期均值。换句话说,预测期越远,预测值越接近均值,预测的不确定性也越大。这不一定是模型出错的信号,而是平稳模型本身的特性。
当业务需要更长期的趋势预测时,ARMA并不能胜任,需要转向带趋势项的模型或者考虑差分处理。预测期数比较短时,ARMA的表现通常还可以;拉到较长周期,就不要强求它能给出花样丰富的曲线了。
避坑提醒:ARMA模型适合用来预测短期变化,不适合做长期外推。很多人在这一点上对它有超出能力的期待,最终得到的结果自然让人失望。
4.5 一个排查速查表
| 症状 | 可能原因 | 排查方向 |
|---|---|---|
| 残差LB检验p值极小 | 模型阶数不足或结构不匹配 | 增加阶数、尝试加入MA项 |
| 系数估计p值不显著 | 阶数过高、样本量不足 | 降低阶数,重新拟合 |
| 预测结果长期不变 | 平稳模型固有特性 | 缩短预测期或改用趋势模型 |
| 训练集表现好但预测差 | 过拟合 | 用BIC筛模型、交叉验证 |
| ADF检验结果不稳定 | 滞后阶数设定不同 | 多阶数对比、观察稳定性 |
| 数据量小但模型复杂 | 参数估计不稳 | 降阶,或使用更简洁的结构 |
5. 后续还能怎么扩展
ARMA虽然经典,但它只是平稳序列分析的起点。如果你已经掌握了ARMA的核心思想和操作流程,下一步完全可以往两个方向走:一是引入差分结构,处理非平稳序列,过渡到ARIMA模型;二是加入季节项,处理具有周期性规律的序列,对应SARIMA模型。
我自己在实际应用中的体会是,ARMA更像是一把尺子,你用它先丈量清楚一个序列的线性相关结构,再慢慢加入非线性、外生变量、状态空间这些扩展。熟练之后你会发现,它作为基础框架的价值远大于作为一个“最终模型”的价值。
最后分享一个小技巧:在做模型定阶时,不要只看一套数据的结果。可以尝试把样本切成长度不同的几个子集,分别在各个子集上跑建模流程,观察选出的阶数是否稳定。如果阶数在不同子集之间变化很大,说明序列本身的结构并不稳定,模型参数的可信度也要打一个问号。这种稳定性判断,在业务数据分析中比任何一组的“最优结果”都更有参考价值。