1、基本介绍
自回归积分滑动平均模型 (ARIMA) 是一种常用的时间序列预测模型,能够处理非平稳的时间序列数据。ARIMA模型的基本思想是通过对时间序列数据进行差分操作,使其变得平稳,然后使用自回归(AR)和移动平均(MA)模型来进行预测。
2、ARIMA模型的组成
ARIMA模型由三个主要部分组成:
-
自回归 (AR):模型的自回归部分表示时间序列当前值与其过去值之间的关系。AR部分的参数由滞后项的数量决定,通常记作
p
。 -
差分 (I):差分部分用于将非平稳的时间序列数据转化为平稳序列。通过对时间序列数据进行差分处理,消除趋势和季节性。差分的次数由参数
d
确定。 -
移动平均 (MA):模型的移动平均部分表示时间序列当前值与过去误差项的关系。MA部分的参数由误差项的滞后数量决定,通常记作
q
。
3、ARIMA模型的数学表示
ARIMA模型的数学公式表示为:
(1 - φ1B - φ2B^2 - ... - φpB^p)(1 - B)^d Y_t = (1 + θ1B + θ2B^2 + ... + θqB^q) ε_t
其中:
Y_t 是时间序列数据
B 是滞后算子(即 B Y_t = Y_{t-1})
φ_i 是自回归部分的参数(AR部分)
θ_i 是移动平均部分的参数(MA部分)
ε_t 是白噪声误差项
p 是自回归项的阶数
d 是差分次数
q 是移动平均项的阶数
4、模型建模步骤
-
数据预处理:收集和清洗时间序列数据,检查缺失值和异常值。
-
平稳性检查:使用图形方法和单位根检验对数据进行平稳性检查。
-
模型识别:使用ACF和PACF图来确定AR和MA部分的阶数。
-
模型估计:使用统计软件估计ARIMA模型的参数。
-
模型验证:检查残差是否符合白噪声假设,并调整模型以提高拟合优度。
-
模型预测:应用模型进行未来值的预测,并评估预测性能。
5、ARIMA模型的应用与优缺点
应用示例
ARIMA模型可以用于各种时间序列数据的预测和分析,包括:
- 财务市场的股票价格预测
- 经济指标如GDP和失业率的分析
- 气象数据如温度和降水量的预测
- 销售数据的需求预测
优点:
- ARIMA模型能够处理具有趋势的时间序列数据。
- 模型可以通过差分处理处理非平稳序列。
- 适用于短期预测。
缺点:
- 对于具有复杂季节性模式的时间序列,ARIMA模型可能不够灵活。
- 模型的参数选择可能需要较多的试验和错误。
- 对于长周期预测,ARIMA模型可能不如一些更复杂的模型(如深度学习模型)有效。
6、ARIMA代码详解
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
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体字体
matplotlib.rcParams['axes.unicode_minus'] = False # 解决负号 '-' 显示为方块的问题
# 生成示例数据
np.random.seed(42) # 设置随机种子以确保结果可重复
n = 100 # 数据点数量
data = np.random.randn(n).cumsum() # 生成随机数据的累计和作为时间序列数据
# 创建时间序列数据
date_range = pd.date_range(start='2022-01-01', periods=n, freq='D') # 生成日期范围
time_series = pd.Series(data, index=date_range) # 创建时间序列
# 绘制时间序列图
plt.figure(figsize=(10, 4))
plt.plot(time_series)
plt.title('时间序列图')
plt.xlabel('日期')
plt.ylabel('值')
plt.show()
# ADF检验,确定差分次数d
result = adfuller(time_series)
print('ADF Statistic:', result[0])
print('p-value:', result[1])
print('Critical Values:', result[4])
# 如果p-value大于0.05,序列可能是非平稳的,需要差分
d = 0
if result[1] > 0.05:
d = 1 # 默认值,根据实际需要可能需要进一步差分
# 对序列进行差分
diff_series = time_series.diff().dropna()
# 再次进行ADF检验
result_diff = adfuller(diff_series)
print('差分后 ADF Statistic:', result_diff[0])
print('差分后 p-value:', result_diff[1])
print('差分后 Critical Values:', result_diff[4])
# 绘制自相关图和偏自相关图
plt.figure(figsize=(12, 6))
plt.subplot(121)
plot_acf(diff_series, lags=20, ax=plt.gca())
plt.title('自相关图 (ACF)')
plt.subplot(122)
plot_pacf(diff_series, lags=20, ax=plt.gca())
plt.title('偏自相关图 (PACF)')
plt.show()
# 确定p和q的值
p = 1 # 根据ACF和PACF图进行调整
q = 1 # 根据ACF和PACF图进行调整
# 创建和拟合ARIMA模型
model = ARIMA(time_series, order=(p, d, q))
model_fit = model.fit()
# 输出模型总结
print(model_fit.summary())
# 计算AIC和BIC,尝试不同的(p, d, q)组合
best_aic = np.inf
best_bic = np.inf
best_order = None
# 尝试不同的参数组合
for p in range(0, 3):
for d in range(0, 2):
for q in range(0, 3):
try:
model = ARIMA(time_series, order=(p, d, q))
model_fit = model.fit()
aic = model_fit.aic
bic = model_fit.bic
if aic < best_aic:
best_aic = aic
best_bic = bic
best_order = (p, d, q)
except:
continue
print(f'最佳模型参数 (p, d, q): {best_order}')
print(f'最佳 AIC: {best_aic}')
print(f'最佳 BIC: {best_bic}')
# 使用最佳模型进行预测
best_p, best_d, best_q = best_order
best_model = ARIMA(time_series, order=(best_p, best_d, best_q))
best_model_fit = best_model.fit()
# 进行预测
forecast_steps = 2 # 预测未来10个时间点的数据
forecast = best_model_fit.forecast(steps=forecast_steps) # 获取预测值
forecast_index = pd.date_range(start=time_series.index[-1] + pd.Timedelta(days=1), periods=forecast_steps, freq='D') # 生成预测日期
# 将预测结果转化为Series对象
forecast_series = pd.Series(forecast, index=forecast_index)
# 绘制预测结果
plt.figure(figsize=(10, 4))
plt.plot(time_series, label='历史数据')
plt.plot(forecast_series, label='预测数据', color='red')
plt.title('ARIMA模型预测')
plt.xlabel('日期')
plt.ylabel('值')
plt.legend()
plt.show()