前置条件与学习依赖 / PREREQUISITES
数学 / 统计基础理性预期线性系统、Blanchard-Kahn 鞍点条件、政策函数 $X_t=AX_{t-1}+B\varepsilon_t$ 的状态空间表示。
经济学理论前置一个方程齐全、能写进 .mod 的 NK 模型;IRF 与二阶矩的含义。
软件 / 计算前置MATLAB(R2018b+)+ Dynare ≥4.6,会配置 MATLAB 路径;本页重 .mod 实操。
站内前置页面先学 04-log-linearization(或 15-perturbation-methods),否则读不懂 .mod 里的方程。
难度与路线位置入门→进阶DSGE 工具实操页,贝叶斯估计、IRF、SW 都建立在它之上。
📚 基础知识库 · 本页定位

本页是 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 函数集合。

Step 1 · 安装 MATLAB 或 Octave
Dynare 4.x/5.x 依赖 MATLAB(推荐 R2018b 以上)或 GNU Octave(免费)。Windows/Mac 都有官方一键安装包。
Step 2 · 下载并安装 Dynare
从 dynare.org 下载稳定版(如 5.x),安装后在 MATLAB 里 addpath('C:\dynare\5.x\matlab') 并保存 pathdef。
Step 3 · 把 .mod 放入工作目录并运行
在命令窗口输入 dynare nk_model.mod。Dynare 会生成 oo_、M_、options_ 三个全局结构体。
💡 三个全局结构体

oo_:求解结果(政策函数、IRF、矩);M_:模型元信息(变量名、参数、方程数);options_:求解选项。第 09 站绘图全靠 oo_.irfoo_.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 行,含完整中文注释。

Dynare · nk_baseline.mod(完整可运行)
% ======================================================================
% 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 二阶近似、noprintnograph

05 Blanchard-Kahn 条件

理性预期模型要有唯一稳定解,必须满足 Blanchard-Kahn (BK) 条件:把系统写成一阶矩阵形式 $E_t Z_{t+1} = A Z_t + B\varepsilon_t$,设 $A$ 有 $n$ 个特征根。BK 要求:大于 1 的特征根个数严格等于前瞻变量(jump variables)个数

BK 条件
$$\#\{|\lambda_i|>1\}\;=\;\#\{\text{前瞻变量 } E_t x_{t+1}\}$$
  • 条件满足(determinacy):唯一稳定理性预期解。Dynare 打印 "no indeterminacy"。
  • 不稳定根太多(too few stable roots):无解,模型"爆炸",常见于 $\phi_\pi$ 太小或 $\phi_\pi<1$。
  • 不稳定根太少(indeterminacy / sunspot):多重解,常出现在 Taylor 原则被违反($\phi_\pi<1$)时。
⚠️ Taylor 原则的代数含义

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_simulsimul 主要用于非线性、确定性转移动态(transition path)或研究零利率下限。本页 .mod 用的就是 stoch_simul

07 二阶近似 order=2

一阶近似(order=1)是确定性等价的——不确定性不影响决策,看不到风险溢价。要研究预防性储蓄、偏态、风险对稳态的修正(pruning),就把命令改成 stoch_simul(order=2);

Dynare · 二阶近似与 pruned state space
% 在 .mod 末尾把 stoch_simul 换成:
stoch_simul(order=2, irf=40, pruning, nograph);
% order=2 : 稳态处做二阶泰勒展开,捕获不确定性效应
% pruning : 防止高阶项导致模拟发散(推荐)
% 二阶下 oo_.mean 不再等于 0,出现"风险调整后的稳态"
% 适合:零利率下限、稀有灾难、福利成本二阶项研究
💡 何时升到 order=2

当你的论文议题涉及 (1) 风险溢价 / 资产定价;(2) 稳态被不确定性修正;(3) 二阶矩福利损失(Lucas 福利成本的二阶项);(4) 强非线性事件(ZLB、大幅衰退)。否则 order=1 足够。

08 经典论文与参考文献

English · 标准模型
Smets, F. & Wouters, R. (2007). Shocks and Frictions in US Business Cycles: A Bayesian DSGE Approach
American Economic Review, 97(3) · 中型 NK 模型的金标准
其 .mod 文件是全球 DSGE 学习者的事实模板,结构与本页一致:var/varexo/parameters/model/stoch_simul,7 个结构冲击、10 个 frictions。
English · 求解方法论
Blanchard, O. & Kahn, C. (1980). The Solution of Linear Difference Models under Rational Expectations
Econometrica, 48(5) · BK 条件的原始出处
给出前瞻/滞后混合线性系统存在唯一稳定解的充要条件,即 Dynare check 命令背后的数学。
中文 · 顶刊
刘斌 (2010). 动态随机一般均衡模型理论与政策分析
《经济研究》/ 专著 · 国内 DSGE 求解与 Dynare 应用的系统教材
详细演示如何把一个中国 NK 模型写成 Dynare .mod 文件并求解,含 BK 条件失败的调试案例。
中文 · 顶刊
王晋斌、唐毅南等 · 《经济研究》DSGE 货币政策估计系列
《经济研究》 · 中国开放经济 DSGE 估计
示范了从 .mod 文件到贝叶斯估计的完整流程,是中文期刊里 .mod 写作的范例。

09 常见错误与进阶资料

❌ 错误 1:把 (1) 写成 t+1 的字面意思导致预期错

c(1) 是"t 期看 t+1",不是 c 在 t+1 期的值本身。在 model 块里写 c(1) 表示 $E_t c_{t+1}$。写错方向会让 NKPC 变成向后看,IRF 完全反号。

❌ 错误 2:稳态没收敛就 stoch_simul

steady 没成功(控制台报 "Impossible to find steady state")时强行 stoch_simul,会得到垃圾 IRF。先确保 steady 收敛、残差接近 0。

❌ 错误 3:缺方程或多变量未声明

变量数 ≠ 方程数时 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 站:贝叶斯估计,把参数从"校准"升级为"数据估计"。