此文内容为《动态随机一般均衡(DSGE)模型》的笔记,李向阳老师著,清华大学出版社出版。
我只将个人会用到的知识作了笔记,并对教材较难理解的部分做了进一步阐述。为了更易于理解,我还对教材上的一些部分(包括代码和正文)做了修改。
仅供学习参考,请勿转载,侵删!
第3章 · Dynare基本应用(2)
上一篇文章已经向大家介绍了如何在Dynare中编写一个完整的模型文件。下面的3.4 内生变量的表达形式、3.5 Dyanre文件的预编译和运行原理、3.6 Dynare的解的表示、3.7 求解结果分析和调用会介绍一些稍微技术性的问题。除了3.4和3.7以外,对初学者而言并非十分重要。
3.4 内生变量的表达形式:level or log-level
模型均衡条件的输入是Dynare编程的一个核心,因为均衡条件定义了整个模型。而多数情形下,均衡条件是参数和内生变量的非线性组合。
一般来说,内生变量的表达形式有3种:
水平形式(
):即变量本身
对数水平形式(
):以对数形式进入模型文件
离差形式(
):线性形式
3.4.1 离差形式
教材的1.1.2 线性化与对数线性化介绍了内生变量的离差形式。一阶线性是学习DSGE的良好出发点,但并不建议对每一个模型的均衡条件都进行线性化,然后输入到模型文件中,原因有:
手动线性化每一个均衡条件极其容易出错
Dyanre可以帮你完成线性化,只需要在求解阶数设定
order=1
就可以了
下面着重介绍对数水平形式。
3.4.2 对数水平形式
对数水平形式对于脉冲响应图形的显示为重要,一般推荐在实际研究中使用该形式。下面通过第3.1节的例子来简单解释对数水平形式的具体内涵和使用方法。以为例:
进行如下等价变形:
如果定义3个新变量为水平变量的对数,即对数水平变量(添加字母表示对数变量):
(没有 的原因是它本身就是对数水平的)那么上述均衡条件可以进一步表示为:
对比和
不难发现,在实际操作中,只需要将相应的水平变量替换为
的形式,就可以完成从水平变量到对数变量的转变。此时,在
源代码 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);
···
需要注意的是,虽然这个时候变量的名称相同,但数学意义已经从水平变量 变成了对数水平
。这可以理解为原来应该是
的地方现在需要取指数
才能变成原来的样子,所以现在的
应该变成了
,也就是对数水平。
在将所有均衡条件都改为对数水平后,Dynare输出的稳态值是对数水平的稳态值而非水平变量的稳态值;变量之间的相关系数变成了对数水平变量之间的相关系数而非水平变量;模拟的样本也将是对数水平的变量。这些在使用的时候都必须注意。
使用对数水平的意义就在于,使得脉冲响应图形变成了对稳态偏离的百分比,属于相对偏离(具体推导请参考教材P131);而水平变量刻画的偏离是具体的偏离值,属于绝对偏离。相对偏离使得脉冲响应图消除了量纲的影响,使得图形之间不会出现比例不协调的问题。
值得一提的是:
虽然变量的表达形式发生了变化,但是均衡条件的结构没有发生变化,从而不会改变模型的内涵和变量的变化趋势,只有变量本身和结果的解释方法发生了变化
并非所有变量都合适取对数,如果某些变量的稳态为负值,一般不能取对数
某些比率变量,如利率,在净值(net形式)下不宜取对数,只有在总值(gross形式)下才可以取对数,否则没有经济内涵
3.5 Dynare文件的预编译和运行原理
Dynare的模型文件使用Dynare语言编写的*.mod
文件,只有Dyanre才能读懂,Matlab无法直接处理。虽然模型文件最终的执行是依靠Matlab,但是必须经过Dynare的预处理之后,才能够形成Matlab能读懂的*.m
文件供其运行。
3.5.1 Dynare文件的预编译和运行原理
在编写完模型文件后,就是编译并运行模型,求解模型的最终目标是求解决策函数。模型文件的预处理都交给Dynare的预处理器(Preprocessor)完成,它是Dynare的编译器,包含了多个组成部分。其基本流程如下:
如果模型含有宏命令(在“6.5 Dynare宏命令变成示例”讨论),会先使用宏处理器,生成不含宏命令的模型文件
使用解析器对模型文件进行编译,形成较为形象、表征模型的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:辅助变量文件,即模型中出现
或
等情形时会生成的文件
初学者一般不需要纠结。
3.6 Dynare的解的表示
求解完成后,Dynare的最终计算结果会出现在Matlab的屏幕上,包含求解结果信息(即政策函数与转换方程)。同时,Dynare也会按照一定的规则将求解结果储存构数组中。本节将使用3.1节的RBC模型来讲述Dynare的一阶和二阶求解表示及其后续调用。
这里只介绍一阶解的表示方法,二阶解在表示方法的本质上是相同的,请参考教材
3.6.1 一阶解表示
Dynare求解的最根本的目的就是找到模型的政策函数。前文(参考教材的头几章)已经提到,Dynare关于一阶近似解有如下的经典表达形式:
假设模型的内生变量个数为 ,状态变量的个数为
,外生冲击的个数为
,根据《Dynare Reference Manual》,有:
表示内生变量的稳态值,为
行
列向量,储存在
oo_.dr.ys
中表示状态变量的系数矩阵,为
行
列矩阵,储存在
oo_.dr.ghx
中表示外生冲击的系数矩阵,为
行
列矩阵,储存在
oo_.dr.ghu
中
根据表述,以3.1节的RBC模型为例,内生变量的个数
,状态变量的个数
(参考
,状态变量个数是
混合变量
和后向变量
之和,即出现了项的变量的数量),外生冲击的个数
。则根据变量声明的顺序和Matlab的运行结果,解的表示应该是:
如果进一步观察Dynare在Matlab结果输出的解的表示,会发现上述由表示得到的结果
与Matlab输出的结果完全一致(注意:本程序跑出来的结果与教材给的计算结果
有所出入,但除
外并无较大误差,原因不明):
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
和 k(-1)
的形式
在Dynare中,如果变量均以声明顺序排序,那么 存储在
oo_.dr.ghx(oo_.dr.inv_order_var,:)
中,而 则存储在
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_
、oo
、options_
这三个结构数组中。为了方便调用,Dynare会将这些数组以.mat
的形式保存在硬盘上。
(1) 模型信息数组M_
数组M_
几乎保存了所有模型有关的基本解析信息,比较常用的如表3.3所示:
(2) 计算和模拟结果数组oo_
模型计算的大部分结果都被储存在oo_
中,教材称之为“结果数组”,较为常用的如表3.4所示:
下面是对表3.4中各个字段的解释(请在运行“”最后的代码后试验下面的代码):
-
oo_.exo_simul
储存着外生冲击的模拟样本(或称为模拟路径)。模型样本一般是从正态分布中随机抽取,均值为0,方差由外生冲击模块指定。一般情况下,外生冲击的稳态为0,从而oo_.exo_steady_state
一般为0向量。在Matlab窗口中运行plot(oo_.exo_simul)
,有:
而运行oo_.exo_steady_state
则有
>> oo_.exo_steady_state
ans =
0
-
oo_.endo_simul
储存着内生变量的模拟路径,同时以个内生变量的名称为数组的名称为数组名称。请运行oo_.endo_simul(1,:)
,可以得到:
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
则储存着内生变量之间的相关系数,具体含义如下:
其中, 是自相关数组中的第
个自相关矩阵,表示滞后阶数。默认情况下最大滞后阶数为5阶,也就是说自相关数组中默认有5个自相关矩阵。
、
分别表示第
、
个内生变量(以声明顺序排序)。比如,运行
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
可以得到消费对技术冲击
的脉冲响应图:
(3) 选项数组 options_
选项数组options_
储存着和模拟计算相关的各种细节型设定。初学者不必纠结。