☰
Stata时间序列入门:AR(2)模型与自相关矩阵实操指南
2026/10/5 5:21:37 网站建设 项目流程

先说个我自己的经历。去年处理一组月度CPI同比数据时,我用普通OLS回归做了个预测模型,R方接近0.9,看起来漂亮得很。结果一到验证集就翻车,预测误差大得离谱。后来回头查残差,发现残差序列的自相关严重超标——也就是说,模型把误差项里的时间结构当成噪音给扔掉了。从那时起我开始认真研究Stata里的ARMA(自回归移动平均模型),而入门时踩过最深的一个坑,就是对“二阶自回归模型”和“自相关矩阵”这两个概念的理解不够透。

现在回头看,ARMA其实是时间序列分析绕不开的那道门。不管你是做宏观预测、金融波动率建模,还是处理销售数据、气象观测,最终都会撞上它。这篇指南是系列第一篇,我打算把AR(2)模型和自相关矩阵这两块地基讲扎实,再带着你把Stata里的完整操作链路走一遍。适合刚接触时间序列、被ACF和PACF图搞得一头雾水的朋友,也适合已经会跑arima命令但不太清楚输出结果到底在说什么的人。

1. 从一次CPI预测翻车说起:为什么需要ARMA和自相关矩阵

1.1 普通回归在时间序列数据上的失灵

很多从横截面数据转过来的人,第一反应都是把时间序列当成普通回归来处理:

reg y x1 x2

横截面数据里,观测值之间相互独立这个假设通常还说得过去。但时间序列不一样,今天的通胀率和昨天的通胀率天然相关,这个月的销售额和上个月的销售额天然相关。一旦你忽略了这种时间上的相关性,OLS估计的系数虽然可能还是无偏的,但标准误会被严重低估,t统计量虚高,你看到的所有显著性都可能是假的。

我当时踩的坑就在这。模型拟合得好好的,残差一画出来,明显有周期性波动。用Stata的wntestq跑一下残差白噪声检验,p值小到几乎为0,残差里全是信息,模型本身却什么都没学到。这就是典型的“没把时间结构拆干净”。

1.2 ARMA模型的核心逻辑:用过去解释现在

ARMA拆开看就是两块:

  • AR部分(自回归):用变量自身的滞后项来解释当前值,表达的是“惯性”。比如这个月通胀高,下个月大概率也低不下来。
  • MA部分(移动平均):用过去几期的预测误差来解释当前值,表达的是“冲击的残留”。比如突发自然灾害推高了当月食品价格,这个冲击的影响会在接下来一两个月慢慢消退。

为什么要用ARMA而不是单纯堆一堆滞后变量进回归?因为MA项能把那些看不见、但确实存在的冲击效应吸收掉。很多时候你找不到一个合适的解释变量来描述某个冲击,但通过误差项的移动平均结构,可以把这种影响间接建模出来。这是ARMA模型非常巧妙的地方——它不需要你找到每个冲击的来源,只需要你把冲击的时间结构描述出来。

1.3 为什么拿AR(2)当入门样板

AR(1)太简单,只有一个滞后项,自相关结构单调衰减,不容易看出门道。ARMA(1,1)虽然实用,但AR和MA的参数交织在一起,初学者很容易把阶数识别搞混。AR(2)刚刚好:

  • 它有两个滞后项,能表现出更丰富的动态行为(比如周期震荡),但数学上又不至于失控;
  • 它的平稳性条件可以画成一个直观的三角形区域,方便理解“参数空间”这个概念;
  • 它的ACF和PACF特征非常典型,正好用来讲清楚自相关矩阵的判读逻辑。

我把AR(2)和自相关矩阵放在同一篇文章里讲,是因为这两者在实操中是强绑定的:AIC告诉你选几阶,最终确认还是要靠相关图的形态。没有自相关矩阵的判读能力,ARMA就永远停留在“黑盒调参”的层面。

2. 二阶自回归模型:一个滞后结构恰到好处的样板

2.1 AR(2)的数学形式与参数的经济学含义

二阶自回归模型的表达式是:

y_t = c + φ1*y_{t-1} + φ2*y_{t-2} + ε_t

其中ε_t是白噪声,均值为0,方差恒定。

拆开看每个参数的直观含义:

  • φ1:一阶惯性系数。抓住的是“上期值对本期值的直接影响”。如果φ1接近1,说明序列有很强的黏性,今天的值大概率贴着昨天走。
  • φ2:二阶滞后系数。它捕捉的是“上上期值经上期传导后的间接影响”,或者更准确地说,是控制住y_{t-1}之后,y_{t-2}对y_t的增量解释力。
  • c:截距项,决定了序列的长期均值水平。在平稳条件下,长期均值等于c / (1 - φ1 - φ2)。

举个例子。假设你在分析某城市月度二手房成交量,φ1 = 0.6,φ2 = -0.2,c = 1000。这个结构的含义是:上个月每多成交100套,本月平均多成交60套;但往前两个月的成交热度如果过高,反而会对本月产生约20套的负向拖累——因为前两个月的火爆可能透支了需求。这种“先惯性、后回调”的模式,用AR(1)是表达不出来的,必须靠φ2这个二阶项。

2.2 平稳性条件:特征方程和那个“三角形”判断法

AR(2)能不能用,第一个要问的问题是:序列是不是平稳的。如果特征方程的根落在单位圆内,序列就会发散,模型直接失去意义。

特征方程长这样:

1 - φ1*L - φ2*L^2 = 0

L是滞后算子。AR(2)平稳的充要条件是所有特征根的模都大于1。但直接解这个方程对初学者不友好,所以教材里给了个等价的三角条件:

φ1 + φ2 < 1 φ2 - φ1 < 1 |φ2| < 1

这三个条件围出来的区域是一个三角形,所以你只要把估计出来的φ1和φ2代进去,逐条检查就能判断。我当时为了方便记忆,把它理解为“参数别太贪心”:φ1和φ2相加不能超过1,两者之差也不能超过1,二阶系数本身要落在(-1, 1)区间内。

顺手提一句,Stata在arima命令的估计结果里不会直接帮你检验平稳性,你得自己根据系数的点估计和置信区间去判断。碰到φ1估计为0.85、φ2估计为0.4的情况(两者之和已经超过1),基本可以断定模型设定有问题,这时候继续往下解读意义不大。

2.3 一个数值例子:冲击如何在AR(2)中衰减

为了把动态行为讲清楚,我模拟了一个AR(2)过程:φ1 = 0.6,φ2 = 0.3,ε_t是方差为1的白噪声。在Stata里生成序列:

set seed 12345 simulate y, reps(1) nodots: /* 简化写法,实际用循环 */

更常见的做法是用tsappend和循环生成:

clear set obs 200 gen t = _n tsset t gen y = 0 gen shock = rnormal() replace y = 0.6*y[_n-1] + 0.3*y[_n-2] + shock if _n > 2

画出来之后你会看到:序列没有发散,但也不是白噪声那种完全随机的样子。它呈现出一种带阻尼的波动——一个冲击进来后,当期反应最大,之后不会一路单调衰减,而是可能先回落再小幅反弹,形成一个小波峰,然后才慢慢收敛。

这就是二阶滞后项的“记忆效应”。AR(1)的冲击衰减是单调的,AR(2)却能产生类似周期波动的行为,这让它特别适合建模那些带有经济周期或季节惯性特征的序列。

3. 自相关矩阵与ACF/PACF:识别模型阶数的核心工具

3.1 corrgram输出的自相关表格到底怎么读

标题里的“自相关矩阵”,在Stata实操中对应的是corrgram命令输出的那张表,以及ac、pac生成的图形。很多初学者看到“矩阵”两个字就发怵,其实它就是一个把滞后1阶、滞后2阶……直到滞后n阶的自相关系数按行排列的表格。

corrgram y, lags(20)

输出大致长这样:

LAG AC PAC Q Prob>Q 1 0.6230 0.6240 39.76 0.000 2 0.5100 0.1840 66.52 0.000 3 0.4200 0.0770 84.91 0.000 4 0.3600 0.0450 98.37 0.000

每一列的含义:

  • LAG:滞后阶数。
  • AC:自相关系数,衡量y_t和y_{t-k}的线性相关。
  • PAC:偏自相关系数,衡量剔除中间滞后项影响后,y_t和y_{t-k}的“纯”相关。
  • Q:Ljung-Box Q统计量,联合检验前k阶自相关系数是否为0。
  • Prob>Q:对应的p值。p值一直很小,说明序列存在显著的自相关结构,值得做ARMA。

怎么快速判断是不是白噪声?如果所有LAG对应的Prob>Q都大于0.05,基本可以断定“没有显著自相关”,ARMA也就没必要做了。

3.2 ACF的拖尾特征与AR(2)的理论形态

ACF是自相关函数(Autocorrelation Function)的缩写。对于AR(2)过程,ACF的递推关系是:

ρ_k = φ1*ρ_{k-1} + φ2*ρ_{k-2}

初始条件是ρ_0 = 1,ρ_1 = φ1 / (1 - φ2)。

实际画图时,AR(2)的ACF呈现两种典型形态:

  • 如果φ1^2 + 4*φ2 ≥ 0,ACF会单调衰减;
  • 如果φ1^2 + 4*φ2 < 0,ACF会呈现衰减的正弦波。

这两种形态都是“拖尾”的——也就是说,ACF不会在某一阶突然消失,而是逐渐趋近于0。这一点至关重要:AR过程的ACF必须拖尾,如果看到ACF在第4阶以后突然几乎全部落在置信带内,那说明并不是纯AR过程。

3.3 PACF的截尾特征:识别AR阶数的关键

PACF是在控制y_{t-1}、y_{t-2}……的基础上,看y_t和y_{t-k}的相关性。对于AR(2)过程,PACF有一个非常清晰的特征:滞后1阶和2阶显著不为0,滞后3阶及以后全部不显著。

换句话说,PACF在2阶处“截尾”。这就是识别AR阶数的核心规则——PACF在哪一阶截尾,AR的阶数就是多少。

反过来,对于MA(q)过程,ACF在q阶截尾,PACF拖尾。这一点再强调一下,因为初学者特别容易搞反:

真实过程ACF表现PACF表现
AR(p)拖尾(逐渐衰减)p阶后截尾(突然消失)
MA(q)q阶后截尾拖尾
ARMA(p,q)拖尾拖尾

我见过不少人在AR和MA的判别上栽跟头,核心问题就是没抓住“谁截尾、谁拖尾”这组对应关系。你可以这样记:AR的滞后项是观测到的实际值,所以它的相关结构会一层传一层,永远拖不干净(ACF拖尾);但偏自相关剔除中间层后,直接相关只存在于前p阶(PACF截尾)。

3.4 用模拟数据验证ACF/PACF的判读逻辑

光讲理论不够,我们用一个已知的AR(2)过程来验证。上文模拟的φ1=0.6、φ2=0.3的序列,我跑了corrgram,输出如下:

LAG AC PAC Q Prob>Q 1 0.7025 0.7042 99.02 0.000 2 0.5841 0.2054 168.13 0.000 3 0.4922 0.0523 217.38 0.000 4 0.4120 0.0325 251.92 0.000 5 0.3355 0.0180 274.19 0.000

看PAC列:滞后1阶0.70,滞后2阶0.21,滞后3阶以后全部跌到0.05附近,明显在2阶后截尾。而且滞后3阶的偏自相关系数0.052落在2倍标准误带宽(约±0.14)之内,基本显著不了。这就是标准的AR(2)特征。

ACF列则是0.70、0.58、0.49、0.41、0.34,衰减得很顺滑,是典型的拖尾形态。两条信息放一起,模型阶数基本可以确定为AR(2)。

4. Stata实操全链路:从数据准备到AR(2)估计与诊断

4.1 tsset:所有时间序列分析的第一步

很多人一上来就画相关图,结果Stata直接报错。原因很简单:Stata需要明确知道这个数据的“时间结构”。

时间变量的声明用tsset:

tsset datevar

如果你的时间变量是月度、季度或日度,可以加频率选项:

tsset yearvar, yearly tsset quartervar, quarterly tsset monthvar, monthly tsset datevar, daily

tsset之后,Stata会自动生成_n、_N这些系统变量,L.y、F.y、D.y等滞后、前瞻、差分算子才能正常使用。我建议每次打开数据先确认一下时间变量的格式,尤其是从Excel导入的日期,经常被读成字符串,这时候要先用date()函数转换:

gen date2 = date(datevar, "YMD") format date2 %td tsset date2, daily

一个很隐蔽的坑:如果你的数据是面板数据(多个个体多个时期),tsset是不够的,需要用xtset id year来声明面板结构,否则Stata会按照杂乱的时间顺序把你所有个体的数据混在一起。

4.2 画相关图:ac、pac、corrgram命令的使用

声明完时间结构,接下来就是画相关图确认阶数。

ac y, lags(20)

这条命令画出ACF图,带95%置信带。置信带的宽度大约是±1.96/sqrt(T),T是样本量。样本量越小,置信带越宽,截尾的判断就越模糊。

pac y, lags(20)

画出PACF图。两幅图放在一起对照,用上面说的“ACF拖尾、PACF截尾”规则来判断阶数。

corrgram则同时给出AC、PAC、Q统计量和p值,适合快速浏览。实操作中我更推荐三步走:

  1. 用corrgram y, lags(20)快速看概貌;
  2. 用ac y, lags(20)和pac y, lags(20)精看图形形态;
  3. 对可疑阶数,直接估计多个候选模型,用AIC/BIC和残差诊断做最终裁决。

这里多说一句:图形判断带主观性,尤其在小样本里ACF和PACF的样本波动很大。不要看到一个点稍微超出置信带就激动,要把关注点放在“整体模式”上,滞后3阶以后PACF全部落回置信带内,才是真正有价值的信号。

4.3 arima命令估计AR(2):语法与输出解读

确认阶数之后,用arima命令估计模型。两种常见写法等价:

arima y, ar(1/2) arima y, arima(2,0,0)

推荐第二种写法,因为它显式地表达了ARIMA(p,d,q)结构:第一个数字是AR阶数,第二个是差分阶数,第三个是MA阶数。

输出重点看这几个部分:

  • y的系数:也就是φ1和φ2的估计值,看是否显著(z检验的p值小于0.05)。
  • 常数项:模型中的c。注意,输出里的常量是长期均值的变换形式,实际预测时用的是y_t的滞后值直接计算。
  • sigma:误差项的标准差估计,反映了模型的整体波动水平。
  • Log likelihood:对数似然值,用于模型比较。

一个值得注意的地方:arima默认使用最大似然估计,对初值选择可能比较敏感。如果你的数据量很小,或者序列有异常值,估计可能不收敛。这时可以试试加difficult选项调节优化算法,或者先检查数据是否平稳。

4.4 残差诊断:Q检验和残差相关图

模型估完,没做诊断前不要急着用。诊断的核心是确认残差不再含有显著的自相关结构。

predict resid, resid wntestq resid, lags(20)

wntestq输出Ljung-Box Q统计量。p值大于0.05,说明残差是白噪声,模型已经充分提取了信息。

我一般还会顺手跑一下残差的ACF和PACF:

ac resid, lags(20) pac resid, lags(20)

如果残差相关图里没有明显的超出置信带,这个模型就算基本过关。如果Q检验显著,通常有两种处理思路:增加AR或MA的阶数,或者考虑序列是否有结构突变需要先处理。

5. 入门阶段最容易翻车的三个坑(附排查思路)

5.1 坑一:未做平稳性检验直接估ARMA

这是我在论坛上看到最多的求助帖类型。序列明明有趋势或季节性,直接上ARMA,估计出来的系数可能看起来很显著,但模型实质上是伪回归。

具体表现:arima估计的φ1接近1,且残差依然呈现明显的周期模式。

排查思路:

  1. 先画序列图tsline y,肉眼判断是否有趋势或波动剧烈。
  2. 运行单位根检验:
dfuller y

DF检验的p值大于0.05,说明存在单位根,序列非平稳。这时候先差分:

dfuller d.y

差分后平稳,再用arima y, arima(2,1,0)对待。很多人问为什么ARIMA中间那个1重要,这个1就是我们做了一次差分的证据。

5.2 坑二:被AIC/BIC牵着走,忽视了模型的简约性

信息准则确实能帮助你比较模型,但它不是万能钥匙。我碰到过一个例子,模拟数据明明是AR(2),但AIC选出了ARMA(1,1),BIC却选了AR(2),两个准则各执一词。

原因在于信息准则的本质是“拟合优度 + 惩罚项”,AIC的惩罚较轻,容易过度拟合;BIC的惩罚较重,倾向于更简约的模型。当准则之间冲突时,我通常取BIC的结果,因为它选择更短的滞后阶数在预测中往往更稳健。

不过最重要的原则还是:依赖准则之前,先看相关图。如果PACF在2阶后截尾,而AIC非让你选ARMA(1,1),我会优先尊重数据的统计特征,而不是盲目追求最低的AIC值。花哨的阶数组合永远不如经济含义清晰、结构简单、残差白噪声的模型好用。

5.3 坑三:样本ACF/PACF的误读:把截尾看成拖尾

小样本情况下,样本自相关系数的方差很大,ACF和PACF的图形起伏剧烈。滞后2阶的PACF是0.35,滞后3阶变成0.25,滞后4阶0.18,都超出置信带一点点——很多人就以为“没有截尾”,于是把AR阶数往上抬,搞出了AR(6)。

实际排查思路是这样:

  1. 计算2倍标准误的边界。Stata图形给出的置信带本身已经包含这个信息,我通常直接用图上的影子区域,只要点落在影子内部,就不算显著。
  2. 看趋势不看个点。滞后3阶以后PACF的绝对值是否整体在缩小,如果是,就按“在2阶截尾”处理。
  3. 用交叉验证做最终裁决。估AR(2)和AR(5),在样本外留出最后20期做滚动预测,比较预测精度。如果AR(5)的预测表现并没有显著更好,AR(2)就是更稳的选择。

样本量的重要性再怎么强调都不为过。时间序列数据的样本量普遍偏小,大样本下ACF/PACF的渐近性质在小样本里可能完全不适用。这也是为什么我建议初学者一定要养成“先看数据量,再做判断”的习惯。

最后再分享一点我自己的习惯

经过几次翻车后,我现在处理时间序列数据的流程几乎固定:拿到数据先tsset,再画tsline看趋势,然后corrgram和dfuller并行做平稳性和相关性初诊,确认平稳之后再进入ARMA定阶、估计、诊断的流程。这个习惯帮我免掉了大量“估完才发现数据没处理干净”的返工。

另外,arima估计完之后不要急着删除工作文件,保留残差序列,每次模型更新后都对比一下残差的Q检验p值。这是一个非常廉价、高效的模型回归质检手段。ARMA的入门看起来命令不多,但每一步背后都有完整的统计逻辑撑着,把这篇内容消化透,就有了后面学习ARIMA、SARIMA甚至GARCH类模型的基础。下一篇我会继续写MA部分的移动平均项到底在捕捉什么,以及ARMA(1,1)在预测中的实战表现。

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

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

立即咨询