用Python实现时间序列模型实战——Day 9: SARIMA 模型的诊断与调整

一、学习内容
1. SARIMA 模型的残差分析与诊断

残差分析

  • 在拟合 SARIMA 模型后,我们需要对模型的残差进行分析,以确保模型没有遗漏重要的信息。一个好的模型应该具有白噪声残差,即残差应该是零均值、方差恒定且无自相关性的。
  • 残差分析可以通过以下步骤进行:
    • 可视化残差序列:绘制残差的时间序列图,以观察其是否表现为随机波动。
    • 残差的 ACF 图:绘制残差的自相关函数 (ACF) 图,检查是否存在显著的自相关性。
    • Ljung-Box 检验:使用 Ljung-Box 检验来进一步确认残差是否为白噪声。
2. 模型的优化与参数调整

参数调整

  • 如果残差分析显示残差存在显著的自相关性或不符合白噪声假设,则需要对 SARIMA 模型的参数进行调整。通过调整 p, d, qP, D, Q, m 参数,可以提高模型的拟合效果。
  • AIC/BIC 信息准则:在调整参数时,可以使用 AIC(赤池信息准则)和 BIC(贝叶斯信息准则)作为评价标准,选择 AIC 或 BIC 最小的模型。

模型对比

  • 通过尝试不同的参数组合,并比较模型的 AIC 和 BIC 值,来确定最优的模型。
  • 对比新旧模型的残差分析结果,确认优化后的模型是否改善了残差的表现。
二、实战案例

我们将使用 statsmodels 库对一个季节性数据集(如航空乘客数据)进行 SARIMA 模型的残差分析与调整。

1. 数据加载与 SARIMA 模型拟合

import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.stats.diagnostic import acorr_ljungbox

# 加载时间序列数据集
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv"
data = pd.read_csv(url, parse_dates=['Month'], index_col='Month')

# SARIMA 模型拟合 (p, d, q) x (P, D, Q, m) = (1, 1, 1) x (1, 1, 1, 12)
model = SARIMAX(data['Passengers'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
results = model.fit()

# 输出模型摘要
print(results.summary())

程序解释: 

  • 载入航空乘客数据集,并使用 SARIMAX 函数拟合 SARIMA(1, 1, 1)(1, 1, 1, 12) 模型,输出模型摘要信息。

程序的运行结果: 

SARIMAX Results                                      
==========================================================================================
Dep. Variable:                         Passengers   No. Observations:                  144
Model:             SARIMAX(1, 1, 1)x(1, 1, 1, 12)   Log Likelihood                -506.149
Date:                            Mon, 02 Sep 2024   AIC                           1022.299
Time:                                    20:27:49   BIC                           1036.675
Sample:                                01-01-1949   HQIC                          1028.140
                                     - 12-01-1960                                         
Covariance Type:                              opg                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
ar.L1         -0.1272      0.356     -0.357      0.721      -0.825       0.570
ma.L1         -0.2149      0.325     -0.660      0.509      -0.853       0.423
ar.S.L12      -0.9272      0.214     -4.341      0.000      -1.346      -0.509
ma.S.L12       0.8395      0.309      2.717      0.007       0.234       1.445
sigma2       130.7819     15.420      8.481      0.000     100.559     161.005
===================================================================================
Ljung-Box (L1) (Q):                   0.00   Jarque-Bera (JB):                 7.05
Prob(Q):                              0.99   Prob(JB):                         0.03
Heteroskedasticity (H):               2.65   Skew:                             0.13
Prob(H) (two-sided):                  0.00   Kurtosis:                         4.11
===================================================================================

SARIMA(1, 1, 1)(1, 1, 1, 12) 模型的摘要:模型摘要中显示了各参数的估计值、标准误差、t 统计量等信息,以及 AIC/BIC 信息准则,用于评估模型的拟合效果。 

2. 残差分析
# 绘制残差时间序列图
residuals = results.resid
plt.figure(figsize=(12, 6))
plt.plot(residuals)
plt.title('Residuals of SARIMA(1, 1, 1)(1, 1, 1, 12) Model')
plt.xlabel('Date')
plt.ylabel('Residuals')
plt.grid(True)
plt.show()

程序解释: 

  • 绘制 SARIMA 模型拟合后的残差时间序列图,观察残差的随机性和波动情况。如果残差表现为无趋势且围绕零线波动,则表明残差是白噪声。

程序的运行结果:

残差分析:残差时间序列图显示了 SARIMA 模型拟合后的残差。如果残差表现为随机波动且无显著趋势,则表明模型残差接近白噪声。

# 绘制残差的 ACF 图
plot_acf(residuals, lags=40)
plt.title('ACF of Residuals')
plt.show()

程序解释: 

  • 绘制残差的 ACF 图,检查残差的自相关性。如果残差的 ACF 图中没有显著的自相关性,说明残差符合白噪声的假设。

程序的运行结果:

残差的 ACF 图用于检查残差的自相关性,如果没有显著的自相关性,则残差可以被认为是白噪声。 

3. Ljung-Box 检验
# Ljung-Box 检验
ljung_box_results = acorr_ljungbox(residuals, lags=[10], return_df=True)
print("Ljung-Box Test Results:")
print(ljung_box_results)

程序解释: 

  • 使用 Ljung-Box 检验进一步确认残差是否为白噪声。Ljung-Box 检验的 p 值如果较大(通常大于 0.05),则无法拒绝原假设,表明残差无显著自相关性。

程序的运行结果:

Ljung-Box Test Results:
     lb_stat  lb_pvalue
10  6.182128   0.799737

 Ljung-Box 检验:Ljung-Box 检验的结果显示了残差的 p 值。如果 p 值较大(通常大于 0.05),则无法拒绝原假设,说明残差无显著自相关性,模型拟合效果较好。

4. 模型优化与对比
# 尝试不同的模型进行优化
model_alt = SARIMAX(data['Passengers'], order=(2, 1, 2), seasonal_order=(1, 1, 1, 12))
results_alt = model_alt.fit()

# 输出新的模型摘要
print("\nAlternative SARIMA(2, 1, 2)(1, 1, 1, 12) Model Summary:")
print(results_alt.summary())

程序解释: 

  • 尝试一个新的 SARIMA(2, 1, 2)(1, 1, 1, 12) 模型,并输出模型摘要信息。

程序的运行结果:

Alternative SARIMA(2, 1, 2)(1, 1, 1, 12) Model Summary:
                                      SARIMAX Results                                       
============================================================================================
Dep. Variable:                           Passengers   No. Observations:                  144
Model:             SARIMAX(2, 1, 2)x(1, 1, [1], 12)   Log Likelihood                -503.024
Date:                              Mon, 02 Sep 2024   AIC                           1020.048
Time:                                      20:28:01   BIC                           1040.174
Sample:                                  01-01-1949   HQIC                          1028.226
                                       - 12-01-1960                                         
Covariance Type:                                opg                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
ar.L1          0.4441      0.388      1.145      0.252      -0.316       1.204
ar.L2          0.3287      0.303      1.086      0.278      -0.265       0.922
ma.L1         -0.8352      0.402     -2.079      0.038      -1.623      -0.048
ma.L2         -0.1385      0.385     -0.359      0.719      -0.894       0.617
ar.S.L12      -0.8799      0.274     -3.213      0.001      -1.417      -0.343
ma.S.L12       0.7843      0.359      2.183      0.029       0.080       1.489
sigma2       124.5105     14.050      8.862      0.000      96.974     152.047
===================================================================================
Ljung-Box (L1) (Q):                   0.03   Jarque-Bera (JB):                12.42
Prob(Q):                              0.86   Prob(JB):                         0.00
Heteroskedasticity (H):               2.62   Skew:                             0.14
Prob(H) (two-sided):                  0.00   Kurtosis:                         4.48
===================================================================================
  • 模型优化与对比:尝试一个新的 SARIMA(2, 1, 2)(1, 1, 1, 12) 模型,并与原模型进行对比。

# 绘制新的模型残差时间序列图
residuals_alt = results_alt.resid
plt.figure(figsize=(12, 6))
plt.plot(residuals_alt)
plt.title('Residuals of SARIMA(2, 1, 2)(1, 1, 1, 12) Model')
plt.xlabel('Date')
plt.ylabel('Residuals')
plt.grid(True)
plt.show()

# 对新模型的残差进行 Ljung-Box 检验
ljung_box_results_alt = acorr_ljungbox(residuals_alt, lags=[10], return_df=True)
print("Ljung-Box Test Results for SARIMA(2, 1, 2)(1, 1, 1, 12):")
print(ljung_box_results_alt)

程序解释: 

  • 比较新旧模型的残差分析结果和 Ljung-Box 检验结果,以确定新的模型是否在残差方面有显著改善。

程序的运行结果:

Ljung-Box Test Results for SARIMA(2, 1, 2)(1, 1, 1, 12):
     lb_stat  lb_pvalue
10  5.775787   0.833736

 新模型的残差分析和 Ljung-Box 检验结果将显示新的模型在残差方面是否有改善,如果新模型的残差表现更接近白噪声,且 AIC/BIC 值更低,则表明新模型更优。

  • 三、结果分析
1. 残差分析与模型诊断
  • 通过残差时间序列图和 ACF 图,验证了 SARIMA 模型残差的白噪声性质。如果残差没有显著的自相关性,说明模型已经有效捕捉了时间序列中的季节性和趋势成分。
2. Ljung-Box 检验
  • Ljung-Box 检验结果表明残差无显著的自相关性,进一步证明模型残差是白噪声。通过这种统计检验,可以确认模型的拟合效果。
3. 模型的优化与调整
  • 通过调整 SARIMA 模型的参数 p, d, q, P, D, Q,可以进一步提升模型的拟合效果。新拟合的 SARIMA(2, 1, 2)(1, 1, 1, 12) 模型可能在 AIC/BIC 值和残差表现上优于原模型。

通过这次学习,您掌握了如何对 SARIMA 模型进行诊断与调整,包括残差分析、Ljung-Box 检验、参数调整等过程。这些步骤对于提高 SARIMA 模型的预测精度至关重要,有助于更好地捕捉时间序列数据中的季节性和趋势特征。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值