当前位置: 首页 > news >正文

用Python实现时间序列模型实战——Day 6: ARIMA 模型的理论基础

一、学习内容
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) 模型在本案例中的表现良好,残差是白噪声,模型能够有效地对时间序列进行建模。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • R 语言学习教程,从入门到精通,R 绘图饼图(23)
  • Flink 1.14.* Flink窗口创建和窗口计算源码
  • 链动2+1与消费增值模式的协同效应
  • NestJs bull 用法
  • Linux驱动开发基础(sr04超声波模块)
  • 算法day16|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
  • filezilla使用教程(window下filezilla使用教程)
  • 梧桐数据库(WuTongDB):什么是“顺序扫描”
  • [GESP202312 四级] 田忌赛马
  • 今日算法:蓝桥杯基础题之“星系炸弹”
  • 掌握 Python列表:从基础到进阶技巧
  • FutureTask通常如何使用?
  • Ethercat设备数据 转IEC61850项目案例
  • django学生就业管理系统—计算机毕业设计源码24237
  • ★ 算法OJ题 ★ 力扣11 - 盛水最多的容器
  • ----------
  • java第三方包学习之lombok
  • js 实现textarea输入字数提示
  • PaddlePaddle-GitHub的正确打开姿势
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 飞驰在Mesos的涡轮引擎上
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 简单实现一个textarea自适应高度
  • 聚簇索引和非聚簇索引
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 巧用 TypeScript (一)
  • 微服务入门【系列视频课程】
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 做一名精致的JavaScripter 01:JavaScript简介
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • #window11设置系统变量#
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (pojstep1.1.2)2654(直叙式模拟)
  • (Python第六天)文件处理
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (zt)最盛行的警世狂言(爆笑)
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (南京观海微电子)——示波器使用介绍
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET 设计模式初探
  • .net 受管制代码
  • .net6 webapi log4net完整配置使用流程
  • .net中调用windows performance记录性能信息
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • @Bean注解详解
  • @RequestBody与@ResponseBody的使用
  • @RestControllerAdvice异常统一处理类失效原因
  • [20150321]索引空块的问题.txt
  • [ACTF2020 新生赛]Upload 1
  • [Angular] 笔记 7:模块