DSGE笔记系列2:Dynare基本应用(2)

此文内容为《动态随机一般均衡(DSGE)模型》的笔记,李向阳老师著,清华大学出版社出版。

我只将个人会用到的知识作了笔记,并对教材较难理解的部分做了进一步阐述。为了更易于理解,我还对教材上的一些部分(包括代码和正文)做了修改。

仅供学习参考,请勿转载,侵删!

第3章 · Dynare基本应用(2)

上一篇文章已经向大家介绍了如何在Dynare中编写一个完整的模型文件。下面的3.4 内生变量的表达形式3.5 Dyanre文件的预编译和运行原理3.6 Dynare的解的表示3.7 求解结果分析和调用会介绍一些稍微技术性的问题。除了3.43.7以外,对初学者而言并非十分重要。

3.4 内生变量的表达形式:level or log-level

模型均衡条件的输入是Dynare编程的一个核心,因为均衡条件定义了整个模型。而多数情形下,均衡条件是参数和内生变量的非线性组合。

一般来说,内生变量的表达形式有3种:

  • 水平形式(\text{level}):即变量本身

  • 对数水平形式(\text{log-level}):以对数形式进入模型文件

  • 离差形式(\text{deviation}):线性形式


3.4.1 离差形式

教材的1.1.2 线性化与对数线性化介绍了内生变量的离差形式。一阶线性是学习DSGE的良好出发点,但并不建议对每一个模型的均衡条件都进行线性化,然后输入到模型文件中,原因有:

  • 手动线性化每一个均衡条件极其容易出错

  • Dyanre可以帮你完成线性化,只需要在求解阶数设定 order=1 就可以了

下面着重介绍对数水平形式。


3.4.2 对数水平形式

对数水平形式对于脉冲响应图形的显示为重要,一般推荐在实际研究中使用该形式。下面通过第3.1节的例子来简单解释对数水平形式的具体内涵和使用方法。以(3.1.6)为例:

\frac{1-\theta}{\theta} \frac{C_t}{1-L_t} = (1-\alpha)\exp(Z_t) K_t^\alpha L_t^{-\alpha} \tag{3.1.6}

进行如下等价变形:

\frac{1-\theta}{\theta} \frac{\exp[{\ln{C_t}]}}{1-exp[{\ln{L_t}]}} = (1-\alpha)\exp(Z_t) \{exp[{\ln{K_t}]}\}^\alpha \{exp[{\ln{L_t}]}\}^{-\alpha}

如果定义3个新变量为水平变量的对数,即对数水平变量(添加字母v表示对数变量):

vC_t \equiv \ln(C_t) \quad vL_t \equiv \ln(L_t) \quad vK_t \equiv \ln(K_t)

(没有 Z_t 的原因是它本身就是对数水平的)那么上述均衡条件可以进一步表示为:

\frac{1-\theta}{\theta} \frac{\exp[{vC_t]}}{1-exp[{vL_t]}} = (1-\alpha)\exp(Z_t) \{exp[{v{K_t}]}\}^\alpha \{exp[{v{L_t}]}\}^{-\alpha} \tag{3.1.6*}

对比(3.1.6)(3.1.6^*)不难发现,在实际操作中,只需要将相应的水平变量替换为 \exp(·) 的形式,就可以完成从水平变量到对数变量的转变。此时,在源代码 10中,% (2) 劳动供给方程就要变为 源代码 13

%----- 源代码 13 -----%
···
% (2) 劳动供给方程
[name = 'Labor supply']
((1-theta)/theta) * (exp(c)/(1-exp(lab))) = (1-alpha)*exp(z)*exp(k(-1))^alpha*exp(lab)^(-alpha);
···

需要注意的是,虽然这个时候变量的名称相同,但数学意义已经从水平变量 x 变成了对数水平 \ln(x)。这可以理解为原来应该是 x 的地方现在需要取指数 \exp(·) 才能变成原来的样子,所以现在的 x 应该变成了 \ln(x),也就是对数水平。

在将所有均衡条件都改为对数水平后,Dynare输出的稳态值是对数水平的稳态值而非水平变量的稳态值;变量之间的相关系数变成了对数水平变量之间的相关系数而非水平变量;模拟的样本也将是对数水平的变量。这些在使用的时候都必须注意。

使用对数水平的意义就在于,使得脉冲响应图形变成了对稳态偏离的百分比,属于相对偏离(具体推导请参考教材P131);而水平变量刻画的偏离是具体的偏离值,属于绝对偏离。相对偏离使得脉冲响应图消除了量纲的影响,使得图形之间不会出现比例不协调的问题。

值得一提的是:

  • 虽然变量的表达形式发生了变化,但是均衡条件的结构没有发生变化,从而不会改变模型的内涵和变量的变化趋势,只有变量本身和结果的解释方法发生了变化

  • 并非所有变量都合适取对数,如果某些变量的稳态为负值,一般不能取对数

  • 某些比率变量,如利率,在净值(net形式)下不宜取对数,只有在总值(gross形式)下才可以取对数,否则没有经济内涵


3.5 Dynare文件的预编译和运行原理

Dynare的模型文件使用Dynare语言编写的*.mod文件,只有Dyanre才能读懂,Matlab无法直接处理。虽然模型文件最终的执行是依靠Matlab,但是必须经过Dynare的预处理之后,才能够形成Matlab能读懂的*.m文件供其运行。


3.5.1 Dynare文件的预编译和运行原理

在编写完模型文件后,就是编译并运行模型,求解模型的最终目标是求解决策函数。模型文件的预处理都交给Dynare的预处理器(Preprocessor)完成,它是Dynare的编译器,包含了多个组成部分。其基本流程如下:

  1. 如果模型含有宏命令(在“6.5 Dynare宏命令变成示例”讨论),会先使用宏处理器,生成不含宏命令的模型文件

  2. 使用解析器对模型文件进行编译,形成较为形象、表征模型的Matlab文件(*.m)。这些m文件包括了对Dynare和Matlab内置函数的命令和调用,最终依靠Matlab输出结果

dynare命令是预编译和求解的起点,即通过该命令启动Dynare,自动完成编译处理和求解两项任务。dynare命令使用的方式非常简单,只需要在命令后声明模型文件的全名(后缀.mod可加可不加,注意对文件名大小写敏感),然后以空格隔开的各种选项,具体语法参考源代码 14

%----- 源代码 14-----%
dynare RBC.mod
dynare RBC
dynare RBC noclearall

Dynare的dynare命令拥有20多个选项,可能较为常用的有:

  • noclearall:如果不使用该选项,Dyanre会在生成的m文件开头加入clear all命令清除内存

  • savemacro:会命令宏处理器保存不含有宏语言的模型文件

  • nolog:不保存日志文件

  • nowarn:不显示任何警告信息

  • nograph:不画图(不显示也不保存)

在运行好“Dynare基本应用(1)”最后的模型文件后,屏幕会输出如源代码 15所示:

%---- 源代码 15-----%
Configuring Dynare ...
[mex] Generalized QZ.
[mex] Sylvester equation solution.
[mex] Kronecker products.
[mex] Sparse kronecker products.
[mex] Local state space iteration (second order).
[mex] Bytecode evaluation.
[mex] k-order perturbation solver.
[mex] k-order solution simulation.
[mex] Quasi Monte-Carlo sequence (Sobol).
[mex] Markov Switching SBVAR.

Using 64-bit preprocessor
Starting Dynare (version 4.5.7).
Starting preprocessing of the model file ...
Found 5 equation(s).
Evaluating expressions...done
Computing static model derivatives:
 - order 1
Computing dynamic model derivatives:
 - order 1
Processing outputs ...
done
Preprocessing completed.

这是Dynare的配置信息、文件预处理信息、运行m文件等的输出,初学者一般不需要纠结。


3.5.2 表征模型的Matlab文件

运行dynare命令后,将输入的模型文件,以具体情况会生成如下的几个或全部Matlab的m文件:

  • GrothApproximate.m:主文件,直接运行该文件,可以完成模型文件所需要的全部目的,从而在没有改动文件结构的前提下,直接运行该m文件可以完全节省预编译的时间

  • GrothApproximate_static.m:静态模型文件,包括长期静态均衡条件,可用于计算稳态

  • GrowthApproximate_dynamic.m:动态模型文件

  • GrothApproximate_steadystate2.m:辅助变量文件,即模型中出现 t+2t-2 等情形时会生成的文件

初学者一般不需要纠结。


3.6 Dynare的解的表示

求解完成后,Dynare的最终计算结果会出现在Matlab的屏幕上,包含求解结果信息(即政策函数与转换方程)。同时,Dynare也会按照一定的规则将求解结果储存构数组中。本节将使用3.1节的RBC模型来讲述Dynare的一阶和二阶求解表示及其后续调用。

这里只介绍一阶解的表示方法,二阶解在表示方法的本质上是相同的,请参考教材


3.6.1 一阶解表示

Dynare求解的最根本的目的就是找到模型的政策函数。前文(参考教材的头几章)已经提到,Dynare关于一阶近似解有如下的经典表达形式:

y_t = g(y_{t-1}, u_t) \simeq \bar{y} + g_y \hat{y}_{t-1} +g_u u_t \tag{3.6.1}

假设模型的内生变量个数为 n,状态变量的个数为 m,外生冲击的个数为 q,根据《Dynare Reference Manual》,有:

  • \bar{y} 表示内生变量的稳态值,为 n1 列向量,储存在oo_.dr.ys

  • g_y 表示状态变量的系数矩阵,为 nm 列矩阵,储存在oo_.dr.ghx

  • g_u 表示外生冲击的系数矩阵,为 nq 列矩阵,储存在oo_.dr.ghu

根据(3.6.1)表述,以3.1节的RBC模型为例,内生变量的个数 n=4,状态变量的个数 m=2(参考\text{DSGE笔记系列 1},状态变量个数是混合变量后向变量之和,即出现了t-1项的变量的数量),外生冲击的个数 q=1。则根据变量声明的顺序和Matlab的运行结果,解的表示应该是:

\begin{bmatrix}C_t \\ K_{t+1}\\ L_t \\ Z_t \\ I_t \end{bmatrix} = \begin{bmatrix}1.4916 \\ 29.2885 \\ 0.2916 \\ 0 \\ 0.3515\end{bmatrix} + \begin{bmatrix} 0.0282 & 0.5984 \\ 0.9779 & 1.9003 \\ 0.0019 & 0.01972 \\ 0 & 0.9500 \\ -0.0097 & 1.8766 \end{bmatrix} \begin{bmatrix} K_t \\ Z_{t-1} \end{bmatrix}+\begin{bmatrix} 0.6299 \\ 2.0004 \\ 0.2076 \\ 1.0000 \\ 0.0198\end{bmatrix} \epsilon_t \tag{3.6.2}

如果进一步观察Dynare在Matlab结果输出的解的表示,会发现上述由(3.6.1)表示得到的结果(3.6.2)与Matlab输出的结果完全一致(注意:本程序跑出来的结果与教材给的计算结果 (3.6.2) 有所出入,但除 g_u 外并无较大误差,原因不明):

POLICY AND TRANSITION FUNCTIONS
                                   c               k             lab               z               I
Constant                    1.491629       29.288821        0.291594               0        0.351466
k(-1)                       0.027972        0.978257       -0.001831               0       -0.009743
z(-1)                       0.610801        1.876605        0.194192        0.950000        1.876605
e                           0.006429        0.019754        0.002044        0.010000        0.019754

注意:前文已经提到,存量变量在模型中的 K_{t+1}K_t ,在模型文件中要写成 kk(-1) 的形式

在Dynare中,如果变量均以声明顺序排序,那么 g_y 存储在 oo_.dr.ghx(oo_.dr.inv_order_var,:) 中,而 g_u 则存储在 oo_.dr.ghu(oo_.dr.inv_order_var,:) 中。

这里的(oo_.dr.inv_order_var,:)是为了使输出的顺序与声明顺序相同。可以在模型文件执行完毕后,直接在Matlab运行:

>> g_y = oo_.dr.ghx(oo_.dr.inv_order_var,:)
g_y =
    0.0280    0.6108
    0.9783    1.8766
   -0.0018    0.1942
         0    0.9500
   -0.0097    1.8766

>> g_y = oo_.dr.ghx
g_y =
   -0.0097    1.8766
    0.9783    1.8766
         0    0.9500
    0.0280    0.6108
   -0.0018    0.1942

3.6.2 二阶解的表示

本质上跟一阶其实一样的,只是解的调用有点区别,请自己参考教材😂!


3.7 求解结果分析和调用

上一节介绍了政策函数的表示,已经设计如何调用求解的部分结果,本节继续介绍其他结果的调用。

3.7.1 屏幕输出结果

请自行查看教材


3.7.2 储存结果

Dyanre会将大部分计算结果以结构数组的形式储存下来,这些结果主要有三大类,分别储存在M_oooptions_这三个结构数组中。为了方便调用,Dynare会将这些数组以.mat的形式保存在硬盘上。

(1) 模型信息数组M_

数组M_几乎保存了所有模型有关的基本解析信息,比较常用的如表3.3所示:

表3.3.jpg

(2) 计算和模拟结果数组oo_

模型计算的大部分结果都被储存在oo_中,教材称之为“结果数组”,较为常用的如表3.4所示:

表3.4.jpg

下面是对表3.4中各个字段的解释(请在运行“\text{DSGE笔记系列 1}”最后的代码后试验下面的代码):

  • oo_.exo_simul储存着外生冲击的模拟样本(或称为模拟路径)。模型样本一般是从正态分布中随机抽取,均值为0,方差由外生冲击模块指定。一般情况下,外生冲击的稳态为0,从而oo_.exo_steady_state一般为0向量。在Matlab窗口中运行plot(oo_.exo_simul),有:
外生冲击的模拟路径.jpg

而运行oo_.exo_steady_state则有

>> oo_.exo_steady_state
ans =
     0
  • oo_.endo_simul储存着内生变量的模拟路径,同时以个内生变量的名称为数组的名称为数组名称。请运行oo_.endo_simul(1,:),可以得到:
内生变量的模拟路径.jpg
  • oo_.dr储存着决策函数中各变量的系数矩阵,这一点在3.6节已经阐述过

  • oo_.steady_state储存着各内生变量的稳态值,它跟oo_.dr.ys完全一样:

>> oo_.steady_state
ans =
    1.4916
   29.2888
    0.2916
         0
    0.3515

>> oo_.dr.ys
ans =
    1.4916
   29.2888
    0.2916
         0
    0.3515
  • oo_.autocorr则储存着内生变量之间的相关系数,具体含义如下:

\text{oo_.autocorr}\{i\}(m,n) \equiv \text{corr}(y_t^{(m)},y_{t-i}^{(m)}) \tag{3.7.1}

其中,i 是自相关数组中的第 i 个自相关矩阵,表示滞后阶数。默认情况下最大滞后阶数为5阶,也就是说自相关数组中默认有5个自相关矩阵。 mn 分别表示第 mn 个内生变量(以声明顺序排序)。比如,运行cell2mat(oo_.autocorr(1))可以得到:

>> cell2mat(oo_.autocorr(1))
ans =
    0.9918    0.9435    0.4391    0.7621    0.6086
    0.9645    0.9983    0.1786    0.5618    0.3721
    0.3776    0.1106    0.9328    0.8428    0.9090
    0.7175    0.5033    0.8694    0.9496    0.9284
    0.5542    0.3074    0.9221    0.9143    0.9387
  • oo_.irfs储存着各内生变量的脉冲响应,其长度(期数)由命令的选项irf指定。脉冲响应的命名规则为Variable_Name_Shock_Name。比如c_e表示变量 c 关于外生冲击 e 的脉冲响应。例如,直接运行c_e可以得到消费 C_t 对技术冲击 e 的脉冲响应图:
脉冲响应.jpg

(3) 选项数组 options_

选项数组options_储存着和模拟计算相关的各种细节型设定。初学者不必纠结。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,000评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,745评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,561评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,782评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,798评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,394评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,952评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,852评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,409评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,483评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,615评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,303评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,979评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,470评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,571评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,041评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,630评论 2 359