脉冲响应与模拟:IRF、历史分解、方差分解与条件预测
求解完模型,最终要把它"讲成故事"。本页讲 IRF 的经济学解读(技术/货币/需求/金融四类冲击)、历史分解、方差分解、反事实模拟、条件预测,Dynare 的 oo_ 结构体输出,MATLAB 绘图代码,以及如何在论文里规范呈现 IRF 图。
本页是 DSGE 基础知识库页面。定位:先单独学会这个工具,再到模型分支里看它怎么用。IRF 与模拟是求解结果的"读图"环节——学会 IRF 解读、方差分解、历史分解后,再去各分支看具体模型对各类冲击的响应形状。
在哪些模型分支中使用:所有模型分支的收尾"看图说话"都靠它—— RBC 基准模型 · NK 三方程 · 中尺度 SW · 小国开放经济 · 金融摩擦 BGG/GK · 财政与货币规则 · TANK两主体 · HANK · 适应性学习
01 IRF 的定义与经济学解读
脉冲响应函数(Impulse Response Function, IRF)描述一个外生结构冲击 $\varepsilon_t$ 发生后,内生变量 $\hat x_{t+s}$ 在随后各期如何偏离稳态。定义为政策函数对冲击的导数:
横轴是期数(季度),纵轴是"偏离稳态的百分比"(或百分点,对利率/通胀)。IRF 是 DSGE 论文的"主角图"——它把抽象的方程组翻译成"这个冲击让产出、通胀、利率怎么动、动多少、持续多久"。读图三要素:方向(正/负)、量级(百分之几)、持续性(多久回到稳态)。
02 四类冲击的 IRF 分析
| 冲击 | 传导机制 | 产出 | 通胀 | 政策利率 |
|---|---|---|---|---|
| 技术冲击 $\varepsilon^a$ | 供给侧:生产率↑→边际成本↓ | ↑(持续) | ↓(反周期) | ↓ |
| 货币政策冲击 $\varepsilon^m$ | 需求侧:利率↑→投资↓→产出↓→通胀↓ | ↓( hump-shaped 驼峰) | ↓ | ↑ |
| 需求冲击 $\varepsilon^d$ | 需求侧:总需求↑→产出↑→通胀↑ | ↑ | ↑(同向) | ↑ |
| 金融冲击 $\varepsilon^{fk}$ | 净值↓→溢价↑→投资↓ | ↓(放大、持久) | ↓ | ↓(央行宽松) |
技术冲击让产出与通胀反向(产出↑、通胀↓);需求/货币冲击让它们同向。如果你估计出的技术冲击 IRF 让通胀与产出同向,多半是模型设定或识别错了。这是 DSGE 审稿人最常挑的点。
03 历史分解与方差分解
历史分解(historical decomposition)
把每个历史时点 $\hat x_t$ 的实际偏离分解成各结构冲击贡献的和:
用途:回答"2008 年衰退到底是技术、货币还是金融冲击造成的?"。Dynare 命令 histval_file + 估计后自动输出 oo_.historical_decomposition。历史分解图通常画成堆叠面积图(stacked area chart):横轴时间,纵轴产出偏离,每种颜色代表一个冲击的累计贡献,不同颜色堆叠的总和应恰好等于实际产出偏离线;某段时期某颜色"变厚",就说明该冲击在主导那段波动。
方差分解(variance decomposition)
回答"产出波动里多少比例来自技术冲击、多少来自金融冲击"。Dynare 估计后输出 oo_.variance_decomposition 表格。注意它是条件方差分解:问的是预测方差在不同期界上的归因——短视野(1 季度)常由金融/货币冲击主导,长视野(20 季度以上)逐渐由技术等持续冲击主导。论文里通常同时报告 4 季度与 20 季度两个期界,以展示冲击传导的时变结构。
方差分解("哪个冲击解释最多波动")+ 历史分解("某次衰退谁主导演")+ IRF("这个冲击怎么传导")三件套,是 DSGE 实证章节的标准配置。
04 反事实模拟与条件预测
反事实模拟(counterfactual simulation)
固定其他冲击,只关掉某一个冲击,重跑模拟,看时间序列会怎样。例:"如果 2008 没有金融冲击,产出会跌这么多吗?"。Dynare 用 simul 或 conditional_forecast 实现。
条件预测(conditional forecast)
给定未来若干期的某些变量路径(如"假设通胀未来 4 期锁定在 2%"),让模型内生预测其余变量。常用于央行预测:conditional_forecast_paths; + conditional_forecast;。
05 Dynare 的 oo_ 结构体输出
求解/估计后,所有结果都在全局结构体 oo_ 里。论文绘图全靠这些字段:
| 字段 | 内容 | 用途 |
|---|---|---|
oo_.irf | IRF 矩阵(变量×冲击×期数) | 画 IRF 图 |
oo_.dr.ghx/ghu | 政策函数系数 | 手算 IRF |
oo_.var | 二阶矩(方差、自相关、相关) | 矩匹配 |
oo_.historical_decomposition | 历史分解 | 衰退归因 |
oo_.variance_decomposition | 方差分解 | 冲击贡献占比 |
oo_.PosteriorTheoreticalMoments | 后验分布统计量 | 贝叶斯估计 |
06 MATLAB 绘图代码
Dynare 自动生成的 IRF 图往往不够论文级。下面是一段可直接运行的 MATLAB 代码,把技术冲击对产出、通胀、利率的 IRF 画成论文质量图,带阴影置信带(贝叶斯估计后用)。
% ======================================================================
% plot_irf.m 从 Dynare oo_.irf 画论文级 IRF 图
% 前提: 已运行 dynare nk_baseline.mod, 工作区有 oo_, M_
% ======================================================================
clear; clc; close all;
% --- 1) 取出 IRF: 假设冲击为 ea(技术), 变量为 y, pi, r ---
% Dynare 把 IRF 存在 oo_.irf 下, 字段名 = 变量名_冲击名
horizon = 1:40; % 横轴: 40 期
y_irf = oo_.irf.yea; % 技术冲击 ea 对 y 的 IRF
pi_irf = oo_.irf.piea; % 技术冲击 ea 对 pi 的 IRF
r_irf = oo_.irf.rea; % 技术冲击 ea 对 r 的 IRF
% --- 2) 贝叶斯后验: 取 16/50/84 分位数画置信带 ---
% 若用估计命令, 后验 IRF 存在 oo_.PosteriorIRF.metropolis.HPDinf / HPDsup
try
y_lo = oo_.PosteriorIRF.metropolis.HPDinf.yea;
y_hi = oo_.PosteriorIRF.metropolis.HPDsup.yea;
catch
y_lo = y_irf*0.8; y_hi = y_irf*1.2; % 校准模型无置信带, 用 ±20% 示意
end
% --- 3) 画三行一列子图 ---
figure('Position',[100 100 700 750]);
subplot(3,1,1);
fill([horizon fliplr(horizon)], [y_lo fliplr(y_hi)], ...
[0.85 0.9 0.95],'EdgeColor','none'); hold on;
plot(horizon, y_irf, 'b-','LineWidth',1.8);
yline(0,'k:'); title('Output \hat{y}_t');
ylabel('% dev. from SS'); grid on;
subplot(3,1,2);
plot(horizon, pi_irf, 'r-','LineWidth',1.8);
yline(0,'k:'); title('Inflation \hat{\pi}_t');
ylabel('annualized pp'); grid on;
subplot(3,1,3);
plot(horizon, r_irf, 'g-','LineWidth',1.8);
yline(0,'k:'); title('Nominal Rate \hat{r}_t');
xlabel('Quarters after shock'); ylabel('annualized pp'); grid on;
% --- 4) 导出为论文用 PDF/PNG ---
exportgraphics(gcf,'irf_tech_shock.pdf','ContentType','vector');
exportgraphics(gcf,'irf_tech_shock.png','Resolution',300);
disp('IRF 图已导出 irf_tech_shock.pdf / .png');
% ======================================================================
% 进阶: 把两个模型(无摩擦 vs BGG)叠在一张图对比
% plot(horizon, y_irf_noFric,'b-', horizon, y_irf_BGG,'r--','LineWidth',1.6);
% legend('No friction','BGG accelerator','Location','best');
% ======================================================================
07 如何在论文中呈现 IRF 图
08 经典论文、常见错误与进阶
① 纵轴不标单位,读者不知是%还是百分点;② 冲击大小不统一,跨图误导;③ 技术冲击 IRF 让产出通胀同向(识别错);④ 把校准模型的 IRF 当后验带画;⑤ 历史分解不归一到 100%。
① Dynare manual "IRF and simulation" 章;② 用 Dynare 的 var_decomp、histoy_decomp 自动化分解表;③ 至此 DSGE 九大站点全部完成,回到 DSGE 总览 复习路线。