Dynare 求解实操:从 .mod 文件到政策函数与 IRF
Dynare 是 DSGE 求解与估计的事实标准。本页讲 .mod 文件的标准结构(var / varexo / parameters / model / steady / check / stoch_simul),给出一个完整可运行的标准 NK 模型 .mod 文件,详解 steady / check / stoch_simul 三个核心命令、Blanchard-Kahn 条件、确定性模拟 simul 与随机模拟 stoch_simul 的区别,以及二阶近似 order=2 的用法。
本页是 DSGE 基础知识库页面。定位:先单独学会这个工具,再到模型分支里看它怎么用。Dynare 是 DSGE 的工业级求解平台,.mod 文件结构、steady/check/stoch_simul 流程跑通后,再去各分支里看不同模型如何改写 .mod。
在哪些模型分支中使用:凡用 Dynare 的分支都从这里起步—— RBC 基准模型 · NK 三方程 · 中尺度 SW · 小国开放经济 · 金融摩擦 BGG/GK · 财政与货币规则 · TANK两主体 · HANK
01 Dynare 是什么、安装与配置
Dynare(Dynamic Models)是一个开源平台,用来求解、模拟和估计理性预期动态随机一般均衡模型。你只需用类 MATLAB 的声明式语法把非线性均衡条件写进一个 .mod 文件,Dynare 会自动做稳态求解、稳态处线性化(一阶泰勒展开)、Blanchard-Kahn 求解、并输出政策函数与脉冲响应。它本质上是一组 MATLAB/Octave 的 .m 函数集合。
addpath('C:\dynare\5.x\matlab') 并保存 pathdef。dynare nk_model.mod。Dynare 会生成 oo_、M_、options_ 三个全局结构体。oo_:求解结果(政策函数、IRF、矩);M_:模型元信息(变量名、参数、方程数);options_:求解选项。第 09 站绘图全靠 oo_.irf、oo_.dr。
02 .mod 文件的标准结构
一个可求解的 .mod 文件按固定顺序分七块。理解每一块"声明什么"是读通任何 Dynare 模型的前提:
| 块 / 命令 | 作用 | 类比 |
|---|---|---|
var | 声明所有内生变量(endogenous) | 系统的未知量 |
varexo | 声明所有外生结构冲击(exogenous) | 扰动项 $\varepsilon_t$ |
parameters | 声明所有参数名,并在下面赋值 | $\beta,\sigma,\kappa,\phi_\pi$ |
model; | 写非线性均衡方程(用 (1) 表示 $E_t$ 前瞻,(-1) 表示滞后) | 第 03 站一阶条件 |
initval; / steady | 给初始猜测、求解稳态 | 第 04 站稳态 |
check; | 在稳态求数值导数,检查 BK 条件 | 诊断工具 |
stoch_simul; | 求解 + 模拟 + 画 IRF | 主求解器 |
关键语法:x(1) 表示 $x_{t+1}$(在 t 期看的预期值),x(-1) 表示 $x_{t-1}$,x 表示 $x_t$。方程号不是等式,只是文本注释;每行用分号结束。
03 完整可运行的标准 NK 模型 .mod 文件
下面是一个可直接保存为 nk_baseline.mod 并运行的最简新凯恩斯模型:家庭 Euler + NKPC + Taylor 规则 + 资源约束 + 技术/货币政策两个 AR(1) 冲击。超过 60 行,含完整中文注释。
% ======================================================================
% nk_baseline.mod 标准新凯恩斯三方程模型(含技术与货币政策冲击)
% 运行:在 MATLAB 命令窗口输入 dynare nk_baseline.mod
% ======================================================================
% ---------- 1. 声明内生变量(变量名全小写,与上一节 hat 变量对应)----------
var y c pi r mc a;
% y 产出(对数偏离) c 消费(对数偏离)
% pi 通胀率(对数偏离) r 名义利率(对数偏离, 总回报)
% mc 实际边际成本 a 技术冲击(对数偏离)
% ---------- 2. 声明外生结构冲击 ----------
varexo ea em;
% ea 技术冲击 innovation em 货币政策冲击 innovation
% ---------- 3. 声明参数并校准 ----------
parameters beta sigma kappa phi_pi phi_y rho_r rho_a sigma_a sigma_m;
beta = 0.99; % 主观贴现因子
sigma = 1.0; % CRRA 风险厌恶系数(=1 即对数效用)
kappa = 0.125; % NKPC 斜率(Calvo 概率 theta=0.75 标定)
phi_pi = 1.5; % Taylor 规则对通胀的反应(>1 满足 Taylor 原则)
phi_y = 0.5/4; % Taylor 规则对产出的反应
rho_r = 0.8; % 利率平滑系数
rho_a = 0.9; % 技术冲击 AR(1) 系数
sigma_a = 0.01; % 技术冲击标准差
sigma_m = 0.0025; % 货币政策冲击标准差
% ---------- 4. 模型方程块(非线性/简化线性混合写法,便于教学)----------
model;
% (1) 家庭 Euler 方程: c = E_t c(+1) - (1/sigma) * (r - E_t pi(+1))
c = c(1) - (1/sigma)*(r - pi(1));
% (2) 新凯恩斯菲利普斯曲线: pi = beta*E_t pi(+1) + kappa*mc
pi = beta*pi(1) + kappa*mc;
% (3) 资源约束(无资本) y = c;边际成本 mc = (sigma+phi)*y (劳动供给简化)
y = c;
mc = (sigma + 1.0)*y;
% (4) Taylor 规则(含利率平滑与货币政策冲击 em)
r = rho_r*r(-1) + (1-rho_r)*(phi_pi*pi + phi_y*y) + em;
% (5) 技术冲击 AR(1): a = rho_a*a(-1) + ea
a = rho_a*a(-1) + ea;
end;
% ---------- 5. 初始值(全部在稳态附近,这里就是 0 偏离)----------
initval;
y = 0; c = 0; pi = 0; r = 0; mc = 0; a = 0;
end;
% ---------- 6. 求解稳态(本模型稳态就是 0 偏离)----------
steady;
% ---------- 7. 数值导数并检查 Blanchard-Kahn 条件 ----------
check;
% ---------- 8. 随机模拟:一阶近似、200 期 IRF、无图形保存 ----------
stoch_simul(order=1, irf=40, nograph, nodisp);
% ======================================================================
% 运行后在 MATLAB 工作区可见:
% oo_.irf.ya -> 技术冲击 ea 对 y 的 40 期脉冲响应
% oo_.dr.ghx -> 政策函数对状态变量的一阶导数(政策函数系数)
% M_.param_names -> 全部参数名
% ======================================================================
控制台应打印:EIGENVALUES: ... There are 0 eigenvalues bigger than 1. The model solves for bkwd-looking variables... 与 Blanchard Kahn conditions are satisfied: no indeterminacy。看到这句,求解就成功了。
04 steady / check / stoch_simul 三个核心命令详解
steady
steady; 在 initval 给出的猜测附近求解非线性稳态。它把 model 块里所有前瞻/滞后都设为同期($x(1)=x=x(-1)$)、外生冲击设为 0,用稳态求解器(默认稳态文件或自写 steady_state_model)迭代出稳态。这是整个求解的锚点——线性化就在这点展开。
check
check; 在稳态处对 model 块做数值微分(numerical differentiation),把非线性方程线性化成 $A E_t X_{t+1}+B X_t+C X_{t-1}+D\varepsilon_t=0$,并检查 Blanchard-Kahn 条件。它会打印前瞻/滞后变量个数与特征根,是你 debug 模型"为什么解不出来"的第一站。
stoch_simul
stoch_simul; 是主求解器。它先调用 steady、check,再求解理性预期模型(默认用 Anderson-Moore / Blanchard-Kahn-Klein),最后:(1) 计算政策函数 $X_t=A X_{t-1}+B\varepsilon_t$;(2) 画 IRF;(3) 计算二阶矩(方差、自相关、相关系数)。常用选项:irf=40 设置 IRF 期数、order=2 二阶近似、noprint、nograph。
05 Blanchard-Kahn 条件
理性预期模型要有唯一稳定解,必须满足 Blanchard-Kahn (BK) 条件:把系统写成一阶矩阵形式 $E_t Z_{t+1} = A Z_t + B\varepsilon_t$,设 $A$ 有 $n$ 个特征根。BK 要求:大于 1 的特征根个数严格等于前瞻变量(jump variables)个数。
- 条件满足(determinacy):唯一稳定理性预期解。Dynare 打印 "no indeterminacy"。
- 不稳定根太多(too few stable roots):无解,模型"爆炸",常见于 $\phi_\pi$ 太小或 $\phi_\pi<1$。
- 不稳定根太少(indeterminacy / sunspot):多重解,常出现在 Taylor 原则被违反($\phi_\pi<1$)时。
NK 模型里 $\phi_\pi>1$ 之所以关键,正是因为它保证前瞻变量的个数与不稳定特征根个数匹配。把 phi_pi=0.5 跑一下,你会看到 Dynare 报 "indeterminacy"——这就是 BK 条件的直观体验。
06 确定性模拟 simul vs 随机模拟 stoch_simul
| 命令 | 冲击设定 | 用途 | 典型选项 |
|---|---|---|---|
simul; | 给定一条确定性的冲击路径(如一次性 1% 技术冲击) | 确定性 IRF、政策反事实 | 用 shocks; 或 histval 指定 |
stoch_simul; | 随机 draw 外生冲击,求期望意义下的政策函数与矩 | 随机模型 IRF、二阶矩、估计 | order=1/2, irf= |
教学与论文里 99% 用 stoch_simul。simul 主要用于非线性、确定性转移动态(transition path)或研究零利率下限。本页 .mod 用的就是 stoch_simul。
07 二阶近似 order=2
一阶近似(order=1)是确定性等价的——不确定性不影响决策,看不到风险溢价。要研究预防性储蓄、偏态、风险对稳态的修正(pruning),就把命令改成 stoch_simul(order=2);。
% 在 .mod 末尾把 stoch_simul 换成:
stoch_simul(order=2, irf=40, pruning, nograph);
% order=2 : 稳态处做二阶泰勒展开,捕获不确定性效应
% pruning : 防止高阶项导致模拟发散(推荐)
% 二阶下 oo_.mean 不再等于 0,出现"风险调整后的稳态"
% 适合:零利率下限、稀有灾难、福利成本二阶项研究
当你的论文议题涉及 (1) 风险溢价 / 资产定价;(2) 稳态被不确定性修正;(3) 二阶矩福利损失(Lucas 福利成本的二阶项);(4) 强非线性事件(ZLB、大幅衰退)。否则 order=1 足够。
08 经典论文与参考文献
09 常见错误与进阶资料
c(1) 是"t 期看 t+1",不是 c 在 t+1 期的值本身。在 model 块里写 c(1) 表示 $E_t c_{t+1}$。写错方向会让 NKPC 变成向后看,IRF 完全反号。
steady 没成功(控制台报 "Impossible to find steady state")时强行 stoch_simul,会得到垃圾 IRF。先确保 steady 收敛、残差接近 0。
变量数 ≠ 方程数时 Dynare 报 "The endogenous variables list does not match equation number"。检查 var 块与 model 块一一对应。
① Dynare 官方 Reference Manual 第 4 章 "The model file";② Villemot (2011) "Analyzing the Blanchard-Kahn conditions";③ 下一步 第 07 站:贝叶斯估计,把参数从"校准"升级为"数据估计"。