本文主要是介绍用Python实现时间序列模型实战——Day 14: 向量自回归模型 (VAR) 与向量误差修正模型 (VECM),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、学习内容
1. 向量自回归模型 (VAR) 的基本概念与应用
向量自回归模型 (VAR) 是多元时间序列分析中的一种模型,用于捕捉多个变量之间的相互依赖关系。与单变量自回归模型不同,VAR 模型将多个时间序列作为向量输入,同时对这些变量进行回归分析。
VAR 模型的一般形式为:
其中:
- 是时间 的变量向量。
- 是常数向量。
- 是每个时间滞后的回归系数矩阵。
- 是误差项向量,假设其均值为 0,方差为常量。
2. 向量误差修正模型 (VECM) 的理论基础与应用
向量误差修正模型 (VECM) 是 VAR 模型的扩展,适用于具有协整关系的非平稳时间序列。VECM 通过捕捉长期均衡关系,建立短期动态调整模型。
VECM 的数学表达式为:
其中:
- 是差分后的变量向量。
- 是协整矩阵,表示长期均衡关系。
- 是短期调整系数矩阵。
- 是误差项向量。
3. 多元时间序列分析
VAR 和 VECM 模型适用于多变量时间序列分析,通常用于经济、金融等领域。例如,多个宏观经济变量(如 GDP、通货膨胀率、利率)的相互影响可以通过 VAR 或 VECM 模型进行分析和预测。
二、实战案例
我们将使用 Python 的 statsmodels
库对实际的多元时间序列数据进行 VAR 和 VECM 模型的建模和预测。
(一)使用 VAR 模型的案例
假设我们有一组包含多个宏观经济指标的时间序列数据,如利率、GDP 和通货膨胀率。我们将构建一个 VAR 模型来分析这些变量之间的相互影响。
1. 数据生成与可视化
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.api import VAR# 生成模拟的多变量时间序列数据
np.random.seed(42)
n_obs = 100
dates = pd.date_range(start='2000-01-01', periods=n_obs, freq='Q')
data = pd.DataFrame(np.random.randn(n_obs, 3), columns=['GDP', 'Inflation', 'Interest Rate'], index=dates)# 绘制时间序列
data.plot(subplots=True, figsize=(10, 8), title="Simulated Time Series Data")
plt.show()
代码解释:
- 我们生成了三个变量的随机时间序列数据,分别表示 GDP、通货膨胀率和利率,并绘制其随时间的变化。
结果输出:
2. 构建 VAR 模型
# 构建 VAR 模型
model = VAR(data)
代码解释:
- 使用
VAR
模型拟合数据,自动选择最优的滞后阶数。
3. 模型拟合与预测
# 手动设置滞后阶数为 2(或根据需要调整)
lag_order = 2
var_model_fitted = model.fit(lag_order)# 预测未来10个时间点的数据
forecast = var_model_fitted.forecast(data.values[-lag_order:], steps=10)
代码解释:
- 根据最优的滞后阶数拟合模型,并进行未来 10 个时间点的预测。
4. 预测结果可视化
# 创建一个 DataFrame 来存储预测结果
forecast_df = pd.DataFrame(forecast, index=pd.date_range(start=dates[-1], periods=10, freq='Q'), columns=data.columns)# 绘制预测结果
fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(10, 8))
for i, col in enumerate(data.columns):axes[i].plot(data.index, data[col], label='Original')axes[i].plot(forecast_df.index, forecast_df[col], label='Forecast', linestyle='--')axes[i].set_title(col)axes[i].legend()
plt.tight_layout()
plt.show()
代码解释:
- 绘制每个变量的历史数据和预测数据,展示 VAR 模型的预测能力。
结果输出:
5. 运行结果分析
- 滞后阶数选择:程序自动选择最优滞后阶数,以确保模型的拟合效果。
- 预测结果:预测的时间序列数据显示了每个变量在未来一段时间内的变化趋势。
(二)使用 VECM 模型的案例
VECM 模型适用于存在协整关系的非平稳时间序列。以下代码展示了如何使用 coint_johansen
函数来检查协整关系,并拟合 VECM 模型。
1. 协整关系检验
from statsmodels.tsa.vector_ar.vecm import VECM# 检查协整关系(Johansen检验)
coint_test = coint_johansen(data, det_order=0, k_ar_diff=1)
print("Eigenvalues:", coint_test.eig)
代码解释:
- 使用 Johansen 协整检验来确定是否存在协整关系,协整关系表明多个时间序列变量在长期内存在稳定的均衡关系。
结果输出:
Eigenvalues: [0.40232704 0.32765159 0.24829596]
2. 构建 VECM 模型
# 构建 VECM 模型
vecm_model = VECM(data, k_ar_diff=1, coint_rank=1)
vecm_fitted = vecm_model.fit()# 输出 VECM 模型结果
print(vecm_fitted.summary())
代码解释:
- 基于协整关系构建 VECM 模型,拟合数据并进行预测。
结果输出:
Det. terms outside the coint. relation & lagged endog. parameters for equation GDP
====================================================================================coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------------
L1.GDP -0.4603 0.087 -5.270 0.000 -0.631 -0.289
L1.Inflation -0.1867 0.092 -2.040 0.041 -0.366 -0.007
L1.Interest Rate 0.0436 0.066 0.662 0.508 -0.085 0.173
Det. terms outside the coint. relation & lagged endog. parameters for equation Inflation
====================================================================================coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------------
L1.GDP -0.1693 0.093 -1.824 0.068 -0.351 0.013
L1.Inflation -0.0301 0.097 -0.309 0.757 -0.221 0.161
L1.Interest Rate -0.1179 0.070 -1.686 0.092 -0.255 0.019
Det. terms outside the coint. relation & lagged endog. parameters for equation Interest Rate
====================================================================================coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------------
L1.GDP 0.0756 0.113 0.670 0.503 -0.145 0.297
L1.Inflation -0.2562 0.118 -2.168 0.030 -0.488 -0.025
L1.Interest Rate -0.5461 0.085 -6.426 0.000 -0.713 -0.380Loading coefficients (alpha) for equation GDP
==============================================================================coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
ec1 -0.1366 0.052 -2.626 0.009 -0.239 -0.035Loading coefficients (alpha) for equation Inflation
==============================================================================coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
ec1 0.3797 0.055 6.869 0.000 0.271 0.488Loading coefficients (alpha) for equation Interest Rate
==============================================================================coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
ec1 -0.0588 0.067 -0.876 0.381 -0.191 0.073Cointegration relations for loading-coefficients-column 1
==============================================================================coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
beta.1 1.0000 0 0 0.000 1.000 1.000
beta.2 -2.3190 0.354 -6.545 0.000 -3.013 -1.625
beta.3 0.4073 0.313 1.300 0.193 -0.207 1.021
==============================================================================
3. VECM 模型预测与可视化
# 进行未来的预测
vecm_forecast = vecm_fitted.predict(steps=5)
vecm_forecast_df = pd.DataFrame(vecm_forecast, index=pd.date_range(start=dates[-1], periods=5, freq='Q'), columns=data.columns)# 绘制 VECM 预测结果
fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(10, 8))
for i, col in enumerate(data.columns):axes[i].plot(data.index, data[col], label='Original')axes[i].plot(vecm_forecast_df.index, vecm_forecast_df[col], label='Forecast', linestyle='--')axes[i].set_title(f"VECM Forecast: {col}")axes[i].legend()
plt.tight_layout()
plt.show()
代码解释:
- 对未来 5 个时间点进行预测,并将预测结果与历史数据一起绘制。
结果输出:
4. 运行结果分析
- 协整检验结果:
coint_johansen
函数的结果显示了协整向量的个数(即变量之间的长期关系)。 - VECM 模型的预测:VECM 模型捕捉了长期均衡关系,并预测了未来变量的变化趋势。
三、总结
通过 VAR 和 VECM 模型,可以分析多元时间序列中的相互依赖关系。VAR 模型适合用于平稳时间序列,而 VECM 模型则适用于具有协整关系的非平稳时间序列。
这篇关于用Python实现时间序列模型实战——Day 14: 向量自回归模型 (VAR) 与向量误差修正模型 (VECM)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!