05 自回归积分滑动平均模型 (ARIMA)

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()

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值