ARIMA 模型(自回归综合移动平均模型)通俗讲解
前言
最近比较忙,有段时间没看这里了,前段时间我简单介绍了 SMA、ES、Holt 等基于平滑思想的时间序列预测方法。这篇我要讲的是一个更标准、更统计化的预测模型 —— ARIMA 模型(AutoRegressive Integrated Moving Average),中文名为自回归综合移动平均模型。ARIMA 相对于前面的模型来说不只是“平滑”,而是试图通过数学建模方式去解释时间序列中的自相关结构、趋势项甚至是非平稳性。
它背后的逻辑并不算特别复杂,但由于引入了差分、自回归、噪声项等新概念,一开始学习会有些抽象。希望通过今天这篇文章,用通俗、直白的方式帮各位友友们简单快速理解 ARIMA 的核心逻辑与简单代码实现。
1. 什么是 ARIMA?
ARIMA 模型,全称为 AutoRegressive Integrated Moving Average,中文为“自回归综合移动平均模型”,是一种广泛使用的时间序列建模方法。
它的核心思想可以拆成三部分:
- AR(AutoRegressive,自回归):当前值与过去若干期的值有关
- I(Integrated,差分):用于消除非平稳性,让数据趋势更稳定
- MA(Moving Average,移动平均):当前值与过去的随机误差项有关
ARIMA 用三个整数参数表示:ARIMA(p, d, q),其中:
p:自回归项的阶数(使用多少个过去的值)d:差分阶数(数据差分几次后变得平稳)q:移动平均项的阶数(考虑多少个误差滞后项)
因此你可以把 ARIMA 理解为:
“先对数据差分
d次使其平稳,再用 AR( p ) + MA( q ) 对差分后的序列建模。”
与前面我学过的 Holt 模型相比,ARIMA 更偏向于数据驱动的建模,强调利用数据本身的结构进行拟合与预测,不显式地构建趋势或季节性项,而是通过数学结构自动建模。
2. ARIMA 模型的结构与数学公式
ARIMA 模型的完整形式由三个部分构成:
2.1 AR(自回归)部分
自回归的核心思想是:当前值由过去的若干个值线性组合得到。
数学表达式:
Yt=ϕ1Yt−1+ϕ2Yt−2+⋯+ϕpYt−p+ϵt Y_t = \phi_1 Y_{t-1} + \phi_2 Y_{t-2} + \dots + \phi_p Y_{t-p} + \epsilon_t Yt=ϕ1Yt−1+ϕ2Yt−2+⋯+ϕpYt−p+ϵt
其中:
-
YtY_{t}Yt:当前时间点的观测值
-
ϕi\phi_{i}ϕi:自回归系数
-
ϵt\epsilon_{t}ϵt:白噪声误差项
2.2 I(差分)部分
差分是用来让原始数据变得平稳的操作。
一阶差分:
Yt′=Yt−Yt−1 Y'_t = Y_t - Y_{t-1} Yt′=Yt−Yt−1
二阶差分:
Yt′′=Yt′−Yt−1′=(Yt−Yt−1)−(Yt−1−Yt−2) Y''_t = Y'_t - Y'_{t-1} = (Y_t - Y_{t-1}) - (Y_{t-1} - Y_{t-2}) Yt′′=Yt′−Yt−1′=(Yt−Yt−1)−(Yt−1−Yt−2)
我们通过对非平稳数据做 $d$ 次差分,使其变得平稳,再进行建模。
2.3 MA(移动平均)部分
移动平均部分表示当前值不仅受过去误差的影响,还用过去误差的线性组合来建模。
数学表达式:
Yt=ϵt+θ1ϵt−1+θ2ϵt−2+⋯+θqϵt−q Y_t = \epsilon_t + \theta_1 \epsilon_{t-1} + \theta_2 \epsilon_{t-2} + \dots + \theta_q \epsilon_{t-q} Yt=ϵt+θ1ϵt−1+θ2ϵt−2+⋯+θqϵt−q
其中:θj\theta_{j}θj 是移动平均系数。
组合结构小结:
将三部分组合后,得到 ARIMA(p, d, q) 的建模流程:
- 对原始序列做 ddd 次差分,得到平稳序列 Yt′Y'_{t}Yt′
- 使用 AR§ 建模 Yt′Y'_{t}Yt′ 与其滞后项的关系
- 使用 MA(q) 模拟残差误差的变化结构
最终模型的预测值来自 AR 与 MA 的加权和,残差项被显式考虑,提升了预测精度。
3. 参数选择与平稳性判断
在使用 ARIMA 模型之前,我们必须确定三个参数:p、d 和 q。
3.1 如何判断数据是否平稳?
ARIMA 要求输入序列必须是平稳的,因此我们通常从“原始序列是否平稳”开始判断。
- 直观观察:绘图观察数据是否存在趋势、波动性是否随时间变化
- ADF 单位根检验:最常用的平稳性检验方法(Augmented Dickey-Fuller Test)
使用 Python 实现:
from statsmodels.tsa.stattools import adfuller
result = adfuller(series)
print(f"ADF Statistic: {result[0]}")
print(f"p-value: {result[1]}")
若 p-value < 0.05,通常认为序列是平稳的;否则需要进行差分处理。
3.2 如何选择 d(差分阶数)?
- 先对非平稳数据进行一次差分,再重新做 ADF 检验
- 如果差分一次后变得平稳,则 d = 1;否则可能需要 d = 2
一般情况下,
d = 1已经足够,大于 2 的差分较少使用
3.3 如何选择 p 和 q?
这一步主要依赖于自相关图(ACF)和偏自相关图(PACF)的判断:
- ACF(Autocorrelation Function):观察残差与滞后值之间的线性关系 → 选择 q
- PACF(Partial ACF):剔除间接影响后直接滞后项的相关性 → 选择 p
使用 Python 绘制:
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
plot_acf(series)
plot_pacf(series)
一般经验:
- PACF 在第 p 阶截尾(突然断掉) → 自回归阶数可设为 p
- ACF 在第 q 阶截尾 → 移动平均阶数可设为 q
如果看不清,也可以用 auto_arima 自动选择(后续代码会提到)。
4. Python 实现 ARIMA 模型
我们使用两种方式来演示 ARIMA:
- ✅ 手动指定参数 p, d, q
- ✅ 使用
auto_arima自动寻找最优组合
方法一:手动构建 ARIMA
from statsmodels.tsa.arima.model import ARIMA
import matplotlib.pyplot as plt
# 假设 series 为一维时间序列
model = ARIMA(series, order=(2, 1, 2)) # ARIMA(p, d, q)
fit = model.fit()
# 预测未来 10 步
forecast = fit.forecast(steps=10)
print(forecast)
# 绘图
plt.plot(series, label='原始数据')
plt.plot(range(len(series), len(series)+10), forecast, label='预测')
plt.legend()
plt.show()
方法二:使用 auto_arima 自动调参
from pmdarima import auto_arima
# 自动寻找最优 (p,d,q)
model = auto_arima(series, seasonal=False, trace=True)
model.summary()
# 预测
forecast = model.predict(n_periods=10)
auto_arima 会自动执行 ADF 检验、差分判断、AIC/BIC 模型评估,适合初学者快速上手。
5. 总结、思考与叠甲
首先叠甲,我目前研一,文章也是自己记录学习,定位是“通俗入门向”,有些内容可能简化了理论细节,也可能存在理解偏差或表达不够严谨的地方。欢迎各位大佬评论区友好交流,有问题也及时指出,非常感谢!
ARIMA 是时间序列建模中非常经典的基础模型,适用于以下情况:
✅ 适用场景:
- 有明显趋势或非平稳性的数据(如销量、气温)
- 数据中存在滞后相关性结构
- 想使用具备解释性的传统统计方法进行建模与预测
❌ 不适用情况:
- 数据中存在明显季节性(应使用 SARIMA)
- 长期非线性趋势或突变(建议考虑 LSTM、Prophet 等)
📌 总结优缺点:
| 优点 | 缺点 |
|---|---|
| 模型经典,结构清晰 | 仅支持线性相关结构 |
| 可解释性强 | 参数选择需依赖图形或经验 |
| 多种库支持,容易实现 | 对季节性、非线性适应性差 |
🎓 我的学习体会:
ARIMA 是我在学习时序建模过程中真正“开始理解建模是什么”的节点。它的思维方式与之前的 SMA、ES 完全不同,不是“平滑”,而是用方程解释数据演化过程。
虽然参数选择需要一点统计基础和经验判断,但用好之后确实能做出非常稳定且解释清晰的预测效果。
7218

被折叠的 条评论
为什么被折叠?



