时间序列分析与预测:ARIMA模型及自动调参方法
立即解锁
发布时间: 2025-09-01 00:33:33 阅读量: 5 订阅数: 20 AIGC 

### 时间序列分析与预测:ARIMA模型及自动调参方法
在时间序列分析和预测领域,ARIMA(Autoregressive Integrated Moving Average)模型是一类常用的统计模型,下面将详细介绍其原理、操作步骤及应用。
#### 1. ARIMA模型基础
ARIMA模型旨在通过描述数据中的自相关性来分析和预测时间序列数据,它是简单ARMA模型的扩展,额外的积分组件用于确保序列的平稳性,因为与指数平滑模型不同,ARIMA模型要求时间序列是平稳的。ARIMA模型由以下三个部分组成:
- **AR(自回归)模型**:利用观测值与其p个滞后值之间的关系,在金融领域,可解释动量和均值回归效应。
- **I(积分)**:对原始时间序列进行差分(当前周期值减去上一周期值)以使其平稳,参数d表示差分的次数。
- **MA(移动平均)模型**:利用观测值与最近q个观测值中的白噪声项(冲击)之间的关系,在金融领域,可解释影响时间序列的不可预测冲击。由于MA模型中的白噪声项不可观测,因此不能使用普通最小二乘法(OLS)拟合ARIMA模型,而需使用迭代估计方法,如最大似然估计(MLE)。
这三个组件共同构成了常用的ARIMA(p,d,q)表示法。一般来说,应尽量保持ARIMA参数值尽可能小,以避免不必要的复杂性并防止过拟合,经验法则是d <= 2,p和q不超过5,且模型中AR或MA项可能会占主导地位。
#### 2. 使用ARIMA模型预测美国失业率
下面以2010 - 2019年美国月度失业率数据为例,介绍使用ARIMA模型进行预测的步骤:
1. **导入必要的库**
```python
import pandas as pd
import numpy as np
from statsmodels.tsa.arima.model import ARIMA
from chapter_6_utils import test_autocorrelation
from sklearn.metrics import mean_absolute_percentage_error
```
2. **创建训练集和测试集**
```python
TEST_LENGTH = 12
df_train = df.iloc[:-TEST_LENGTH]
df_test = df.iloc[-TEST_LENGTH:]
```
ARIMA模型非常灵活,通过适当设置超参数,可以得到一些特殊情况:
| 模型表示 | 模型类型 |
| ---- | ---- |
| ARIMA (0,0,0) | 白噪声 |
| ARIMA (0,1,0) 无常数项 | 随机游走 |
| ARIMA (p,0,q) | ARMA(p, q) |
| ARIMA (p,0,0) | AR(p) 模型 |
| ARIMA (0,0,q) | MA(q) 模型 |
| ARIMA (0,1,2) | 阻尼Holt模型 |
| ARIMA (0,1,1) 无常数项 | SES模型 |
| ARIMA (0,2,2) | 具有加性误差的Holt线性方法 |
3. **应用对数变换并计算一阶差分**
```python
df_train["unemp_rate_log"] = np.log(df_train["unemp_rate"])
df_train["first_diff"] = df_train["unemp_rate_log"].diff()
df_train.plot(subplots=True, title="Original vs transformed series")
```
4. **测试差分后序列的平稳性**
```python
fig = test_autocorrelation(df_train["first_diff"].dropna())
```
通过分析测试结果,可知对数变换后序列的一阶差分是平稳的。
5. **拟合两个不同的ARIMA模型并打印摘要**
```python
arima_111 = ARIMA(df_train["unemp_rate_log"], order=(1, 1, 1)).fit()
arima_111.summary()
arima_212 = ARIMA(df_train["unemp_rate_log"], order=(2, 1, 2)).fit()
arima_212.summary()
```
6. **合并拟合值和预测值**
```python
df["pred_111_log"] = arima_111.fittedvalues.append(arima_111.forecast(TEST_LENGTH))
df["pred_111"] = np.exp(df["pred_111_log"])
df["pred_212_log"] = arima_212.fittedvalues.append(arima_212.forecast(TEST_LENGTH))
df["pred_212"] = np.exp(df["pred_212_log"])
```
7. **绘制预测图并计算平均绝对百分比误差(MAPE)**
```python
df[["unemp_rate", "pred_111", "pred_212"]].iloc[1:].plot(title="ARIMA forecast of the US unemployment rate")
df[["unemp_rate", "pred_111", "pred_212"]].iloc[-TEST_LENGTH:].plot(title="Zooming in on the out-of-sample forecast")
mape_111 = mean_absolute_percentage_error(df["unemp_rate"].iloc[-TEST_LENGTH:], df["pred_111"].iloc[-TEST_LENGTH:])
mape_212 = mean_absolute_percentage_error(df["unemp_rate"].iloc[-TEST_LENGTH:], df["pred_212"].iloc[-TEST_LENGTH:])
print(f"MAPE of ARIMA(1,1,1): {100 * mape_111:.2f}%")
print(f"MAPE of ARIMA(2,1,2): {100 * mape_212:.2f}%")
```
结果显示,ARIMA(2,1,2)模型的预测效果优于ARIMA(1,1,1)模型。
8. **提取带
0
0
复制全文
相关推荐









