什么是VAR模型?
想象你和你的朋友每天都会互相影响心情。今天你的心情好坏,不仅受自己昨天心情的影响,还可能被朋友昨天的心情感染。VAR模型(Vector Autoregression,向量自回归)就像这样:它研究多个变量之间的“互相影响”关系,每个变量都依赖于自己和他人过去的“表现”。
-
和AR模型的区别:AR模型(自回归)是单变量的,比如只研究“你”的心情变化。而VAR模型是“多变量”的,同时研究“你”和“朋友”的心情如何互相影响。
VAR模型的数学表示
以两个变量(你和朋友)为例,VAR(1)模型可表示为:
你的今日心情 = a1 * 你昨日心情 + b1 * 朋友昨日心情 + 随机扰动
朋友的今日心情 = a2 * 你昨日心情 + b2 * 朋友昨日心情 + 随机扰动
这里,a1, b1, a2, b2
是模型系数,表示过去值对当前值的影响程度。
VAR模型的用途
-
预测:比如预测明天的股票价格和交易量。
-
分析关系:比如经济中GDP和失业率如何互相影响。
-
政策模拟:如果央行调整利率,会对经济产生什么连锁反应?
代码示例(Python)
我们使用statsmodels
库实现VAR模型,模拟两个相关的时间序列并预测。
步骤1:生成模拟数据
假设有两个变量y1
和y2
,它们遵循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()
代码解释
生成数据:用
A
矩阵定义变量间的滞后影响,生成带噪声的平稳数据。选择滞后阶数:通过AIC准则自动选择最优滞后,避免过拟合。
拟合模型:用历史数据估计系数,
results.summary()
可查看系数显著性。预测:用最近的历史数据预测未来,结果与实际值对比可视化。
最优滞后阶数: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模型:适合多变量时间序列,捕捉变量间的动态影响。
-
关键步骤:数据平稳性、滞后阶数选择、模型检验。
-
应用场景:经济预测、政策分析、金融市场联动分析等。