多变量预测——VAR模型

什么是VAR模型?

想象你和你的朋友每天都会互相影响心情。今天你的心情好坏,不仅受自己昨天心情的影响,还可能被朋友昨天的心情感染。VAR模型(Vector Autoregression,向量自回归)就像这样:它研究多个变量之间的“互相影响”关系,每个变量都依赖于自己和他人过去的“表现”

  • 和AR模型的区别:AR模型(自回归)是单变量的,比如只研究“你”的心情变化。而VAR模型是“多变量”的,同时研究“你”和“朋友”的心情如何互相影响。

VAR模型的数学表示

以两个变量(你和朋友)为例,VAR(1)模型可表示为:

你的今日心情 = a1 * 你昨日心情 + b1 * 朋友昨日心情 + 随机扰动
朋友的今日心情 = a2 * 你昨日心情 + b2 * 朋友昨日心情 + 随机扰动

这里,a1, b1, a2, b2 是模型系数,表示过去值对当前值的影响程度

VAR模型的用途

  1. 预测:比如预测明天的股票价格和交易量。

  2. 分析关系:比如经济中GDP和失业率如何互相影响。

  3. 政策模拟:如果央行调整利率,会对经济产生什么连锁反应?


代码示例(Python)

我们使用statsmodels库实现VAR模型,模拟两个相关的时间序列并预测。

步骤1:生成模拟数据

假设有两个变量y1y2,它们遵循VAR(1)过程:

import numpy as np
import pandas as pd

# 设置参数
np.random.seed(123)
n = 100  # 数据量
A = np.array([[0.5, 0.2], [0.3, 0.4]])  # 系数矩阵
noise = np.random.multivariate_normal(
    [0, 0],           # 均值向量:两个变量的噪声均值都是0
    [[1, 0.5],        # 协方差矩阵:定义噪声之间的关系
     [0.5, 1]], 
    size=n            # 生成n个样本(对应n个时间点的噪声)
)
# 生成数据
data = np.zeros((n, 2))
for t in range(1, n):
    data[t] = A @ data[t-1] + noise[t]  # VAR(1)过程

# 转换为DataFrame,索引为时间(方便后续处理)
dates = pd.date_range(start="2000-01-01", periods=n, freq="ME")
df = pd.DataFrame(data, index=dates, columns=["y1", "y2"])
步骤2:拟合VAR模型
from statsmodels.tsa.api import VAR

# 创建VAR模型对象
model = VAR(df)

# 选择最优滞后阶数(AIC准则)
lag_results = model.select_order(maxlags=5)
best_lag = lag_results.aic  # 假设选择AIC最小的阶数
print(f"最优滞后阶数:{best_lag}")

# 拟合模型
results = model.fit(maxlags=best_lag, ic='aic')  # 使用选择的阶数
print(results.summary())  # 查看模型系数
步骤3:预测未来值
# 预测未来3个时间点
forecast_steps = 3
forecast = results.forecast(df.values[-best_lag:], forecast_steps)

# 将预测结果转为DataFrame
forecast_dates = pd.date_range(df.index[-1], periods=forecast_steps+1, freq="M")[1:]
df_forecast = pd.DataFrame(forecast, index=forecast_dates, columns=["y1_pred", "y2_pred"])
步骤4:可视化结果
import matplotlib.pyplot as plt

# 绘制实际值和预测值
plt.figure(figsize=(10, 6))
plt.plot(df.index, df["y1"], label="y1实际")
plt.plot(df.index, df["y2"], label="y2实际")
plt.plot(df_forecast.index, df_forecast["y1_pred"], 'ro--', label="y1预测")
plt.plot(df_forecast.index, df_forecast["y2_pred"], 'go--', label="y2预测")
plt.legend()
plt.title("VAR模型预测结果")
plt.show()

代码解释

  1. 生成数据:用A矩阵定义变量间的滞后影响,生成带噪声的平稳数据。

  2. 选择滞后阶数:通过AIC准则自动选择最优滞后,避免过拟合。

  3. 拟合模型:用历史数据估计系数,results.summary()可查看系数显著性。

  4. 预测:用最近的历史数据预测未来,结果与实际值对比可视化。

最优滞后阶数:1

Summary of Regression Results

==================================

Model: VAR

Method: OLS

Date: Sun, 23, Feb, 2025

Time: 20:11:27


No. of Equations: 2.00000 BIC: 0.0527326

Nobs: 99.0000 HQIC: -0.0409117

Log likelihood: -269.775 FPE: 0.900766

AIC: -0.104547 Det(Omega_mle): 0.848559


Results for equation y1

========================================================================

coefficient std. error t-stat prob


const -0.085879 0.118690 -0.724 0.469

L1.y1 0.493864 0.100158 4.931 0.000

L1.y2 0.143946 0.123884 1.162 0.245

========================================================================

Results for equation y2

========================================================================

coefficient std. error t-stat prob


const -0.315509 0.105039 -3.004 0.003

L1.y1 0.241042 0.088639 2.719 0.007

L1.y2 0.183399 0.109636 1.673 0.094

========================================================================

Correlation matrix of residuals

y1 y2

y1 1.000000 0.405622

y2 0.405622 1.000000

可以把结果放到deepseek帮你解释一下


要点总结

  • VAR模型:适合多变量时间序列,捕捉变量间的动态影响。

  • 关键步骤:数据平稳性、滞后阶数选择、模型检验。

  • 应用场景:经济预测、政策分析、金融市场联动分析等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值