ARIMA (自回归综合移动平均)模型讲解

部署运行你感兴趣的模型镜像

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=ϕ1Yt1+ϕ2Yt2++ϕpYtp+ϵ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=YtYt1

二阶差分:

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′′=YtYt1=(YtYt1)(Yt1Yt2)

我们通过对非平稳数据做 $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ϵt1+θ2ϵt2++θqϵtq

其中:θj\theta_{j}θj 是移动平均系数。


组合结构小结:

将三部分组合后,得到 ARIMA(p, d, q) 的建模流程:

  1. 对原始序列做 ddd 次差分,得到平稳序列 Yt′Y'_{t}Yt
  2. 使用 AR§ 建模 Yt′Y'_{t}Yt 与其滞后项的关系
  3. 使用 MA(q) 模拟残差误差的变化结构

最终模型的预测值来自 AR 与 MA 的加权和,残差项被显式考虑,提升了预测精度。


3. 参数选择与平稳性判断

在使用 ARIMA 模型之前,我们必须确定三个参数:pdq

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 完全不同,不是“平滑”,而是用方程解释数据演化过程

虽然参数选择需要一点统计基础和经验判断,但用好之后确实能做出非常稳定且解释清晰的预测效果。

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值