时间序列算法(1): ARIMA(自回归积分滑动平均)
ARIMA 算法介绍
ARIMA(AutoRegressive Integrated Moving Average,自回归积分滑动*均模型)是一种经典的时间序列预测模型,广泛应用于金融、经济、气象等领域的时间序列数据分析和预测。
ARIMA 模型组成
ARIMA 模型由三个部分组成,通常表示为 ARIMA(p,d,q):
- AR(AutoRegressive,自回归):参数 p 表示自回归项的阶数,即当前值与过去 p 个观测值的线性组合
- I(Integrated,积分):参数 d 表示差分阶数,即需要对时间序列进行 d 次差分以实现*稳性
- MA(Moving Average,滑动*均):参数 q 表示移动*均项的阶数,即当前值与过去 q 个预测误差的线性组合
ARIMA 模型的数学表示
ARIMA(p,d,q) 模型可以表示为:
其中:
- \(L\) 是滞后算子
- \(\phi_i\) 是自回归参数
- \(\theta_i\) 是移动*均参数
- \(\varepsilon_t\) 是白噪声
ARIMA 模型构建步骤
- *稳性检验:通过 ADF 检验等方法检验时间序列是否*稳
- 差分处理:如果序列不*稳,进行相应的差分处理,直到序列变为*稳
- 参数确定:通过 ACF(自相关函数)和 PACF(偏自相关函数)图确定模型的 p 和 q 值
- 模型拟合:使用确定的参数拟合 ARIMA 模型
- 模型诊断:检验残差是否为白噪声
- 模型预测:利用拟合好的模型进行预测
在 Python 中使用 ARIMA 模型
import pandas as pd
import numpy as np
from statsmodels.tsa.arima.model import ARIMA
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# 加载数据
# 假设 data 是一个包含时间序列的 pandas Series
# 差分处理
diff_data = data.diff().dropna()
# 绘制 ACF 和 PACF 图以确定 p 和 q
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))
plot_acf(diff_data, ax=ax1, lags=20)
plot_pacf(diff_data, ax=ax2, lags=20)
plt.show()
# 根据图像确定合适的 p 和 q 值后,拟合 ARIMA 模型
model = ARIMA(data, order=(p, d, q))
model_fit = model.fit()
# 查看模型摘要
print(model_fit.summary())
# 预测未来值
forecast = model_fit.forecast(steps=10)
ARIMA 模型的变种
- SARIMA(Seasonal ARIMA):处理具有季节性的时间序列
- ARIMAX:引入外部变量的 ARIMA 模型
- VARIMA:用于多变量时间序列的向量 ARIMA
优缺点
优点:
- 对于*稳或可通过差分转化为*稳的时间序列,预测效果好
- 模型解释性强
- 适用于中短期预测
缺点:
- 对非线性关系建模能力有限
- 需要人工确定参数,有一定的主观性
- 不适合处理高维数据
- 对含有许多零值的间断时间序列表现不佳
ARIMA 算法详细解析与小数据示例
ARIMA 算法是一种强大的时间序列预测工具,让我们通过一个具体的小数据集来详细说明其工作原理。
小数据集示例
假设我们有以下比特币价格的简化时间序列数据(7天连续收盘价):
[44000, 45200, 44800, 46100, 47300, 46800, 48000]
ARIMA 的三个核心组件详解
1. 自回归项 (AR)
AR 部分假设当前值与过去的观测值有线性相关性。对于 AR(p),当前值依赖于前 p 个时间点的值。
例如,AR(2) 可以表示为:
y_t = c + φ_1 * y_(t-1) + φ_2 * y_(t-2) + ε_t
我们的数据示例:如果只看 AR(1) 关系,价格 48000 会部分依赖于前一天的价格 46800。
2. 差分项 (I)
差分是处理非*稳时间序列的关键步骤。对于我们的数据,一阶差分为:
[1200, -400, 1300, 1200, -500, 1200]
差分后的序列更接**稳序列,波动围绕某个固定均值。
3. 移动*均项 (MA)
MA 部分模拟当前值与过去预测误差的关系。对于 MA(q),当前值依赖于前 q 个预测误差。
y_t = c + ε_t + θ_1 * ε_(t-1) + ... + θ_q * ε_(t-q)
ARIMA 模型拟合过程
以这组小数据为例,构建 ARIMA 模型的完整流程:
1. 检验*稳性
首先,我们可以通过简单观察或 ADF 检验判断数据是否*稳。我们的数据显示有明显上升趋势,因此不*稳。
2. 差分处理
对数据进行一阶差分后,差分序列 [1200, -400, 1300, 1200, -500, 1200] 波动性更小,更接**稳。
3. 参数确定 (使用 Python 代码)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.stattools import adfuller
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# 我们的小数据集
data = pd.Series([44000, 45200, 44800, 46100, 47300, 46800, 48000])
# 检查*稳性
result = adfuller(data)
print(f'ADF 统计量: {result[0]}')
print(f'p 值: {result[1]}')
# 可视化原始数据
plt.figure(figsize=(10, 6))
plt.plot(data)
plt.title('Bitcoin 价格')
plt.show()
# 一阶差分
diff_data = data.diff().dropna()
plt.figure(figsize=(10, 6))
plt.plot(diff_data)
plt.title('Bitcoin 价格差分')
plt.show()
# 绘制 ACF 和 PACF
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))
plot_acf(diff_data, ax=ax1, lags=3)
plot_pacf(diff_data, ax=ax2, lags=3)
plt.show()
# 根据 ACF 和 PACF 图,假设我们确定 p=1, d=1, q=1
model = ARIMA(data, order=(1, 1, 1))
model_fit = model.fit()
print(model_fit.summary())
# 预测未来两天
forecast = model_fit.forecast(steps=2)
print(f'未来两天预测: {forecast}')
4. 模型解释
假设我们确定了 ARIMA(1,1,1) 模型,模型会给出参数 φ 和 θ:
y_t - y_(t-1) = c + φ(y_(t-1) - y_(t-2)) + θ*ε_(t-1) + ε_t
通过代入参数和历史值,我们可以预测未来的价格。
5. 计算示例
假设通过拟合得到以下参数:
- φ = 0.3 (AR 系数)
- θ = 0.1 (MA 系数)
- c = 800
那么第 8 天的预测值计算:
y_8 - y_7 = 800 + 0.3 * (y_7 - y_6) + 0.1 * ε_7 + ε_8
代入 y_7 = 48000, y_6 = 46800, 假设 ε_7 = 200:
y_8 - 48000 = 800 + 0.3 * (48000 - 46800) + 0.1 * 200 + 0
y_8 - 48000 = 800 + 0.3 * 1200 + 20
y_8 - 48000 = 800 + 360 + 20
y_8 - 48000 = 1180
y_8 = 49180
ARIMA模型中AR、I和MA的组合原理解释
ARIMA(自回归积分移动*均模型)之所以强大,是因为它将三种不同的时间序列模型成分巧妙地结合在了一起。让我用简单的方式解释这些成分如何组合工作:
AR、I和MA的组合原理
ARIMA模型实际上是按照特定顺序将这三个成分应用到时间序列数据上:
1. 首先应用I(积分)部分
"积分"这个术语可能有些误导,它实际上代表的是差分操作的逆过程。
- 差分(d): 先对原始时间序列进行d次差分,使其变得*稳
- 例如,一阶差分就是计算相邻两个时间点的差值:y'(t) = y(t) - y(t-1)
2. 然后在差分后的数据上应用ARMA模型(AR和MA的结合)
在差分后的*稳序列上,同时应用:
- AR(自回归)部分: 使用过去p个时间点的值来预测当前值
- MA(移动*均)部分: 使用过去q个预测误差来调整预测
具体数学表达
完整的ARIMA(p,d,q)模型实际上是这样工作的:
- 先对原始序列Y进行d次差分,得到新序列W
- 然后对W应用ARMA(p,q)模型:
W_t = c + φ₁W_{t-1} + φ₂W_{t-2} + ... + φₚW_{t-p} +
ε_t + θ₁ε_{t-1} + θ₂ε_{t-2} + ... + θ_qε_{t-q}
其中:
- W_t是差分后的序列值
- φ₁, φ₂, ..., φₚ 是AR系数
- θ₁, θ₂, ..., θ_q 是MA系数
- ε_t是随机误差项
实例说明
假设我们有价格序列[44000, 45200, 44800, 46100, 47300],想要构建ARIMA(1,1,1)模型:
步骤1: 应用一阶差分(I部分)
原始序列: [44000, 45200, 44800, 46100, 47300]
一阶差分: [1200, -400, 1300, 1200]
步骤2: 在差分序列上应用ARMA(1,1)模型
ARMA(1,1)模型表达式:
W_t = c + φ₁W_{t-1} + ε_t + θ₁ε_{t-1}
假设拟合后得到参数:c = 800, φ₁ = 0.3, θ₁ = -0.2
步骤3: 预测下一个差分值
我们需要前一个差分值W_{t-1}=1200和前一个误差ε_{t-1}(假设为100)
W_t = 800 + 0.3*1200 + ε_t + (-0.2)*100
= 800 + 360 - 20 + ε_t
= 1140 + ε_t
假设ε_t=0(最佳预测时的误差期望),则W_t = 1140
步骤4: 将差分值转换回原始预测值
预测的差分值为1140,最后一个实际价格是47300,则:
预测价格 = 47300 + 1140 = 48440
三个部分如何协同工作
- I部分处理非*稳性:通过差分移除趋势和季节性
- AR部分捕捉数据的动态特性:利用观测值之间的相关性
- MA部分处理随机冲击:考虑预测误差的影响
在代码实现中的体现
在Python的statsmodels实现中,当你调用ARIMA(data, order=(1,1,1))时:
- 首先对data进行1次差分
- 然后在差分后的数据上拟合ARMA(1,1)模型
- 预测时,先预测差分序列的未来值
- 最后通过"积分"(累加)操作将结果转换回原始尺度
这也是为什么我们会看到预测函数forecast()返回的是原始尺度的预测值,而非差分后的预测值。
这就是ARIMA模型中AR、I和MA三个部分是如何协同工作的。