一、学习内容
1. ARIMA 模型的定义与公式推导
ARIMA 模型:
- ARIMA 模型全称为自回归积分滑动平均模型 (AutoRegressive Integrated Moving Average),用于分析和预测单变量时间序列数据。ARIMA 模型结合了自回归 (AR) 模型、差分 (I) 和移动平均 (MA) 模型的特点,能够处理非平稳时间序列。
ARIMA 模型的公式:
-
ARIMA 模型通常表示为 ARIMA(p, d, q),其中:
- ppp 表示自回归 (AR) 项的阶数。
- ddd 表示差分 (I) 的次数,用于将非平稳序列转换为平稳序列。
- qqq 表示移动平均 (MA) 项的阶数。
-
ARIMA(p, d, q) 模型的数学表达式:
∇dyt=μ+ϕ1∇dyt−1+⋯+ϕp∇dyt−p+ϵt+θ1ϵt−1+⋯+θqϵt−q\nabla^d y_t = \mu + \phi_1 \nabla^d y_{t-1} + \dots + \phi_p \nabla^d y_{t-p} + \epsilon_t + \theta_1 \epsilon_{t-1} + \dots + \theta_q \epsilon_{t-q}∇dyt=μ+ϕ1∇dyt−1+⋯+ϕp∇dyt−p+ϵt+θ1ϵt−1+⋯+θqϵt−q其中:
- yty_tyt 是时间 ttt 的原始序列值。
- ∇dyt\nabla^d y_t∇dyt 表示经过 ddd 次差分后的平稳序列。
- μ\muμ 是常数项。
- ϕ1,…,ϕp\phi_1, \dots, \phi_pϕ1,…,ϕp 是 AR 项的系数。
- ϵt\epsilon_tϵt 是白噪声项。
- θ1,…,θq\theta_1, \dots, \theta_qθ1,…,θq 是 MA 项的系数。
2. ARIMA 模型的参数识别 (p, d, q)
差分次数 ddd:
- 差分次数 ddd 的选择基于序列的平稳性。通过进行差分,可以消除趋势和季节性,使时间序列变为平稳。一般通过观察时间序列图或进行平稳性检验(如 ADF 检验)来判断是否需要差分以及差分的次数。
自回归阶数 ppp 和 移动平均阶数 qqq:
- 自回归阶数 ppp 和移动平均阶数 qqq 的选择基于自相关函数 (ACF) 和偏自相关函数 (PACF) 的图形分析。
- ACF 图:用于识别 MA 项的阶数。MA 模型的 ACF 图在阶数 qqq 之后通常会出现截尾。
- PACF 图:用于识别 AR 项的阶数。AR 模型的 PACF 图在阶数 ppp 之后通常会出现截尾。
3. 使用 ACF 和 PACF 选择 ARIMA 模型的参数
- 通过绘制差分序列的 ACF 和 PACF 图,可以帮助我们确定 ARIMA 模型的参数 ppp 和 qqq。
- ddd 的选择通常先通过差分序列的平稳性来确定,之后根据差分后的平稳序列来选择 ppp 和 qqq。
二、实战案例
我们将使用 statsmodels
库对某时间序列数据进行 ARIMA 模型的参数选择与拟合。
程序解释
1. 数据加载与原始数据可视化
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.stattools import adfuller
# 加载时间序列数据集
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv"
data = pd.read_csv(url, parse_dates=['Month'], index_col='Month')
# 绘制原始数据的时间序列图
plt.figure(figsize=(12, 6))
plt.plot(data['Passengers'], label='Original')
plt.title('Original Time Series')
plt.xlabel('Date')
plt.ylabel('Number of Passengers')
plt.legend()
plt.grid(True)
plt.show()
程序解释:
- 载入航空乘客数据集,并绘制原始时间序列图,以观察乘客数量的趋势和季节性波动。
输出结果:
原始数据的时间序列图:图表显示了航空乘客数量随时间的变化,呈现出上升趋势和季节性波动,这表明序列是非平稳的。
2. 平稳性检验(ADF 检验)
# 进行ADF平稳性检验
adf_test = adfuller(data['Passengers'])
print('ADF Statistic:', adf_test[0])
print('p-value:', adf_test[1])
程序解释:
- 使用
adfuller
进行 ADF 平稳性检验,以确定是否需要进行差分。ADF 检验的 p 值大于 0.05 表明序列是非平稳的,需进一步差分处理。
输出结果:
ADF Statistic: 0.8153688792060597
p-value: 0.9918802434376411
ADF 平稳性检验结果:ADF 检验的 p 值通常较大(大于 0.05),说明原始时间序列是非平稳的,需要进行差分处理。
3. 一阶差分
# 一阶差分
data_diff = data.diff().dropna()
# 绘制差分后的时间序列图
plt.figure(figsize=(12, 6))
plt.plot(data_diff['Passengers'], label='Differenced')
plt.title('Differenced Time Series')
plt.xlabel('Date')
plt.ylabel('Differenced Passengers')
plt.legend()
plt.grid(True)
plt.show()
程序解释:
- 对时间序列进行一阶差分,以消除趋势,使其成为平稳序列。差分后的序列应表现为围绕零线的随机波动。
输出结果:
差分后的时间序列图:差分后的序列消除了趋势,呈现出围绕零线的随机波动,表明序列趋于平稳。
4. ACF 和 PACF 图的绘制
# 绘制 ACF 和 PACF 图
plt.figure(figsize=(12, 6))
plt.subplot(121)
plot_acf(data_diff['Passengers'], lags=40, ax=plt.gca())
plt.title('ACF')
plt.subplot(122)
plot_pacf(data_diff['Passengers'], lags=40, ax=plt.gca(), method='ywm')
plt.title('PACF')
plt.tight_layout()
plt.show()
程序解释:
- 绘制差分后序列的 ACF 和 PACF 图,用于识别 ARIMA 模型的参数 ppp 和 qqq。通常,ACF 图用于确定 MA 项的阶数 qqq,而 PACF 图用于确定 AR 项的阶数 ppp。
输出结果:
ACF 和 PACF 图:ACF 图和 PACF 图帮助识别 ARIMA 模型的阶数。本例中,ACF 图显示了滞后期的自相关性消失较快,而 PACF 图的截尾现象表明可以选择 AR(2) 和 MA(2) 作为模型参数。
5. ARIMA 模型拟合
# ARIMA 模型拟合 (p, d, q) = (2, 1, 2)
model = ARIMA(data['Passengers'], order=(2, 1, 2))
results = model.fit()
# 输出模型摘要
print(results.summary())
程序解释:
- 根据 ACF 和 PACF 图选择的 ppp、ddd 和 qqq 值,使用
ARIMA
函数拟合 ARIMA 模型。本例中,选择 p=2p=2p=2、d=1d=1d=1(差分一次)和 q=2q=2q=2 来拟合 ARIMA(2, 1, 2) 模型。 - 输出模型的摘要信息,包括模型参数的估计、标准误差、t 统计量等。
输出结果:
ARIMA 模型的摘要:ARIMA(2, 1, 2) 模型的拟合结果摘要包括模型参数的估计值、标准误差、t 统计量和 p 值。模型摘要还包括 AIC(赤池信息准则)和 BIC(贝叶斯信息准则)等指标,用于评估模型的优劣。通过模型摘要,我们可以了解每个参数在模型中的贡献,并评估模型的总体拟合效果。
6. 模型残差分析
# 绘制模型残差
residuals = results.resid
plt.figure(figsize=(12, 6))
plt.plot(residuals)
plt.title('ARIMA Model Residuals')
plt.xlabel('Date')
plt.ylabel('Residuals')
plt.grid(True)
plt.show()
输出结果:
SARIMAX Results
==============================================================================
Dep. Variable: Passengers No. Observations: 144
Model: ARIMA(2, 1, 2) Log Likelihood -671.673
Date: Thu, 29 Aug 2024 AIC 1353.347
Time: 20:46:55 BIC 1368.161
Sample: 01-01-1949 HQIC 1359.366
- 12-01-1960
Covariance Type: opg
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
ar.L1 1.6850 0.020 83.059 0.000 1.645 1.725
ar.L2 -0.9548 0.017 -55.419 0.000 -0.989 -0.921
ma.L1 -1.8432 0.125 -14.790 0.000 -2.087 -1.599
ma.L2 0.9953 0.135 7.371 0.000 0.731 1.260
sigma2 665.9552 114.140 5.835 0.000 442.245 889.665
===================================================================================
Ljung-Box (L1) (Q): 0.30 Jarque-Bera (JB): 1.84
Prob(Q): 0.59 Prob(JB): 0.40
Heteroskedasticity (H): 7.38 Skew: 0.27
Prob(H) (two-sided): 0.00 Kurtosis: 3.14
===================================================================================
输出结果:
-
模型残差分析:模型残差图展示了 ARIMA 模型拟合后的残差序列。如果模型拟合良好,残差应该是白噪声,这意味着残差序列应表现为零均值、无自相关的随机波动。
# 残差的 ACF 图
plot_acf(residuals, lags=40)
plt.title('Residuals ACF')
plt.show()
程序解释:
- 绘制模型残差序列,检查残差是否为白噪声。如果残差没有显著的自相关性(ACF 图显示大部分自相关系数接近于零),则说明模型拟合效果较好。
输出结果:
进一步绘制残差的 ACF 图,以检查残差是否存在显著的自相关性。如果残差的 ACF 图中,大部分滞后期的自相关系数接近于零,且没有明显的模式,则说明模型残差是白噪声,模型拟合效果较好 。
三、结果分析
1. 差分处理
- 差分后的序列消除了原始数据中的趋势成分,表现为平稳的随机波动。差分是将非平稳序列转化为平稳序列的关键步骤,使得后续的 ARIMA 模型可以有效应用。
2. ACF 和 PACF 图
- ACF 图显示了差分后序列的自相关结构,帮助确定 MA 模型的阶数 qqq。
- PACF 图显示了差分后序列的偏自相关结构,帮助确定 AR 模型的阶数 ppp。
- 在本例中,选择 AR(2) 和 MA(2) 是基于 PACF 截尾和 ACF 减弱的特点。
3. ARIMA 模型拟合
- ARIMA(2, 1, 2) 模型结合了自回归项、差分项和移动平均项,通过最大似然估计(MLE)方法拟合模型参数。模型摘要提供了各参数的统计显著性,以及 AIC、BIC 指标,表明模型的拟合效果。
4. 残差分析
- 模型残差图显示,残差序列表现为白噪声,没有显著的自相关性,这说明 ARIMA 模型已经很好地捕捉了时间序列的结构,剩余的误差部分是随机的。
- 如果残差的 ACF 图显示滞后期的自相关性较弱,则表明模型拟合充分,没有漏掉显著的序列信息。
5. 模型的评价
- 通过 AIC 和 BIC 等信息准则,评估模型的优劣,并与其他候选模型进行比较。AIC 和 BIC 越低,模型的表现通常越好。
- ARIMA(2, 1, 2) 模型在本案例中的表现良好,残差是白噪声,模型能够有效地对时间序列进行建模。