首页 > 编程语言 >用Python实现时间序列模型实战——Day 5: 平稳时间序列模型的介绍

用Python实现时间序列模型实战——Day 5: 平稳时间序列模型的介绍

时间:2024-08-30 12:21:17浏览次数:13  
标签:plt MA Python 模型 AR 序列 ARMA

一、学习内容
1. 移动平均模型 (MA) 的原理与公式

移动平均模型 (MA)

  • 移动平均模型 (MA) 是时间序列模型的一种,用于描述当前值与之前若干个白噪声项的线性组合。MA 模型捕捉了序列中的短期依赖关系,常用于处理白噪声较为明显的序列。
  • MA(q) 模型的数学表达式为:

y_t = \mu + \epsilon_t + \theta_1 \epsilon_{t-1} + \theta_2 \epsilon_{t-2} + \dots + \theta_q \epsilon_{t-q}]

其中:

  • y_t 是时间 t 的观测值。
  • \mu 是序列的均值。
  • \epsilon_t是白噪声项,均值为 0,方差为 \sigma^2
  • \theta_1, \theta_2, \dots, \theta_q 是 MA 模型的参数,表示白噪声项的系数。
  • q 是滞后项的阶数。
2. 自回归模型 (AR) 的原理与公式

自回归模型 (AR)

  • 自回归模型 (AR) 是时间序列模型的一种,用于描述当前值与之前若干个自身值的线性组合。AR 模型捕捉了序列中的长期依赖关系,适合于平稳时间序列。
  • AR(p) 模型的数学表达式为:

y_t = \mu + \phi_1 y_{t-1} + \phi_2 y_{t-2} + \dots + \phi_p y_{t-p} + \epsilon_t

其中:

  • y_t 是时间 t 的观测值。
  • \mu 是序列的均值。
  • \phi_1, \phi_2, \dots, \phi_p 是 AR 模型的参数,表示自回归项的系数。
  • \epsilon_t 是白噪声项。
  • p 是滞后项的阶数。
3. ARMA 模型的概念与组合方法

ARMA 模型

  • ARMA 模型结合了自回归 (AR) 模型和移动平均 (MA) 模型的特点,用于描述当前值与之前若干个自身值及白噪声项的线性组合。ARMA 模型适用于平稳时间序列。
  • ARMA(p, q) 模型的数学表达式为:

y_t = \mu + \phi_1 y_{t-1} + \dots + \phi_p y_{t-p} + \epsilon_t + \theta_1 \epsilon_{t-1} + \dots + \theta_q \epsilon_{t-q}

其中:

  • y_t 是时间 t 的观测值。
  • \mu 是序列的均值。
  • \phi_1, \phi_2, \dots, \phi_p 是 AR 模型的参数。
  • \theta_1, \theta_2, \dots, \theta_q​ 是 MA 模型的参数。
  • \epsilon_t 是白噪声项。
  • p 和 q 分别是 AR 和 MA 的滞后项阶数。
二、实战案例

我们将使用 statsmodels 库对时间序列数据进行 AR、MA 和 ARMA 模型的拟合,并比较各模型的拟合效果。

1. 数据加载与原始数据可视化
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.stattools import acf, pacf

# 加载时间序列数据集
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. 一阶差分
# 进行一阶差分,使时间序列平稳
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()

程序解释: 

  • 对时间序列进行一阶差分以消除趋势,使其成为平稳序列。绘制差分后的时间序列图以观察差分效果。

结果输出: 

3. ACF 和 PACF 计算与可视化
# 计算 ACF 和 PACF
acf_vals = acf(data_diff, nlags=20)
pacf_vals = pacf(data_diff, nlags=20)

# 绘制 ACF 和 PACF 图
plt.figure(figsize=(12, 6))
plt.subplot(121)
plt.stem(acf_vals, use_line_collection=True)
plt.title('ACF')
plt.xlabel('Lags')
plt.ylabel('ACF Value')

plt.subplot(122)
plt.stem(pacf_vals, use_line_collection=True)
plt.title('PACF')
plt.xlabel('Lags')
plt.ylabel('PACF Value')

plt.tight_layout()
plt.show()

程序解释: 

  • 计算并绘制差分后的时间序列的自相关函数 (ACF) 和偏自相关函数 (PACF),帮助确定 AR 和 MA 模型的阶数。

结果输出: 

4. AR 模型拟合
# AR 模型拟合
model_ar = ARIMA(data_diff, order=(2, 0, 0))
results_ar = model_ar.fit()
print("AR(2) Model Summary:")
print(results_ar.summary())

程序解释: 

使用 ARIMA 函数拟合自回归模型 (AR),设置 order=(2, 0, 0) 表示使用 AR(2) 模型。输出模型的摘要信息。

结果输出: 

AR(2) Model Summary:
                               SARIMAX Results                                
==============================================================================
Dep. Variable:             Passengers   No. Observations:                  143
Model:                 ARIMA(2, 0, 0)   Log Likelihood                -694.988
Date:                Wed, 28 Aug 2024   AIC                           1397.975
Time:                        21:27:30   BIC                           1409.827
Sample:                    02-01-1949   HQIC                          1402.791
                         - 12-01-1960                                         
Covariance Type:                  opg                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const          2.4075      3.125      0.770      0.441      -3.717       8.532
ar.L1          0.3792      0.088      4.331      0.000       0.208       0.551
ar.L2         -0.2314      0.064     -3.627      0.000      -0.357      -0.106
sigma2       973.3675    111.006      8.769      0.000     755.801    1190.934
===================================================================================
Ljung-Box (L1) (Q):                   0.17   Jarque-Bera (JB):                 0.50
Prob(Q):                              0.68   Prob(JB):                         0.78
Heteroskedasticity (H):               8.24   Skew:                            -0.06
Prob(H) (two-sided):                  0.00   Kurtosis:                         3.26
===================================================================================
5. MA 模型拟合
# MA 模型拟合
model_ma = ARIMA(data_diff, order=(0, 0, 2))
results_ma = model_ma.fit()
print("\nMA(2) Model Summary:")
print(results_ma.summary())

程序解释: 

  • 使用 ARIMA 函数拟合移动平均模型 (MA),设置 order=(0, 0, 2) 表示使用 MA(2) 模型。输出模型的摘要信息。

结果输出: 

MA(2) Model Summary:
                               SARIMAX Results                                
==============================================================================
Dep. Variable:             Passengers   No. Observations:                  143
Model:                 ARIMA(0, 0, 2)   Log Likelihood                -695.193
Date:                Wed, 28 Aug 2024   AIC                           1398.386
Time:                        21:27:36   BIC                           1410.237
Sample:                    02-01-1949   HQIC                          1403.201
                         - 12-01-1960                                         
Covariance Type:                  opg                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const          2.4331      2.890      0.842      0.400      -3.230       8.097
ma.L1          0.3735      0.072      5.161      0.000       0.232       0.515
ma.L2         -0.2830      0.061     -4.670      0.000      -0.402      -0.164
sigma2       974.2968    110.557      8.813      0.000     757.608    1190.985
===================================================================================
Ljung-Box (L1) (Q):                   0.03   Jarque-Bera (JB):                 1.12
Prob(Q):                              0.86   Prob(JB):                         0.57
Heteroskedasticity (H):               7.24   Skew:                            -0.19
Prob(H) (two-sided):                  0.00   Kurtosis:                         3.22
===================================================================================
6. ARMA 模型拟合
# ARMA 模型拟合
model_arma = ARIMA(data_diff, order=(2, 0, 2))
results_arma = model_arma.fit()
print("\nARMA(2, 2) Model Summary:")
print(results_arma.summary())

程序解释: 

  • 使用 ARIMA 函数拟合 ARMA 模型,设置 order=(2, 0, 2) 表示使用 ARMA(2, 2) 模型。输出模型的摘要信息。

结果输出: 

ARMA(2, 2) Model Summary:
                               SARIMAX Results                                
==============================================================================
Dep. Variable:             Passengers   No. Observations:                  143
Model:                 ARIMA(2, 0, 2)   Log Likelihood                -666.022
Date:                Wed, 28 Aug 2024   AIC                           1344.044
Time:                        21:27:36   BIC                           1361.821
Sample:                    02-01-1949   HQIC                          1351.267
                         - 12-01-1960                                         
Covariance Type:                  opg                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const          2.5314      0.735      3.444      0.001       1.091       3.972
ar.L1          1.6478      0.028     58.897      0.000       1.593       1.703
ar.L2         -0.9095      0.025    -36.756      0.000      -0.958      -0.861
ma.L1         -1.9092      0.814     -2.344      0.019      -3.506      -0.313
ma.L2          0.9990      0.852      1.173      0.241      -0.671       2.669
sigma2       610.8383    534.405      1.143      0.253    -436.576    1658.252
===================================================================================
Ljung-Box (L1) (Q):                   1.21   Jarque-Bera (JB):                 2.78
Prob(Q):                              0.27   Prob(JB):                         0.25
Heteroskedasticity (H):               7.02   Skew:                             0.33
Prob(H) (two-sided):                  0.00   Kurtosis:                         3.18
===================================================================================
三、结果分析
1. 原始数据的时间序列图
  • 图表显示了航空乘客数量随时间的变化,呈现出上升趋势和季节性波动。
2. 差分后的时间序列图
  • 差分后的序列消除了趋势,表现出围绕零线波动的特点,序列趋于平稳。
3. ACF 和 PACF 图
  • ACF 图展示了不同滞后时间下的自相关性,PACF 图展示了不同滞后时间下的偏自相关性。通过这些图可以帮助确定 AR 和 MA 模型的阶数。
4. AR 模型的摘要
  • 输出 AR(2) 模型的拟合结果,包括模型的系数估计、标准误差、t 统计量等。AR 模型适合捕捉序列中的长期依赖关系。
5. MA 模型的摘要
  • 输出 MA(2) 模型的拟合结果,MA 模型擅长捕捉序列中的短期依赖和白噪声项。
6. ARMA 模型的摘要
  • 输出 ARMA(2, 2) 模型的拟合结果,ARMA 模型结合了 AR 和 MA 的特点,提供了更灵活的

标签:plt,MA,Python,模型,AR,序列,ARMA
From: https://blog.csdn.net/qq_41698317/article/details/141650342

相关文章

  • AI模型:追求全能还是专精?
    AI模型:追求全能还是专精?近日,OpenAI预计在秋季推出代号为“草莓”的新AI。从专注于数学问题到处理主观营销策略,"草莓"模型展现出惊人的多样性。而这种全能型AI是否代表了未来趋势?相比专攻于某一领域的专业型AI产品,全能型AI产品是否一定具有更广阔的经济市场、吸引更多用户喜......
  • AI模型:追求全能还是专精?详细阐述
    AI模型:追求全能还是专精?近日,OpenAI预计在秋季推出代号为“草莓”的新AI。从专注于数学问题到处理主观营销策略,"草莓"模型展现出惊人的多样性。而这种全能型AI是否代表了未来趋势?相比专攻于某一领域的专业型AI产品,全能型AI产品是否一定具有更广阔的经济市场、吸引更多用户喜......
  • spring boot 以请求来调用Ollama大模型,不使用spring ai
    之前有一版使用springai的,但是其实Ollama有一套api可以直接调用。api地址是https://github.com/ollama/ollama/blob/main/docs/api.md我们聊天其实调用的就是这个(其余的我就不赘述了,大家自行研究)调用http请求这方面,大家可自行编写,请求的方式五花八门,网上的库......
  • 代码随想录day45 || 115 不同子序列, 583 两个字符串删除操作, 72 编辑距离
    115不同子序列funcnumDistinct(sstring,tstring)int{ //动态规划,思考一下判断连续和不连续的区别,如果相等都是左上角+1,如果不等,连续情况就是直接等于左上角,不连续情况直接归零 //dp[i][j]表示s[i]中存在t[j]结尾的的个数 //递推公式,不要求连续字串,所以,如果s[i......
  • 20240827_102249 python 认识csv格式
    目标认识csv格式制作一个csv文件示例......
  • AI大模型专题:2023大模型落地应用案例集
    概述私域知识问答系统是一种旨在满足特定组织或团队内部需求的智能信息获取工具。其产品形式包括:知识问答、企业助理、办公助手、智能客服、数字员工等。岩芯数通过自研构建可控可信的通用大模型,缓解了行业中大模型幻觉问题,提升型的准问答能力,回答准确率达到90%,目前已在......
  • Python编程实战营:四款实用小项目助你快速入门,从零开始打造你的个人项目集!
    踏入编程世界的门槛,总是伴随着既兴奋又忐忑的心情。作为Python的新手,你是否渴望通过实际项目来巩固知识、提升技能?本篇文章将引领你踏上一段从理论到实践的精彩旅程,通过四个精心设计的项目,让你在趣味与挑战中快速成长。项目一:简易文本编辑器首先,我们将从基础出发,动手打造一......
  • python模型训练之朴素理解
            模型训练就是通过一组训练数据,这组数据我这里举例x,y。x是自变量,y是因变量。那么我们可以定义数据x=[2,5,8,11,13],y=[100,156,144,180],        这些数据是我自己随便写的。我们可以看到这组数据类似y=ax。        然后我们想要的是通......
  • 20240827_102109 python 字符流遍历得到每一行的数据
    需求python字符流遍历得到每一行的数据读取文件的内容每隔一秒钟,显示一行内容示例1示例2......
  • Python如何进行多行注释?
    在Python编码的过程中,注释是非常重要的存在,它可以让我们的代码更加易于理解和维护,也是我们需要遵循的编码原则。那么Python注释多行的方法有哪些?本文为大家介绍一下。1、使用快捷键注释多行代码最简单的方法就是使用快捷键。在Windows和Linux系统中,使用Ctrl+/可以快速......