AR(1)到AR(2):平稳性、ACF/PACF定阶与Python实战
2026/9/18 16:25:33 网站建设 项目流程

1. 从一条看似随机的折线说起:AR(1)到底在"回归"什么

很多人第一次看到AR模型的名字都会觉得别扭:自回归,"自己回归自己"?听起来像个文字游戏。但如果你手上有过一条随时间上下波动的数据曲线——股票日收益率、某城市的日均气温、服务器每分钟的请求量、某个电商单品的日销量——你大概都产生过一个直觉:今天的数值,往往和昨天脱不了干系。AR(1)就是把这种直觉写成公式的最简形式。

先给结论,AR(1)的表达式是:

$$ X_t = c + \phi X_{t-1} + \varepsilon_t $$

其中 $\varepsilon_t$ 是白噪声,均值为0、方差为 $\sigma^2$、不同时刻互不相关。$c$ 是常数项,$\phi$ 是最关键的那个"记忆系数"。它回答的问题很朴素:前一刻的取值,对此刻还有多少影响?如果 $\phi = 0$,那 $X_t$ 就退化成白噪声加个常数,历史和今天毫无关系;如果 $\phi$ 接近 1,历史惯性极强,今天几乎就是昨天的影子。

为什么这个模型值得单开一篇来讲?因为它同时扮演了两个角色。第一,它是理解时间序列分析的入门钥匙——AR(2)、AR(p)、ARMA、ARIMA,全都是从这一阶开始往上搭的。你如果没把AR(1)的平稳条件、方差结构、自相关衰减规律嚼透,后面碰到ARIMA的差分阶数、单位根检验,基本就是照猫画虎。第二,它在工业实践里被大量直接使用——高频信号去噪、传感器漂移建模、控制系统的过程模型、金融波动率的前置滤波,很多场景里一个恰到好处的AR(1)就够用了,不需要上复杂的深度模型。

这篇文章我打算从AR(1)入手,一路聊到AR(2),把参数背后的几何意义、平稳性条件、Yule-Walker方程、定阶方法、Python落地和实际踩坑都过一遍。适合两类人:一类是正在学时间序列、被ACF/PACF图搞晕的学生;另一类是工作中要动手拟合模型的工程师。不管你用statsmodels还是自己撸代码,这里的推导和实操步骤都能直接对上。

先破除一个常见误解:AR(1)里的"回归"不是普通线性回归那种 x 到 y 的映射。它回归的对象是同一个变量在时间上错开一期的自己。所以本质上,我们是在用一个变量自己的历史来预测它的现在。这个视角一旦立住,后面所有的自相关函数、偏自相关函数就都顺理成章了。

2. AR(1)的三个关键参数:平稳性、方差与自相关的衰减节奏

AR(1)看着简单,但真正决定它能用不能用的,是 $\phi$ 落在哪个区间。这是整个模型的第一道生死线。

2.1 平稳性条件为什么是 |φ| < 1

我们想要的"平稳",指的是这套随机过程的统计性质不随时间漂移——均值恒定、方差不随时间发散、自协方差只和"时间差"有关,而和"绝对时间点"无关。对AR(1)做递推展开,把 $X_t$ 一直往回代:

$$ X_t = c(1 + \phi + \phi^2 + \cdots) + \sum_{k=0}^{\infty} \phi^k \varepsilon_{t-k} $$

想让这个无穷级数收敛,等比数列公比 $|\phi|$ 必须小于 1。当 $|\phi| < 1$,历史冲击的影响以 $\phi^k$ 的速度衰减,最终"忘掉";当 $|\phi| = 1$,就是所谓的单位根,冲击永不衰减,方差随时间线性增长;当 $|\phi| > 1$,冲击被放大,序列很快爆掉。所以$|\phi| < 1$ 不是随便定的,是收敛性的硬约束

这里有个容易被忽略的细节:很多人在代码里跑出 $\hat\phi = 1.02$ 也不报错,模型照样"能拟合",但他去预测就会发现曲线指数上扬,一塌糊涂。原因就是软性约束不会被自动拦住,逻辑上的病态要靠你自己判断。

2.2 均值、方差、自协方差的标准结论

在 $|\phi| < 1$ 的前提下,AR(1)的均值是:

$$ \mu = \frac{c}{1-\phi} $$

这很好理解——如果 $c=0$,长期均值就是0;$c\neq 0$ 时,所有历史冲击的期望叠加起来就收敛到 $\frac{c}{1-\phi}$。接着是方差:

$$ \gamma(0) = \frac{\sigma^2}{1-\phi^2} $$

注意 $\phi$ 越接近1,分母越接近0,方差被"放大"得越厉害。这解释了为什么强记忆过程的观测值看起来剧烈波动——它其实在累积白噪声的能量。自协方差函数则非常干净:

$$ \gamma(k) = \phi^k \cdot \frac{\sigma^2}{1-\phi^2} $$

而自相关函数(ACF)更简洁:

$$ \rho(k) = \phi^k $$

也就是说,AR(1)的ACF是一条以 $\phi$ 为底数的指数衰减曲线。$\phi$ 正的时候单调衰减,$\phi$ 负的时候正负交替振荡衰减。这个图像特征后面定阶时你会反复用到。

2.3 偏自相关(PACF)的一阶截尾特征

ACF 拖尾,而 PACF 在AR(1)里是一阶截尾的:$\rho_{11} = \phi$,从第二阶起偏自相关为0(理论值)。如果你拿真实数据算出来ACF指数衰减、PACF在一阶后基本落进置信带,那基本就是AR(1)的指纹了。

不过要提醒一句,这只是"理论"识别。实际数据从来不会配合你,样本量小的时候PACF在二阶偶尔"冒个尖"是常事。我一般情况下看PACF只看它整体形态,不会因为某一个小凸起就否定AR(1)。

把这三个参数串起来看:$\phi$ 决定记忆强度和方向,$\sigma^2$ 决定冲击幅度,$c$ 决定长期中枢。这三个数抓准了,AR(1)的行为你就全拿捏了。

3. AR(2)不是AR(1)的简单叠加:特征根与平稳域的几何

一旦把阶数升到二阶,情况就复杂了一个数量级。AR(2)的形式是:

$$ X_t = c + \phi_1 X_{t-1} + \phi_2 X_{t-2} + \varepsilon_t $$

很多人以为只要 $\phi_1$、$\phi_2$ 各自绝对值小于1就稳了,这是个典型的坑。AR(2)的平稳性由 $\phi_1$ 和 $\phi_2$ 的联合约束决定,不是单看某一个

3.1 特征方程与平稳域三角形

把模型改写成滞后算子形式,它的特征方程是:

$$ 1 - \phi_1 z - \phi_2 z^2 = 0 $$

平稳性要求这个方程的所有根都在单位圆外(等价于 $z^2 - \phi_1 z - \phi_2 = 0$ 的根都在单位圆内)。展开成 $(\phi_1, \phi_2)$ 平面上的约束,就是著名的平稳域三角形

约束条件表达式含义
上边界$\phi_1 + \phi_2 < 1$防止同向记忆叠加发散
下边界$\phi_2 - \phi_1 < 1$防止反向交替发散
竖直边界$\phi_2

只要 $(\phi_1, \phi_2)$ 落在这个三角形内,过程就平稳。这三个条件缺一不可,用代码判断的时候我通常直接把这三个不等式一起写进校验函数。

3.2 复根与伪周期:AR(2)比AR(1)多出来的"振荡能力"

AR(1)只能单调衰减或交替振荡,因为它只有一个实系数。AR(2)因为有两个滞后项,特征方程的判别式 $\phi_1^2 + 4\phi_2$ 可能小于0,从而产生一对共轭复根。这时候序列会表现出"准周期"的振荡——像被阻尼的正弦波,一圈圈摆着衰减。

这个能力很关键:很多真实数据(比如潮汐、季节性温度、某些机械振动信号)都有这种周期性回落,AR(1)根本模拟不出来,AR(2)却能用一个很紧凑的参数对儿逼近。所以在信号处理里,AR(2)经常被当成最简的"谐振器"来用。

3.3 AR(2)的ACF与Yule-Walker方程

AR(2)的自相关不再是指数,而是两个指数(或指数乘正弦)的组合,整体依然拖尾。它满足递推关系:

$$ \rho_k = \phi_1 \rho_{k-1} + \phi_2 \rho_{k-2}, \quad k \geq 1 $$

令 $k=1,2$,配上 $\rho_0=1$ 以及对称性 $\rho_{-1} = \rho_1$,就得到Yule-Walker方程:

$$ \rho_1 = \phi_1 + \phi_2 \rho_1 $$ $$ \rho_2 = \phi_1 \rho_1 + \phi_2 $$

解出来:

$$ \rho_1 = \frac{\phi_1}{1-\phi_2}, \qquad \rho_2 = \phi_2 + \frac{\phi_1^2}{1-\phi_2} $$

而偏自相关,AR(2)是二阶截尾:$\rho_{22} = \phi_2$,二阶之后理论为0。所以"PACF拖尾到几阶",就是判断AR模型阶数的核心依据。这是你区分AR(1)和AR(2)最直接的手段:PACF在二阶还有显著尖峰、三阶开始落下去,就倾向于AR(2)

4. 参数估计的三条路:Yule-Walker、最小二乘与极大似然

知道了模型长相,接下来是把它从数据里"抠出来"。AR模型的参数估计有三条主流路径,各有各的脾气。

4.1 Yule-Walker:最优雅但有偏

Yule-Walker的思路是用样本自相关替代理论自相关,直接解那个线性方程组。对AR(1):

$$ \hat\phi = \hat\rho_1 = \frac{\sum_{t=2}^{n}(X_t - \bar X)(X_{t-1} - \bar X)}{\sum_{t=1}^{n}(X_t - \bar X)^2} $$

对AR(2),解那个二元一次方程组就行。这条路计算极快、永远给出平稳解(解一定落在平稳域内),代价是有明显的小样本偏差——$\hat\phi$ 会系统性地偏向0,也就是把记忆强度估低。这就是著名的Hurwicz偏差。样本量上千以后偏差才有意义地消退,小样本下这个坑不能忽视。

4.2 最小二乘:工程上最常走

最小二乘把AR当成普通回归来做:把 $X_{t-1}, X_{t-2}$ 当自变量,$X_t$ 当因变量,求解使残差平方和最小的系数。它和Yule-Walker的区别主要在边缘处理(前几个观测点怎么对齐)。

最小二乘的优点是简单、稳健、容易加约束,statsmodels里也支持在拟合时直接加平稳性约束。工程实践里我基本首选它。要注意的是,在AR设定下最小二乘不是严格BLUE(因为滞后项和误差项存在同期相关),但它是一致估计,大样本性质没问题,小样本略有偏。

4.3 条件极大似然与精确极大似然

极大似然把白噪声的联合密度写出来,对参数求最大化。区别在于前几个观测点怎么处理:

方法处理方式特点
条件极大似然固定前 $p$ 个点简单,小样本有偏
精确极大似然用平稳分布处理初值更准,计算稍重
Burg算法前向+后向误差最小保证平稳,谱估计友好

三种方法在大样本下结果趋同,小样本时Yule-Walker偏差最大、精确MLE最小。实际做定性分析,选哪个影响不大;但如果你要做精确的假设检验或者样本量只有一两百,方法的选择就值得说道了。

5. 用ACF/PACF定阶:从图上读穿模型结构

定阶是AR建模里最考验经验的一步,没有之一。统计量能给你一堆数字,但真正下判断的还是那两张图。

5.1 四种典型形态对照

我把最常见的几个模式整理成表,你对着图套:

ACF表现PACF表现倾向模型
指数/振荡衰减(拖尾)1阶后截尾AR(1)
拖尾2阶后截尾AR(2)
1阶后截尾拖尾MA(1)
均拖尾均拖尾ARMA(1,1)

这里有个非常重要的概念区分:截尾(cut off)指超过某阶后理论值严格为0,图上表现为突然落进置信带不再出来;拖尾(tail off)指缓慢、平滑地衰减,永远不到0。AR模型的标志就是ACF拖尾 + PACF截尾。这一点搞反了,后面全乱套。

5.2 置信带的正确理解

statsmodels默认画的是 $\pm 1.96/\sqrt{n}$ 的置信带。很多人把它当成"绝对值判定线",超过就显著、没超过就不显著。但它是逐点的近似置信区间,同时看20个滞后点,纯随机情况下也期望有1个点越界。所以我判断截尾时,允许尾部有一个偶发越界点,只要它不连续成片

反过来,如果PACF在前三阶都有接近或超出边界的尖峰,就得认真考虑是不是AR(3)甚至更高阶了。凭一个小样本的偶然尖峰去加阶,是新手最容易犯的过拟合错误。

5.3 定阶不能只靠眼看:AIC/BIC补一刀

图形定阶主观性强,所以要配合信息准则。AIC和BIC都是惩罚似然:AIC偏宽松、倾向选大一点的模型,BIC惩罚更重、倾向稀疏模型。我的流程通常是图形定阶给出候选范围,AIC/BIC给出最终选择。如果图形说AR(1)、BIC说AR(1)、AIC说AR(3),我会先试AR(1),再用残差白噪声检验确认;通过就停,不通过再考虑升阶。用最简模型解释数据,是奥卡姆剃刀在时间序列上的直接体现。

6. Python实操:从模拟到拟合再到残差诊断

光说不练都是耍流氓。这一节我把AR(1)和AR(2)的完整流程用Python走一遍,代码可以直接抄。

6.1 模拟一组已知参数的AR序列

先造数据,因为参数已知,我们才能验证估计准不准:

import numpy as np import matplotlib.pyplot as plt np.random.seed(42) def simulate_ar(phi, n, sigma=1.0, burn=200): """简单递推模拟AR过程,burn用来丢掉初始瞬态""" total = n + burn x = np.zeros(total) eps = np.random.normal(0, sigma, total) for t in range(1, total): x[t] = eps[t] for k, p in enumerate(phi, start=1): x[t] += p * x[t - k] return x[burn:] # AR(1) 参数 phi = 0.7 x1 = simulate_ar([0.7], 500) # AR(2) 参数 phi1 = 0.5, phi2 = 0.3 x2 = simulate_ar([0.5, 0.3], 500)

注意那个burn:AR过程从 $x_0=0$ 开始递推,前几十个点还带着"从0出发"的瞬态痕迹,不丢掉会让统计性质失真。这是很多人模拟时忽略的细节。

6.2 用statsmodels拟合并读系数

from statsmodels.tsa.ar_model import AutoReg # AR(1) res1 = AutoReg(x1, lags=1).fit() print(res1.params) print("phi估计值:", res1.params[1]) # AR(2),直接看哪个模型AIC更低 for p in [1, 2, 3, 4]: r = AutoReg(x2, lags=p).fit() print(p, "AIC:", round(r.aic, 2), "BIC:", round(r.bic, 2))

AutoReg默认用最小二乘,res.params里第一个是常数项、后面是各阶系数。跑AR(2)数据,一般AR(2)的BIC会最低。

6.3 残差诊断:别跳过这一步

拟合完必须看残差,否则你根本不知道模型抓干净了没有:

from statsmodels.stats.diagnostic import acorr_ljungbox resid = res1.resid lb = acorr_ljungbox(resid, lags=[10], return_df=True) print(lb)

Ljung-Box检验的原假设是"残差无自相关"。如果p值大于0.05,说明残差里没有留下未解释的自相关结构,模型可以接受;如果p值很小,说明你的阶数不够,序列里还有被漏掉的信息。这一步是新手最容易省、老手最不敢省的操作。

7. 那些教程不会告诉你的坑

最后聊几个实打实踩过之后才明白的坑,纯干货。

第一个坑:$\phi$ 接近1的"伪平稳"。用Yule-Walker估计时,如果真实 $\phi=0.98$,样本量又只有两三百,你估出来的方差会严重失真,置信区间也偏窄,容易得出"这个序列平稳"的错误结论。这种情况我建议直接上单位根检验(ADF/PP),别硬靠AR模型的估计。

第二个坑:$c$ 和 $\mu$ 别搞混。常数项 $c$ 不是序列的均值,均值是 $c/(1-\phi)$。我见过有人拟合完直接把 $c$ 当均值解读,结论差出好几倍。写代码时最好顺手算一下理论均值,跟样本均值对一下,对不上就是模型设定有问题。

第三个坑:只看AIC选阶会过拟合。AIC倾向选大模型,样本量小时尤其明显。我一般会把图形PACF、BIC、残差检验三者都看一遍,三个都指向同一阶数才放心。如果打架,宁可退一阶做保守模型。

第四个坑:模拟时忘了burn-in。前面说过,不丢初始点,算出来的ACF会虚高,尤其 $\phi$ 接近1时更明显。

第五个坑:差分处理要谨慎。一旦序列有单位根,不少人直接差分。但AR模型本身是平稳框架,你要么先做差分把序列稳下来再建AR,要么直接上ARIMA。顺序反了,参数就失去意义了。

我把这五个坑整理成一张速查表,方便你对照:

触发场景应对
伪平稳$\phi$ 接近1、样本量小加做ADF/PP检验
均值误读有非零常数项用 $c/(1-\phi)$ 算均值
过拟合只看AIC图形+BIC+残差三查
瞬态污染模拟忘丢初始点加burn-in
差分错位序列含单位根先稳后建模或改ARIMA

还有一个常被忽视的经验:PACF的置信带在小样本下偏窄,别太当真。样本量几百时,落在边界附近的尖峰可信度很有限,宁愿忽略它。我在实际做短序列分析时,往往把PACF和样本量结合起来判断,样本少于200的一律从严,宁选低阶。

最后说一个心态问题:AR(1)和AR(2)的公式确实很短,但它们的平稳域、方差结构、估计偏差、定阶陷阱,每一样都值得琢磨。很多后来复杂的模型问题,本质都能还原到这两个最简情形上。把这两块地基打牢,你再去处理ARIMA、VAR、状态空间模型,会发现它们不过是AR(1)思想的层层推广而已。我个人的习惯是,每当对某个新模型的平稳性拿不准,就退回AR(1)/AR(2)的几何图像里对照一下,十有八九能想明白问题出在哪。

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

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

立即咨询