跳到主要内容

VAR(向量自回归模型)

一、直观理解:多个序列互相用对方的过去解释​

单变量 AR 只问“自己的过去”。VAR(Vector Autoregression)把 KK 个变量放进同一个系统:每个变量都对所有变量的滞后回归。

yt=c+A1yt−1+⋯+Apyt−p+εt\mathbf{y}_t=\mathbf{c}+A_1\mathbf{y}_{t-1}+\cdots+A_p\mathbf{y}_{t-p}+\boldsymbol{\varepsilon}_t

其中 yt\mathbf{y}_t 是 K×1K\times 1 向量。例如:GDP、投资、消费;或温度、用电负荷、电价。VAR 适合回答:

  • 联合短期预测;
  • 一个冲击如何传导到其他变量(脉冲响应);
  • 变量间是否有预测能力(Granger 因果,注意不是哲学因果)。

二、适用场景与优缺点​

类型说明
适用场景多个内生序列互相影响;样本长度明显大于 KpKp;需要系统预测或冲击分析;变量大致同阶单整或已平稳。
核心优点不先验区分内生/外生(都当内生);预测与动态分析一体;MATLAB varm 工具完善。
局限与缺点参数个数 K(1+Kp)K(1+Kp) 膨胀快;短样本不稳定;水平 VAR 遇单位根需小心;结构解释依赖识别假设;季节与异方差需额外处理。

经验:月度数据 K=3K=3 时 p=2∼4p=2\sim 4 已可能吃紧,优先信息准则与稀疏性。

三、核心原理​

1. 参数规模​

每个方程有 1+Kp1+Kp 个系数(含常数),共 KK 个方程。K=5,p=4K=5,p=4 时已约百参数量级,没有足够 TT 时方差巨大。

2. 平稳 VAR​

特征多项式根应在单位圆外。非平稳时常见策略:

  • 差分后建 VAR;
  • 若存在协整,用 VECM(向量误差修正);
  • 水平 VAR 仅在有充分理论/稳健性支持时使用,并做稳健性检查。

3. 脉冲响应与方差分解​

正交脉冲响应对 ε\boldsymbol{\varepsilon} 的协方差做 Cholesky 分解,结果依赖变量顺序。报告时必须说明排序依据(外生性从强到弱等),并做顺序敏感性分析。

4. Granger 因果​

若 yjy_j 的滞后在 yiy_i 方程中联合显著,则称 yjy_j Granger 引起 yiy_i。这只说明预测帮助,不是干预因果。

四、建模步骤​

  1. 统一频率、处理缺失,画多序列图;
  2. 单序列平稳性检验,决定水平/差分/VECM;
  3. 选 pp:LR/AIC/BIC/HQ,结合残差白噪声;
  4. varm + estimate;
  5. 残差:自相关、跨相关、稳定性;
  6. 训练期外:多步联合预测的 RMSE(可对每个变量报告);
  7. 需要时:armairf 脉冲响应、FEVD、Granger 检验。

五、MATLAB 示例​

%% 模拟二元 VAR(1) 并估计、预测
rng(17);
A1 = [0.5 0.2; -0.1 0.4];
c = [0.1; 0.2];
Sigma = [1 0.3; 0.3 1];
T = 400; K = 2;
Y = zeros(T,K);
for t = 2:T
Y(t,:) = (c + A1*Y(t-1,:)' + mvnrnd([0 0],Sigma)')';
end

T0 = 340;
Ytr = Y(1:T0,:); Yte = Y(T0+1:end,:);

% 选阶
maxP = 6;
aic = nan(maxP,1);
for p = 1:maxP
md = varm(K,p);
est = estimate(md, Ytr);
% 信息准则
results = summarize(est);
% 用 logL 手工算更透明
[~,~,~,logL] = infer(est, Ytr); %#ok<*ASGLU>
numParam = K + K*K*p + K*(K+1)/2; % 粗计:常数+A+协方差
aic(p) = -2*logL + 2*numParam;
end
[~,pBest] = min(aic);
fprintf("AIC 选择 p=%d\n", pBest);

md = varm(K,pBest);
est = estimate(md, Ytr);
summarize(est);

% 稳定性
st = est.AR;
% 可用 eig 检查伴随矩阵根(略)

% 训练期外预测
h = size(Yte,1);
Yf = forecast(est, h, Ytr);
rmse = sqrt(mean((Yte - Yf).^2, 1));
fprintf("各变量测试 RMSE:"); disp(rmse);

% 对比:各变量独立 AR(p)
rmseAR = zeros(1,K);
for j = 1:K
aj = estimate(arima(pBest,0,0), Ytr(:,j), "Display","off");
yj = forecast(aj, h, "Y0", Ytr(:,j));
rmseAR(j) = sqrt(mean((Yte(:,j)-yj).^2));
end
fprintf("独立 AR RMSE:"); disp(rmseAR);

% 脉冲响应(Cholesky,顺序 1->2)
figure;
armairf(est.AR, {}, "InnovCov", est.Covariance, "NumObs", 20);
title("正交脉冲响应(注意变量顺序)");

figure;
plot(T0+1:T0+h, Yte(:,1),"k"); hold on;
plot(T0+1:T0+h, Yf(:,1),"r","LineWidth",1.2);
legend("真实 y1","VAR 预测"); title("变量1 训练期外预测");

若序列非平稳,先差分:

dYtr = diff(Ytr);
estD = estimate(varm(K,pBest), dYtr);
% 预测差分后再积分还原到水平

六、如何解释结果​

报告建议:

  1. 变量选择与预处理(对数、差分);
  2. 滞后 pp 的准则表;
  3. 关键系数矩阵(可只解释显著且符合机理的项);
  4. 残差相关与稳定性;
  5. 各变量测试 RMSE,对比独立 AR/单变量 ARIMA;
  6. 脉冲响应图 + 变量排序理由 + 敏感性;
  7. Granger 检验表(若题目关心“能否预测”);
  8. 明确限制:短样本、遗漏变量、结构性断裂。

七、常见误区​

1. KK 和 pp 同时偏大​

参数爆炸,样本外很差。优先少变量、小 pp。

2. 把 Granger 因果写成政策因果​

只能说预测意义,不能说“提高 A 必然导致 B”。

3. 忽略变量顺序对 IRF 的影响​

Cholesky 识别不是唯一真理。

4. 非平稳水平 VAR 直接下结论​

至少做差分 VAR 或协整/VECM 稳健性。

5. 只报告系统内拟合优度​

必须训练期外联合预测评价。

八、小结​

VAR 的核心是:

让每个变量对整个系统的滞后做回归,从而进行联合预测与动态传导分析。

它适合真正的多变量互动问题,但参数纪律很重要。规范做法是:平稳化处理 → 谨慎选 pp → 残差与稳定性诊断 → 训练期外对比单变量基线 → 谨慎解释脉冲响应与 Granger 结果。不要只看 R2R^2,系统模型更容易在样本内“显得很强”。