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

一、学习内容
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 的特点,提供了更灵活的
  • 19
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值