时间序列算法(1): ARIMA(自回归积分滑动平均)

ARIMA 算法介绍

ARIMA(AutoRegressive Integrated Moving Average,自回归积分滑动*均模型)是一种经典的时间序列预测模型,广泛应用于金融、经济、气象等领域的时间序列数据分析和预测。

ARIMA 模型组成

ARIMA 模型由三个部分组成,通常表示为 ARIMA(p,d,q):

  1. AR(AutoRegressive,自回归):参数 p 表示自回归项的阶数,即当前值与过去 p 个观测值的线性组合
  2. I(Integrated,积分):参数 d 表示差分阶数,即需要对时间序列进行 d 次差分以实现*稳性
  3. MA(Moving Average,滑动*均):参数 q 表示移动*均项的阶数,即当前值与过去 q 个预测误差的线性组合

ARIMA 模型的数学表示

ARIMA(p,d,q) 模型可以表示为:

\[(1 - \sum_{i=1}^{p} \phi_i L^i) (1 - L)^d X_t = (1 + \sum_{i=1}^{q} \theta_i L^i) \varepsilon_t \]

其中:

  • \(L\) 是滞后算子
  • \(\phi_i\) 是自回归参数
  • \(\theta_i\) 是移动*均参数
  • \(\varepsilon_t\) 是白噪声

ARIMA 模型构建步骤

  1. *稳性检验:通过 ADF 检验等方法检验时间序列是否*稳
  2. 差分处理:如果序列不*稳,进行相应的差分处理,直到序列变为*稳
  3. 参数确定:通过 ACF(自相关函数)和 PACF(偏自相关函数)图确定模型的 p 和 q 值
  4. 模型拟合:使用确定的参数拟合 ARIMA 模型
  5. 模型诊断:检验残差是否为白噪声
  6. 模型预测:利用拟合好的模型进行预测

在 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 模型的变种

  1. SARIMA(Seasonal ARIMA):处理具有季节性的时间序列
  2. ARIMAX:引入外部变量的 ARIMA 模型
  3. 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)模型实际上是这样工作的:

  1. 先对原始序列Y进行d次差分,得到新序列W
  2. 然后对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))时:

  1. 首先对data进行1次差分
  2. 然后在差分后的数据上拟合ARMA(1,1)模型
  3. 预测时,先预测差分序列的未来值
  4. 最后通过"积分"(累加)操作将结果转换回原始尺度

这也是为什么我们会看到预测函数forecast()返回的是原始尺度的预测值,而非差分后的预测值。

这就是ARIMA模型中AR、I和MA三个部分是如何协同工作的。

posted @ 2025-04-03 17:48  ffl  阅读(877)  评论(0)    收藏  举报