前置条件与学习依赖 / PREREQUISITES
数学 / 统计基础贝叶斯推断(先验/似然/后验/边际似然)、线性高斯状态空间与卡尔曼滤波、Metropolis-Hastings MCMC、Gelman-Rubin 收敛诊断。
经济学理论前置一个已推导、已求解的 NK 或 SW 中尺度模型;理解校准、匹配矩与"用数据估计参数"的区别。
软件 / 数据前置Dynare 的 estimation 命令、varobs/estimated_params 块;数据预处理(对数、季节调整、HP 滤波或一阶差分);MCMC 需多核、数小时级计算资源。
站内前置页面先学 05-dynare-solving(求解器)与 11-medium-scale-sw(SW 模型结构),估计是在求解器之上叠加似然与 MCMC。
难度与路线位置进阶→前沿DSGE 实证主力方法,学完可独立完成一篇估计类论文。

01 为什么用贝叶斯估计 DSGE

要理解贝叶斯估计在 DSGE 里的地位,必须先把它与另外两条参数确定路线放在一起比较:校准(calibration)极大似然估计(MLE)。校准由 Kydland-Prescott 开创,做法是凭微观证据、稳态矩和已有文献把参数"拍"成一组常数,再去比较模型矩与数据矩。它的优点是透明、可复现、计算便宜;缺点也很致命——参数没有任何不确定性度量,你不知道某个参数究竟是 0.7 还是 0.9,也无法系统地回答"数据到底支持哪个模型"。一旦审稿人问"这个 beta 为什么取 0.99",校准只能诉诸文献惯例。

极大似然则走到另一个极端:把参数当成未知常数,在整个参数空间里最大化似然 $p(Y\mid\theta)$,取最优点。理论上无懈可击,但 DSGE 的现实是小样本、大模型、弱识别——中尺度 SW 模型有约 20 个结构参数加 7 个冲击标准差,而美国战后季度数据不过 200 多个观测。似然面往往非常平坦、布满局部最优,MLE 极易收敛到一个"技术上最优、经济上荒谬"的角落解;而且点估计丢弃了大量信息,无法直接给出置信区间,更做不了模型比较。

贝叶斯估计恰好弥补了两者的缺陷,它的核心优势可以概括为四点。第一,结合先验信息。研究者在看数据之前,凭微观估计、稳态恒等式和已有文献,对参数已有大量结构化知识(比如主观贴现因子 $\beta$ 必然接近 1,Calvo 重新定价概率 $\theta\in(0.5,0.9)$)。贝叶斯把这些知识编码成先验分布,当作"软约束",再让数据去更新它,而不是像校准那样把参数钉死。第二,处理小样本。当先验把参数合理地约束在经济上有意义的区间内时,即使似然面平坦,后验仍然是良态的,避免 MLE 在无边无际的参数空间里乱跑。第三,输出完整的参数不确定性。贝叶斯估计的产出不是一个点,而是后验分布 $p(\theta\mid Y)$,你可以直接读出后验均值、中位数、90%/95% 可信区间,以及任何函数(如脉冲响应、福利损失)的后验分布。第四,天然支持模型比较。边际似然 $p(Y)$ 把"拟合好"与"参数简约"统一成一个标量,Bayes factor 可以在嵌套或非嵌套模型之间做正式比较,这是 MLE 的 AIC/BIC 难以完全替代的。

正是因为这些优势,自 Smets-Wouters (2007) 之后,贝叶斯估计已经成为中大型 DSGE 的事实标准估计方法,各国央行(Fed、ECB、PBOC)的核心模型几乎全部采用这一框架。

02 贝叶斯定理与推断框架

设待估参数向量为 $\theta$(包含结构性参数与冲击标准差),观测数据为 $Y=\{y_t\}_{t=1}^{T}$。贝叶斯推断的全部内容,就是用观测到的数据 $Y$ 来修正我们对 $\theta$ 的事前信念。这一修正由贝叶斯定理完成:

贝叶斯定理(Bayes' rule)
$$p(\theta \mid Y) = \frac{p(Y \mid \theta)\,p(\theta)}{p(Y)},\qquad p(Y)=\int p(Y\mid\theta)\,p(\theta)\,d\theta$$

假设。这里有三个前提:其一,参数被视为随机变量而非常数,我们对它的"知道程度"用概率分布刻画;其二,似然 $p(Y\mid\theta)$ 由模型完全决定——给定参数,DSGE 的一阶解给出线性状态空间,再由卡尔曼滤波把数据的条件密度算出来;其三,先验 $p(\theta)$ 与数据 $Y$ 的分布形式相互独立,即先验不依赖于这组数据本身。

公式四个量各有明确的经济学含义,下面逐一解读:

  • 先验 $p(\theta)$:估计"之前"研究者对参数的信念。它把经济理论与外部证据压缩成一个分布——例如 $\beta$ 接近 1、Calvo 概率落在 0.5–0.9、风险厌恶系数约在 1–2。先验不是"拍脑袋",而是微观估计、稳态恒等式和前人文献的结构化汇总。
  • 似然 $p(Y\mid\theta)$:在给定参数 $\theta$ 下,模型生成我们观测到这组数据的"可能性"。它是数据进入推断的唯一通道,由卡尔曼滤波在线性高斯状态空间上递归构造。似然越大,说明这组参数下模型越能复现数据的动态。
  • 后验 $p(\theta\mid Y)$:用数据更新之后的信念,是贝叶斯估计最终要的全部结论。它同时受先验与似然影响——数据信息强时后验被似然主导,数据信息弱时后验向先验收拢。
  • 边际似然 / 证据 $p(Y)$:把 $\theta$ 积掉后数据自身的边缘概率。它与 $\theta$ 无关,纯粹是个归一化常数,但它衡量"在整个先验空间上,模型平均而言有多能解释数据",因此是模型比较(Bayes factor)的核心。

由于 $p(Y)$ 与 $\theta$ 无关,抽样时根本不需要算它。我们只关心后验核(posterior kernel)

后验核(抽样对象)
$$p(\theta \mid Y) \propto p(\theta)\,p(Y\mid\theta)$$

解读:后验 ∝ 先验 × 似然。MCMC(第 06 节)做的全部事情,就是从这个正比于"先验×似然"的未知分布里抽取大量样本,用这些样本的经验分布去逼近真实后验。注意这与频率学派的本质区别——频率学派把 $\theta$ 当固定常数、$Y$ 当随机;贝叶斯把 $Y$ 固定(已经发生)、把 $\theta$ 当随机。这一哲学差异直接决定了我们报告的是"参数落在某区间的概率",而非"在重复抽样中区间覆盖真值的频率"。

03 先验分布设定(重点)

先验设定是贝叶斯 DSGE 最能体现研究者功力的环节。它有两条铁律:取值域必须匹配(概率型参数不能放 Gamma,正参数不能放 Normal),先验必须合理地"软"(太硬等于校准,太软等于放任似然乱跑)。下面先讲分布族的选择逻辑,再讲超参数怎么定,最后给出 Smets-Wouters(2007) 的完整先验表与 Dynare 写法。

3.1 常用分布族与适用参数

分布取值域形状特点典型用于哪些参数
Beta $\mathcal{B}(\alpha,\beta)$$(0,1)$双峰可调成近似钟形Calvo 概率 $\theta$、习惯形成 $h$、Taylor 平滑 $\rho_r$、AR(1) 持续性系数 $\rho$、投资调整成本相关比例
Gamma$(0,\infty)$右偏、严格正相对风险厌恶 $\sigma_c$、Frisch 劳动供给弹性 $\varphi$、Taylor 通胀系数 $\phi_\pi$、产出系数 $\phi_y$、投资调整成本 $\varphi$、稳态价格加成
Inverse Gamma$(0,\infty)$(重尾)右尾厚、在 0 附近截断所有结构冲击的标准差 $\sigma$(技术、货币政策、风险、投资加成、价格加成、工资加成、消费偏好)
Normal$(-\infty,\infty)$对称无界无符号约束的参数,如稳态通胀 $\bar\pi$、政策反应中的长期系数
Uniform$(a,b)$平坦、无信息不希望施加任何主观信念时,对某参数做无信息先验

为什么冲击标准差要用 Inverse Gamma 而不是 Gamma?因为 Inverse Gamma 分布有厚尾且在 0 附近自动截断,对应"我们对冲击波动率的信念是右偏的、允许偶尔很大但不允许为负"这一先验直觉;同时它是高斯似然的共轭先验,数学性质友好。而 Beta 之所以用于 (0,1) 区间的概率参数,是因为它天然把质量压在 (0,1) 内,且通过超参数可以调成近似正态的钟形($\alpha,\beta$ 都较大时)。

3.2 超参数(均值、标准差)怎么选

先验均值与标准差不是随意取的,有三个来源可依。第一,微观估计证据。例如 Frisch 弹性在微观劳动经济学文献里常见估计为 1 左右,习惯形成参数 $h$ 的微观证据约在 0.5–0.8。第二,已有文献。Smets-Wouters(2007)、Altig 等 (2011)、Justiniano 等 (2010) 的先验设定已成为国际标准,做中国 DSGE 时可在其基础上按中国数据的矩做小幅平移。第三,稳态矩。比如资本折旧率 $\delta$ 由稳态投资/资本比锁定,主观贴现因子 $\beta$ 由稳态实际利率 $1/\beta-1$ 锁定,这些参数几乎不需要估计,通常直接校准或给极窄先验。

💡 先验标准差的"度"

先验标准差太小(如 0.01),等于强行校准,数据无法更新——后验几乎等于先验;太大(如 1.0),则先验几乎无信息约束,等价于在无边参数空间里搜似然,容易跑出经济上荒谬的值。SW 的经验是:持续性系数先验 std 约 0.1,Taylor 系数 std 约 0.25–0.5,冲击标准差先验 std 约 0.05–0.1。

3.3 Smets-Wouters (2007) 先验设定表(节选事实标准)

参数含义分布先验均值先验 std
$\varphi$投资调整成本Normal4.001.50
$\sigma_c$相对风险厌恶Normal1.500.37
$h$习惯形成Beta0.700.10
$\sigma_l$Frisch 劳动弹性Normal2.000.75
$\xi_w$工资 CalvoBeta0.500.10
$\xi_p$价格 CalvoBeta0.500.10
$\iota_w$工资指数化Beta0.500.15
$\iota_p$价格指数化Beta0.500.15
$\psi$资本利用调整Beta0.500.15
$\Phi$稳态价格加成Normal1.250.12
$r_\pi$Taylor 通胀反应Normal1.700.10
$r_y$Taylor 产出反应Normal0.1250.05
$\rho$政策利率平滑Beta0.750.10
$\pi^*$稳态通胀Gamma0.620.10
$100(\beta^{-1}-1)$稳态贴现率Gamma0.250.10
$\rho_a,\rho_b,\rho_g,\rho_I,\rho_p,\rho_w,\rho_r$各冲击 AR(1)Beta0.50–0.900.10
$\sigma_{a},\dots$(7 个)各冲击标准差Inv. Gamma0.1–0.5(季度百分数)2(宽松先验)

注意 SW 对冲击标准差用的是非常宽松的 Inverse Gamma 先验(先验 std 设大),因为他们希望数据自己告诉各冲击的相对重要性,而不是用先验把某个冲击"预设得很大"。这是一个值得借鉴的设计原则:结构性参数给紧先验(受微观证据约束),冲击波动率给松先验(让数据说话)。

3.4 先验敏感性分析(prior sensitivity)

审稿人最常问的问题是:"你的后验到底是数据说了算,还是先验说了算?"标准做法是做先验敏感性分析:把先验标准差放大或缩小一倍(如把某个参数的先验 std 从 0.10 改成 0.20 或 0.05),重新跑一次 MCMC,比较后验均值与区间。如果结论对先验设定稳健,说明是数据在更新;如果后验几乎随先验平移,说明该参数被先验主导,数据信息量不足,需要在论文中如实报告。

3.5 Dynare 中 prior 块的写法

Dynare 用 estimated_params 块声明每个待估参数,语法为:参数名, 分布名, 先验均值, 先验标准差, 下界, 上界;。冲击标准差用 stderr 冲击名 开头,冲击 AR(1) 系数用 corr 冲击名, 另一冲击名 或在模型方程里写 rho_*

Dynare · estimated_params 先验块
estimated_params;
  % --- 结构性参数: 分布, 均值, std, [下界], [上界] ---
  kappa,   gamma_pdf,    0.125, 0.05,    0,    1;   % NKPC 斜率
  sigma_c, normal_pdf,   1.50,  0.37,    0.2,  4;   % 风险厌恶
  h,       beta_pdf,     0.70,  0.10,    0,    0.95;% 习惯形成
  phi_pi,  gamma_pdf,    1.70,  0.10,    1.0,  4;   % Taylor 通胀
  phi_y,   gamma_pdf,    0.125, 0.05,    0,    1;   % Taylor 产出
  rho_r,   beta_pdf,     0.75,  0.10,    0,    0.97;% 利率平滑
  rho_a,   beta_pdf,     0.90,  0.05,    0,    0.999;% 技术 AR(1)
  % --- 冲击标准差: 一律 inv_gamma_pdf ---
  stderr ea, inv_gamma_pdf, 0.01, 0.005;
  stderr em, inv_gamma_pdf, 0.0025, 0.001;
  % --- 可选: 两个冲击的相关系数 ---
  % corr ea, em, beta_pdf, 0.0, 0.2;
end;

04 数据选择与处理(重点)

DSGE 估计的成败,一半在模型,一半在数据。宏观时间序列样本短、噪声大、口径混杂,观测变量与模型变量对不上是新手最常见的失败原因。本节分"变量选择—数据来源—处理步骤—对应关系"四步讲清楚。

4.1 观测变量与模型变量的对应原则

模型里的变量都是对稳态的偏离(百分比偏离或百分点偏离),而现实数据是含趋势、含水平的序列。观测方程要做的,就是把"数据 $y_t$"翻译成"模型变量 $\hat x_t$"。对应原则是:模型里有几个内生可观测变量,就用几个数据序列;且观测变量个数不能超过结构冲击个数,否则卡尔曼滤波出现随机奇异性(stochastic singularity)。一个标准中尺度模型用 7 个冲击,就观测 7 个序列:产出、消费、投资、工资、通胀、利率、就业(或小时)。

4.2 中国数据来源与具体指标

模型变量中国常用指标来源备注
产出 $Y$GDP 不变价当季值(累计当季折算)国家统计局 NBS / Wind用不变价或名义/GDP平减指数折算,季调
消费 $C$社会消费品零售总额 / 居民消费支出(季度)NBS / Wind / CSMAR社零偏月度,需加总为季度并折算实际值
投资 $I$固定资产投资完成额(不含农户)/ 资本形成总额NBS / Wind固定资产投资为名义值,需用 PPI 折算
通胀 $\pi$CPI 同比(季度均值或环比折年)NBS / CEIC也可用 GDP 平减指数,需自行计算
政策利率 $R$7 天银行间质押式回购利率(DR007)/ 7 天逆回购利率 / Shibor中国人民银行 / Wind中国"政策利率"不唯一,主流用 7 天逆回购或 DR007
工资 $W$城镇单位就业人员平均工资 / 城镇私营单位工资NBS季度频率不完整,常用 CPI 折算后取增速
就业 / 小时 $L$城镇单位就业人数 / 就业总人数NBS / CSMAR无小时数据时用就业人数替代,质量一般

数据平台上,Wind 与 CEIC 是做中国 DSGE 最顺手的两个库,指标口径全、历史长;CSMAR 适合做行业/微观补充;国家统计局官网免费但导出与季调需自己处理。中国数据有几个特殊坑:① 2003 年起 GDP 核算口径调整;② 2014 起固定资产投资改为财务支出口径;③ 春节导致 1–2 月数据合并发布;④ 社零与居民消费支出口径差异较大。这些都要在样本区间选择时规避。

4.3 美国与国际数据来源

地区数据平台典型指标
美国FRED(圣路易斯联储 FRED II)Real GDP (GDPC1)、GDP Deflator (GDPDEF)、Real Personal Consumption、Real Gross Private Domestic Investment、Average Hourly Earnings (AHETPI)、Civilian Employment (CE16OV)、Federal Funds Rate (FEDFUNDS)
美国官方BLS(劳工部)、BEA(经济分析局)BLS 负责 CPI、就业、平均时薪;BEA 负责 NIPA 账户(GDP、消费、投资)。FRED 实际就是把 BLS/BEA/财政部的数据统一编号
国际Penn World Table (PWT)跨国可比的资本存量、全要素生产率、就业、汇率,适合做开放经济或跨国估计
国际IMF IFS(International Financial Statistics)各国名义 GDP、CPI、利率、汇率、国际收支
国际OECD.StatOECD 成员国高频宏观、小时就业、工资

FRED 的优势是每个序列有固定代号、提供 ALFRED 实时 vintage、可直接下载 csv;做美国 DSGE 几乎全部指标都能在 FRED 找到,这也是 Smets-Wouters 模型易于复现的原因之一。

4.4 数据处理五步流程

第一步:取对数
对水平量(GDP、消费、投资、工资)取自然对数 $\ln x_t$。这样一阶差分就是增长率,且对数化后变量近似服从对称分布,与对数线性化模型的 $\hat x_t$ 量纲一致。利率、通胀这种"率"通常不再取对数,直接用百分数或小数。
第二步:季节调整
宏观季度数据有强烈的季节效应(如春节、圣诞)。美国数据直接取 FRED 已 X-13 季调的序列;中国数据通常需用 Census X-12/X-13-ARIMA 自行处理,或对春节效应做移动平均/虚拟变量调整。未季调数据喂给 DSGE 会被季度波动淹没真实周期。
第三步:去趋势(HP 滤波 vs 一阶差分)
这是最关键的一步。HP 滤波:$\min_{\{\tau_t\}}\sum_{t}(x_t-\tau_t)^2+\lambda\sum_t[(\tau_{t+1}-\tau_t)-(\tau_t-\tau_{t-1})]^2$,季度数据取 $\lambda=1600$,取出循环成分 $\hat x_t=x_t-\tau_t$。优点是简单、与平稳模型直接对接;缺点是端点漂移、把高频信息错归为趋势。一阶差分:$\Delta\ln x_t=\ln x_t-\ln x_{t-1}$,把对数增长率直接喂给观测方程,对应模型里带单位根随机趋势的设定(SW 即此法)。前者是"先验去趋势",后者是"在模型里显式建模趋势",论文里两种都常见,必须在方法论部分写清楚。
第四步:样本区间选择
样本应尽量避开重大结构性断点:中国数据建议从 1998(现代央行体制建立)或 2001(入世后市场化加深)之后开始,且通常不把 2020 疫情这种极端观测放进常规样本(或单独讨论);美国数据常用 1954Q1–2004Q4(SW 原始样本)或更新到最近。断点会破坏平稳性假设,导致先验与似然对不上。
第五步:量纲对齐与年化
模型里通胀与利率是季度对数偏离,但数据里常报告为年化百分比。观测方程里要乘 400(季度小数 → 年化百分数)或 4(季度小数 → 年化小数)。例如 $\pi^{obs}_t = 400\pi_t$,$r^{obs}_t=400r_t$。漏掉这一步,先验均值与数据方差对不上,MCMC 永远收不拢。

4.5 观测变量与模型变量对应表(含观测方程)

统一的状态空间框架下,观测方程写作 $Y_t = H X_t + \eta_t$,其中 $Y_t$ 是数据向量,$X_t$ 是模型状态向量,$\eta_t$ 是测量误差(可选)。下表给出一个标准 SW 风格模型的对应关系:

数据列名对应模型变量观测方程写法(Dynare)量纲处理
obs_y产出偏离 $\hat y_t$obs_y = y;对数后 HP 循环或一阶差分
obs_c消费偏离 $\hat c_t$obs_c = c;同上
obs_i投资偏离 $\hat i_t$obs_i = i;同上
obs_w实际工资 $\hat w_t$obs_w = w;对数后去趋势
obs_pi通胀 $\pi_t$obs_pi = 400*pi;年化百分数
obs_r名义利率 $r_t$obs_r = 400*r;年化百分数
obs_l就业/小时 $\hat l_t$obs_l = l;对数后偏离均值

Dynare 里这一对应关系由两个声明完成:varobs obs_y obs_c obs_i obs_w obs_pi obs_r obs_l; 列出要观测的变量名(顺序与数据文件列序一致),再在 model 块里把这些 obs_* 写成方程(即观测方程),数据文件名用 datafile='data.csv' 指定。注意 Dynare 默认数据文件无表头、列顺序与 varobs 完全一致、行顺序按时间

05 卡尔曼滤波(Kalman Filter)与似然构造

Dynare 求解器把 DSGE 在稳态附近一阶展开,得到线性 rational expectations 解。这个解天然是一个线性高斯状态空间模型,卡尔曼滤波就是在这种模型上高效计算似然的递归算法。

5.1 状态空间表示

状态方程 + 观测方程
$$X_t = A\,X_{t-1} + B\,\varepsilon_t,\qquad \varepsilon_t\sim N(0,Q)$$ $$Y_t = H\,X_t + \eta_t,\qquad \eta_t\sim N(0,R)$$

其中 $X_t$ 是模型状态(含前定变量与期望变量),$Y_t$ 是观测数据向量,$A$、$B$、$H$ 由 DSGE 解出、是 $\theta$ 的函数,$Q$ 是结构冲击协方差,$R$ 是测量误差协方差(可设为 0)。假设:$\varepsilon_t$ 与 $\eta_t$ 独立、同分布、高斯。正是这两条假设让似然有解析形式。

5.2 预测步与更新步

记 $\hat X_{t|t-1}=E[X_t|Y_{1:t-1}]$ 为用前 $t-1$ 期数据对 $X_t$ 的预测,$P_{t|t-1}$ 为其均方误差。滤波分两步递归:

预测步(predict,从 t-1 到 t)
$$\hat X_{t|t-1}=A\,\hat X_{t-1|t-1},\qquad P_{t|t-1}=A P_{t-1|t-1}A^\top + B Q B^\top$$
更新步(update,用 $Y_t$ 修正)
$$v_t=Y_t-H\hat X_{t|t-1},\qquad F_t=H P_{t|t-1}H^\top+R$$ $$K_t=P_{t|t-1}H^\top F_t^{-1}\quad(\text{卡尔曼增益})$$ $$\hat X_{t|t}=\hat X_{t|t-1}+K_t v_t,\qquad P_{t|t}=P_{t|t-1}-K_t H P_{t|t-1}$$

解读:$v_t$ 是新息(innovation)——当期数据与模型预测的差;$F_t$ 是新息的条件方差;卡尔曼增益 $K_t$ 决定用新息修正预测的力度——当观测噪声大($R$ 大)时 $K_t$ 小,模型更相信自己;当状态不确定大($P$ 大)时 $K_t$ 大,模型更相信数据。

5.3 似然如何由滤波构造

在高斯假设下,新息 $v_t|Y_{1:t-1}\sim N(0,F_t)$,所以每期的条件密度就是一个高斯密度。把它们连乘再取对数,就是完整似然:

对数似然(预测误差分解)
$$\log p(Y\mid\theta)=-\frac{1}{2}\sum_{t=1}^{T}\Big[N\log(2\pi)+\log|F_t|+v_t^\top F_t^{-1}v_t\Big]$$

这就是 DSGE 似然的全部:一个 $T$ 期的高斯预测误差分解。Dynare 在每次评估后验核时,内部都跑一遍这个滤波,把 $\log p(Y|\theta)$ 算出来,再乘上先验密度。卡尔曼滤波在 DSGE 估计中的作用,就是把"给定参数下模型解释数据的能力"压缩成一个可微的标量,供 MCMC 与优化器调用。注意:当观测变量数大于结构冲击数时,$F_t$ 会奇异(不可逆),滤波报错——这就是"随机奇异性",第 09 节会讲。

06 MCMC 后验模拟:Metropolis-Hastings

6.1 为什么需要 MCMC

后验核 $p(\theta\mid Y)\propto p(\theta)p(Y\mid\theta)$ 是一个高维、非标准分布,没有解析形式,也无法直接积分出后验矩。MCMC(Markov Chain Monte Carlo)的思路是:构造一条马尔可夫链,让它的平稳分布恰好是后验 $p(\theta\mid Y)$;跑足够多步后,链上的样本就近似从后验抽取,用这些样本的经验均值、分位数去估计后验矩。

6.2 Metropolis-Hastings 算法步骤

Dynare 默认用随机游走 Metropolis-Hastings (Random-Walk MH)

初始化
从后验众数 $\hat\theta_{map}$ 出发(先用优化器 mode_compute 找到),提议分布协方差取 $\hat\Sigma=c\cdot H^{-1}$,其中 $H$ 是众数处后验 Hessian 的近似,$c$ 是 mh_jscale
提议
从多元正态 $q(\theta'\mid\theta)\sim N(\theta,c^2 H^{-1})$ 抽一个候选 $\theta'$。这就是"随机游走"——在当前点附近高斯扰动。
计算接受概率
$$\alpha(\theta,\theta')=\min\!\left(1,\ \frac{p(\theta'\mid Y)\,q(\theta\mid\theta')}{p(\theta\mid Y)\,q(\theta'\mid\theta)}\right)$$ 对随机游走正态提议,$q$ 对称,比值简化为 $\min[1, p(\theta'\mid Y)/p(\theta\mid Y)]$。
接受或拒绝
以概率 $\alpha$ 接受 $\theta'$(链走到 $\theta'$),否则留在 $\theta$。重复数十万步,丢弃前面的 burn-in(Dynare 默认前 20%)。

接受率的目标区间是 20%–40%(随机游走 MH 的最优渐近接受率在高维约 23%)。接受率过高(>60%)说明跳跃太小、链在原地磨蹭、混合慢;过低(<10%)说明跳跃太大、几乎全被拒绝、探索不足。调 mh_jscale 就是调提议方差:接受率太高就调大,太低就调小。

6.3 Dynare estimation 命令完整写法与逐项解释

Dynare · estimation 完整命令(逐项注释)
estimation(datafile='data_cn.csv',   % 数据文件: 无表头, 列序同 varobs
           directory='./bayes_out',  % 输出目录
           % ----- 模式搜索 (找后验众数) -----
           mode_compute=4,           % 4=Newton-like Chris Sims 优化; 1=fmincon; 6=veacnel; 8=CMR
           mode_check,               % 在众数处打印梯度/Hessian, 检查识别
           % ----- MCMC 抽样 -----
           mh_replic=200000,         % 每条链抽样数 (建议 10万-50万; 太少不收敛)
           mh_nblocks=2,             % 并行链数 (>=2 才能做 BGR 诊断)
           mh_jscale=0.3,            % 提议分布跳跃尺度: 调接受率, 目标 20-40%
           mh_drop=0.2,              % 丢弃前 20% 作为 burn-in
           prior_trunc=0,            % 先验截断 (0=不截断, 与分布默认支持一致)
           % ----- 输出量 -----
           bayesian_irf,             % 计算贝叶斯 IRF (带后验置信带)
           irf=40,                   % IRF 长度 40 期
           moments_endo,             % 输出后验二阶矩
           forecast=8,               % 样本外预测 8 期
           smoothed_state,           % 平滑状态 (用于历史分解)
           filtered_state,
           load_mh_file,             % 续跑: 已有 mh 文件时追加
           nograph,                  % 不自动出图 (无显示环境用)
           nodisplay,
           graph_format='pdf');

每个选项的含义:mode_compute 决定用哪个优化器找后验众数,=4(Chris Sims 的 csminwel)是最稳健的默认值,若失败可换 =6(fmincon 类)或 =8mh_replic 是每条链的抽样数,中尺度模型至少 10 万起,正式论文常跑到 50 万;mh_jscale 是最需要手动调的参数,跑一次后看 Dynare 输出的 "acceptance rate",不在 20–40% 就按比例缩放重跑;mh_nblocks=2 跑两条独立链,是 Brooks-Gelman-Rubin 诊断的前提;bayesian_irf 让 Dynare 对每个后验抽样点都算一遍 IRF,最终给出 IRF 的后验分布;forecast=8 给出样本外 8 期预测的后验分布;load_mh_file 允许在已有 MCMC 文件基础上续跑,避免每次从头算。

6.4 收敛诊断

MCMC 不收敛是估计类论文被拒的头号原因。必须做三层检查:

  • Brooks-Gelman-Rubin (BGR) 统计量:对每条链算组内方差 $W$ 与跨链方差 $B$,收缩因子 $\hat R=\sqrt{\frac{\widehat{\text{Var}}(\theta|Y)}{W}}$,其中 $\widehat{\text{Var}}=\frac{n-1}{n}W+\frac{1}{n}B$。收敛要求 $\hat R$ 在整个抽样后期稳定地接近 1(经验阈值 < 1.02 或 1.1)。Dynare 自动输出 BGR 图。
  • trace 图(轨迹图):画出每个参数随抽样序号的轨迹。两条链应"纠缠"在一起、没有明显的趋势或漂移、没有长期停在某点。如果链在某个值上粘住不动,说明提议方差太小或有边界陷阱。
  • 后验直方图与自相关图:后验分布应光滑、单峰;自相关应快速衰减(lag 10 以内接近 0)。自相关衰减慢意味着有效样本量 (ESS) 远小于名义 mh_replic,需要加大抽样数或优化提议方差。

07 结果解读

Dynare 跑完后会输出大量数字和图,本节讲哪些是真正要读的。

7.1 后验矩与可信区间

报告每个参数的后验均值(posterior mean)、后验中位数(posterior median)、后验众数(posterior mode),以及 90% 或 95% 最高后验密度区间(HPD interval)。注意贝叶斯的区间不是"频率学派的置信区间",它直接是"参数落在该区间的后验概率"。区间是否跨过 0(对系数类参数)或是否显著偏离先验均值,是判断"数据是否识别出该参数"的关键。

7.2 先验—后验对比图

Dynare 默认画 prior vs posterior 图:先验密度(浅色)与后验密度(深色)叠在一张图上。解读规则:若后验明显比先验窄、且中心偏移,说明数据对该参数有信息;若后验几乎与先验重合,说明数据没怎么更新——该参数实际上被先验钉住了,论文里应谨慎讨论,或改用更宽先验重新估计。这是审稿人最爱的"数据 vs 先验"检查。

7.3 边际似然与模型比较(Bayes factor)

Dynare 在输出末尾给出 log data density(边际似然的对数,用 Geweke 修正调和均值或 Laplace 近似计算)。比较两个模型 $M_1$ 与 $M_2$ 时:

Bayes factor
$$BF_{12}=\frac{p(Y\mid M_1)}{p(Y\mid M_2)},\qquad \log BF_{12}=\log p(Y|M_1)-\log p(Y|M_2)$$

Jeffreys 准则:$2\ln BF > 10$ 为极强证据,2–6 为正向证据,<2 则无显著差异。注意边际似然对先验很敏感(先验越宽,惩罚越大),所以比较模型时必须用相同的先验,否则比较无意义。

7.4 贝叶斯 IRF、历史分解与方差分解

  • 贝叶斯 IRF:对每个后验抽样点都算一组脉冲响应,画中位数带 90% 置信带。与校准 IRF 相比,它告诉你"冲击如何传导"这一结论本身有多不确定。
  • 历史分解(historical decomposition):把样本期内观测变量偏离稳态的每一部分,归因到每个结构冲击。例如"2008Q4 产出下滑主要由风险冲击解释"。这是政策叙事的核心图表。
  • 方差分解(variance decomposition):报告各冲击在 4 期、10 期、∞ 期对产出/通胀/利率预测方差的贡献份额,回答"周期主要由什么驱动"。

08 完整 Dynare .mod 示例

下面给出一个可直接套用的小型 NK 模型贝叶斯估计 .mod 文件,覆盖 varobs、先验块、model 块中的观测方程、estimation 命令。把你已有的 model 块替换进去即可。

Dynare · nk_bayes_cn.mod(完整可运行框架)
% ======================================================================
% nk_bayes_cn.mod  小型 NK 模型贝叶斯估计 (中国数据示范)
% 数据: data_cn.csv, 三列无表头, 顺序 = varobs 顺序:
%   列1 obs_y   : 实际产出 HP 循环 (百分数)
%   列2 obs_pi  : CPI 同比年化 (百分数)
%   列3 obs_r   : 7天逆回购利率年化 (百分数)
% ======================================================================

% ---------- 1. 变量声明 ----------
var y c pi r mc a;                 % 内生变量
varobs obs_y obs_pi obs_r;         % 被观测变量 (顺序=数据列序)
varexo ea em;                      % 结构冲击: 技术 ea, 货币政策 em

% ---------- 2. 被估计参数的先验 ----------
estimated_params;
  kappa,    gamma_pdf,     0.125, 0.05;     % NKPC 斜率
  sigma_c,  normal_pdf,    1.50,  0.37;     % 风险厌恶 (固定或估计)
  phi_pi,   gamma_pdf,     1.50,  0.25;     % Taylor 通胀反应
  phi_y,    gamma_pdf,     0.125, 0.05;     % Taylor 产出反应
  rho_r,    beta_pdf,      0.75,  0.10;     % 利率平滑
  rho_a,    beta_pdf,      0.90,  0.05;     % 技术 AR(1)
  stderr ea, inv_gamma_pdf, 0.01, 0.005;    % 技术冲击 std
  stderr em, inv_gamma_pdf, 0.0025,0.001;   % 货币冲击 std
end;

% ---------- 3. 固定参数 (不估计) ----------
params beta;
beta = 0.99;                       % 主观贴现因子, 由稳态利率锁定

% ---------- 4. 模型方程 (对数线性化, 已是平稳形式) ----------
model(linear);
  % IS 曲线
  c = c(1) - (1/sigma_c)*(r - pi(1));
  % NK 菲利普斯曲线
  pi = beta*pi(1) + kappa*mc;
  % 资源约束与边际成本
  y = c;
  mc = (sigma_c + 1.0)*y;
  % Taylor 规则 (含利率平滑)
  r = rho_r*r(-1) + (1-rho_r)*(phi_pi*pi + phi_y*y) + em;
  % 技术过程
  a = rho_a*a(-1) + ea;
  % ===== 观测方程: 模型变量 -> 数据 =====
  obs_y  = y;            % 产出循环 (已是百分数)
  obs_pi = 400*pi;       % 季度通胀 -> 年化百分数
  obs_r  = 400*r;        % 季度利率 -> 年化百分数
end;

% ---------- 5. 稳态与求解 ----------
steady;
check;                             % 检查鞍点路径

% ---------- 6. 贝叶斯估计 ----------
estimation(datafile='data_cn.csv',
           mode_compute=4,         % Chris Sims 优化器找众数
           mode_check,
           mh_replic=200000,       % 每链 20 万步
           mh_nblocks=2,           % 两条链
           mh_jscale=0.3,          % 跳跃尺度, 看接受率调整
           prior_trunc=0,
           bayesian_irf,           % 贝叶斯 IRF
           irf=40,
           moments_endo,
           forecast=8,
           nograph, nodisplay);

% ---------- 7. 后处理 ----------
% Dynare 输出到 oo_ 结构:
%   oo_.PosteriorTheoreticalMoments  -> 后验均值/中位数/HPD
%   oo_.MeanBvsPrior                 -> 先验后验对比
%   oo_.PosteriorIRF                 -> 贝叶斯 IRF
%   oo_.MarginalDensity              -> log 边际似然
%   oo_.SmoothedShocks               -> 历史分解所需平滑冲击

% Shocks decomposition (历史分解):
% shocks_decomposition(plot);
% conditional_forecast paths(1);

% ======================================================================
% 中文注释要点:
% (1) varobs 必须与 model 块里 obs_* 方程一一对应, 顺序与数据列序一致;
% (2) estimated_params 里每个参数写: 名字, 分布, 均值, std, [下界], [上界];
% (3) model(linear) 表示方程已是对数线性化形式, 不要再写 model() 默认;
% (4) 利率/通胀乘 400 是为了把季度小数年化, 与数据口径对齐;
% (5) 先跑一次 mh_replic=5000 看 acceptance rate, 调 mh_jscale 后再跑长链.
% ======================================================================

09 常见错误与调试

❌ 错误 1:mh_jscale 不合适,接受率太高或太低

现象:Dynare 输出 "MH acceptance rate = 80%" 或 "= 5%"。接受率太高说明提议太小,链混合极慢;太低说明提议太大,几乎全被拒绝。调试:目标 20–40%,按线性比例调整 mh_jscale(接受率太高则调大约 sqrt(1/0.3) 倍,太低则调小)。每次改完重跑短链验证。

❌ 错误 2:模式搜索失败(mode_compute)

现象:Optimization 不收敛、后验众数落在边界、mode_check 报梯度非零。调试:先把先验均值设得接近文献值,避免从离谱点出发;mode_compute=4 失败就换 =6 或 =8;用 mode_file= 把上一次找到的众数读入续跑;确认参数不撞先验边界。

❌ 错误 3:数据与模型变量不匹配

现象:后验标准差巨大、log 似然极差、参数全部贴边。调试:检查量纲——数据是百分数而模型是季度小数(漏乘 400);检查 varobs 顺序与 csv 列序;检查数据是否已去趋势(把含趋势的水平序列喂给平稳模型,似然面会被趋势主导)。

❌ 错误 4:先验设定不合理

两种相反的失败:① 先验过窄,后验≈先验,数据完全没更新("用贝叶斯方法做了一次校准");② 先验过宽且不支持似然,后验被先验尾部拉到经济上荒谬的值。调试:看 prior-posterior 对比图;做先验敏感性分析(std 翻倍/减半重跑);对 (0,1) 参数严格用 Beta,正参数用 Gamma/InvGamma。

❌ 错误 5:卡尔曼滤波奇异(随机奇异性)

现象:报错 "Matrix is singular" 或 "Stochastic singularity"。原因:观测变量个数 > 结构冲击个数,或某观测变量被模型精确决定、无任何冲击能解释。调试:增加一个结构冲击,或给某个观测加测量误差(varobs ... ; 配合 stderr obs_*, inv_gamma_pdf, ...;)。

❌ 错误 6:MCMC 不收敛

现象:BGR 统计量远离 1、trace 图两条链不重合、后验直方图多峰。调试:加大 mh_replic 到 50 万;检查是否 burn-in 不够;确认 mode_compute 找到的众数确实是全局众数(多起点测试);对识别弱的参数收紧先验;必要时换自适应 Metropolis(Dynare 的 adapt= 选项)。

⚠️ 额外提醒

⑦ 数据里含疫情极端观测(2020),似然会被 outliers 主导,建议样本截止或加虚拟变量;⑧ 中国数据样本短(季度通常 80–100 个),先验要比 SW 稍紧,否则后验识别不出来;⑨ 不要把"后验均值"直接当"真实参数"解读,务必连同 HPD 区间一起报告。

10 经典论文案例

English · 金标准
Smets, F. & Wouters, R. (2007). Shocks and Frictions in US Business Cycles: A Bayesian DSGE Approach
American Economic Review, 97(3) · 贝叶斯 DSGE 估计的事实标准
用 7 个结构冲击、10 个 frictions(价格/工资粘性、习惯、资本调整成本、产能利用、指数化等)估计美国 1954Q1–2004Q4。其先验设定表、观测方程、MCMC 设置、BGR 诊断都成了后来所有论文的模板,本页 3.3 节的先验表即沿用其设计。
English · 方法论
An, S. & Schorfheide, F. (2007). Bayesian Analysis of DSGE Models
Econometric Reviews, 26(2-4) · 贝叶斯 DSGE 综述
系统讲贝叶斯定理、状态空间、卡尔曼滤波、MH、模型比较与边际似然近似,是入门贝叶斯 DSGE 估计的第一方法论读物。配有小型 RBC/NK 例子。
English · 前沿
Fernandez-Villaverde, J., Rubio-Ramirez, J. & Schorfheide, F. (2016). Solution and Estimation Methods for DSGE Models
Handbook of Macroeconomics · 方法论手册章节
覆盖从一阶扰动、粒子滤波到非高斯似然估计的进阶内容;指出线性卡尔曼滤波在宏观新进展(如波动率波动、零利率下限)下的局限,是从线性贝叶斯估计走向非线性估计的桥梁。
中文 · 顶刊
刘斌 (2008). 我国 DSGE 模型的开发及在货币政策分析中的应用
《金融研究》/《经济研究》系列 · 国内央行 DSGE 代表作
中国人民银行团队开发的含金融模块的 DSGE,用中国宏观数据做贝叶斯估计,示范了在数据样本短、口径不一致条件下如何设定先验与观测方程,是中文文献里最系统的本土化范本。
中文 · 顶刊
许志伟、胡永刚等 · 《经济研究》中国 DSGE 贝叶斯估计系列
《经济研究》《管理世界》 · 中国经济周期与货币政策结构估计
讨论中国数据下 HP 滤波与一阶差分的选择、春节效应处理、政策利率代理变量选择(7 天逆回购 vs DR007)、以及先验对后验的影响,是做中国 DSGE 必读的中文参考。
📚 进阶路线

① Herbst & Schorfheide (2015) Bayesian Estimation of DSGE Models — Sequential Monte Carlo 进阶;② Dynare Reference Manual "Bayesian Estimation" 章;③ 学完本页后接 第 16 站:脉冲响应与模拟,把后验估计结果用到政策反事实分析。