求解非线性转移路径:存在零利率下限的前瞻性指引(McKay,Nakamura & Steinsson,2016)

在这个应用中,我们求解一个单一资产的异质性主体新凯恩斯模型(McKay,Nakamura & Steinsson,2016)。这篇论文主要研究货币政策在存在零利率下限(即名义利率不能低于零)时的前瞻性指引作用。在文章中,对家庭贴现率的正向冲击会引发流动性陷阱;前瞻性指引是指在名义利率不再受到零下限约束时,中央银行许诺延长零利率的时限。

这个应用展现了工具包求解高度非线性模型的能力。当经济体处于流动性陷阱时,均衡经济系统与常规情况很不相同,这使得采用传统方法求解模型非常困难。

我们采用和原文相同的数学符号和参数设定。

模型

家庭问题

每个家庭成员在劳动生产率 \(e\) 和债券持有 \(b\) 上存在异质性。其中,劳动生产率的变化服从一个马尔科夫过程。家庭成员求解如下的贝尔曼方程:

\[\begin{split} V_t(e,b) = \max_{c,n,b'} \frac{c^{1-\gamma}}{1-\gamma} - \chi \frac{n^{1+1/\nu}}{1+1/\nu}+ \beta_t \mathbb{E}[V_{t+1}(e',b')|e] \\ s.t. \quad c+\frac{b'}{1+r_t}=b + w_ten - \tau_t \bar{\tau}(e) +D_t \\ b' \geq 0,n\geq 0 \end{split}\]

其中,\(r_t\) 表示实际利率,\(w_t\) 表示工资率,\(\tau_t\) 表示边际税率,\(D_t\) 表示来自企业的总利润。\(\bar{\tau}(e)\) 的取值(0或1)表示拥有生产率 \(e\) 的劳动者是否被征税。家庭成员选择最优的消费 \(c\),劳动供给 \(n\),债券持有 \(b'\),并且受到借贷约束 \(b' \geq 0\)

个体状态变量的分布由 \(\Gamma_t\) 表示。个体的决策规则由 \(g_{c,t}, g_{n,t}, g_{b',t}\) 表示。

新凯恩斯设定

部分垄断竞争的厂商雇佣劳动力生产异质性中间投入品,这些中间投入品会被竞争性厂商用于生产最终消费品。最终消费品的生产函数是 CES。中间投入品的价格存在粘性,即每期只有一部分的中间品生产商可以调整价格。这种标准的新凯恩斯模型设定可以推导出一个标准的菲利普斯曲线: $\( Y_tS_t = z_t N_t \\ S_{t} =\theta (\frac{p_{t}^*}{P_{t}})^{\mu / (1-\mu)}+(\frac{1}{1+\pi_{t}})^{\mu / (1-\mu)} (1-\theta)S_{t-1} \\ 1+\pi_{t} =( \frac{1-\theta}{1- \theta( \frac{p_{t}^*}{P_{t}})^{\frac{1}{1-\mu}}})^{1-\mu} \\ \frac{p_t^*}{P_t} = \frac{P_t^A}{P_t^B} \\ P_t^A =\mu\frac{w_{t}}{z_{t}}Y_{t} + (1-\theta)\beta (1+\pi_{t+1})^{-\mu/(1-\mu)}P_{t+1}^A \\ P_t^B =Y_{t} + (1-\theta)\beta (1+\pi_{t+1})^{-1/(1-\mu)}P_{t+1} \)$

其中,\(\mu\) 表示边际替代弹性,\(\theta\) 表示每一期中间产品生产商能够调整价格的概率。\(Y_t\) 是总产出。\(S_t\) 是价格的离散程度。\(N_t\) 是劳动力总需求。\(z_t\) 是外生的劳动生产率。\(\pi_t\) 是通货膨胀率。\(p_t^*\) 是能够调整价格的厂商的最优价格。\(P_t^A,P_t^B\) 是用于求解模型的辅助变量。

中央银行依照泰勒规则设置名义利率,并且受到名义利率不能低于零的约束:

\[ i_t = \max\{i_{0} + \phi \pi_t,0\} \]

当不存在宏观不确定性时,费雪方程成立:

\[ 1+r_t=\frac{1+i_t}{1+\pi_{t+1}} \]

政府部门通过调整税率 \(\tau_t\) 来满足外生的政府支出和债券的利息支出。

\[ \tau_t =\frac{B_t + G_t - \frac{B_{t+1}}{1+r_{t}}}{\int \bar{\tau}(e) \ \mathrm{d}\Gamma_t} \]

其中,\(B_t\) 表示期初的政府债券规模;\(G_t\) 表示政府开支总额。

在基准模型中,财政支出的规则是政府债券总额不变:\(B_{t+1}=\overline{B}\)

市场出清条件

债券市场出清条件:

\[ B_{t+1}=\int g_{b',t}(e,b) \ \mathrm{d}\Gamma_t \]

劳动力市场出清条件:

\[ N_t = \int eg_{n,t}(e,b) \ \mathrm{d}\Gamma_t \]

商品市场出清条件:

\[ \int g_{c,t}(e,b) \ \mathrm{d} \Gamma_t + G_t = Y_t \]

均衡的定义

给定家庭状态的初始分布 \(\Gamma_0\),序列竞争均衡由以下变量刻画:(1)家庭个体状态变量的分布函数:\(\{\Gamma_t\}_{t=0}^{\infty}\);(2)家庭的值函数与策略函数 \(\{V_t,g_{c,t},g_{n,t},g_{b',t}\}_{t=0}^{\infty}\); (3) 总体数量和价格 \(\{w_t,Y_t,S_t,N_t,D_t,\pi_t,\frac{p_t^*}{P_t},P_t^A,P_t^B,r_t,i_t,\tau_t\}_{t=0}^{\infty}\) 。这些序列满足如下条件:

\[\begin{split} Y_t S_t= z_t N_t \\ D_t=Y_t-w_tN_t \\ S_{t} =\theta (\frac{p_{t}^*}{P_{t}})^{\mu / (1-\mu)}+(\frac{1}{1+\pi_{t}})^{\mu / (1-\mu)} (1-\theta)S_{t-1} \\ 1+\pi_{t} =( \frac{1-\theta}{1- \theta( \frac{p_{t}^*}{P_{t}})^{\frac{1}{1-\mu}}})^{1-\mu} \\ \frac{p_t^*}{P_t} = \frac{P_t^A}{P_t^B} \\ P_t^A =\mu\frac{w_{t}}{z_{t}}Y_{t} + (1-\theta)\beta (1+\pi_{t+1})^{-\mu/(1-\mu)}P_{t+1}^A \\ P_t^B =Y_{t} + (1-\theta)\beta (1+\pi_{t+1})^{-1/(1-\mu)}P_{t+1}^B \\ 1+r_t=\frac{1+i_t}{1+\pi_{t+1}} \\ i_t = \max\{i_{0} + \phi \pi_t,0\} \\ \tau_t =\frac{B_t + G_t - \frac{B_{t+1}}{1+r_{t}}}{\int 1(e=e_{High}) \Gamma_t} \\ N_t = \int eg_{n,t}(e,b) d\Gamma_t \\ \overline{B}=\int g_{b',t}(e,b) d\Gamma_t \end{split}\]

商品市场出清条件满足瓦尔拉斯定理。这个系统还可以进一步简化,参见 hmod 文件。

hmod 文件

模型可以由 hmod 文件表示,hank1.hmod,如下所示:

 1parameters beta gamma nu chi w r D tau;
 2beta = 0.986;
 3gamma = 2;
 4nu = 0.5;
 5chi = 1;
 6
 7var_shock e taxed;
 8shock_trans = [
 9    0.9663    0.0334    0.0003
10    0.0167    0.9666    0.0167
11    0.0003    0.0334    0.9663
12    ];
13e = [0.49008,1,2.0405];
14taxed = [0, 0, 1];
15
16var_state b;
17b_min = 0.0;
18b_max = 50.0;
19b_pts = 201;
20b_shift = 0.1;
21b = exp(linspace(log(b_min+b_shift),log(b_max+b_shift),b_pts)) - b_shift;
22
23var_pre_vfi budget_n1;
24budget_n1 = b + w*e - tau*taxed + D;
25
26var_policy c bp n;
27initial c budget_n1;
28initial bp 0;
29initial n 1;
30
31var_aux ne;
32
33vfi;
34    u = c^(1-gamma)/(1-gamma) - chi*n^(1+1/nu)/(1+1/nu);
35    Tv = u + beta*EXPECT(v(bp));
36    c + bp/(1+r) == b + w*e*n - tau*taxed + D;
37    ne = n*e;
38    c >= 1e-8;
39    bp >= b_min;
40    n >= 0;
41end;
42
43var_agg Y pii w S PA PB;
44mu = 1.2;           % markup
45theta = 0.15;       % prob staggered price
46pop_taxed = 0.25;
47ii0 = 0.005;
48G = 0;
49phi = 1.5;
50z = 1.0;            % labor productivity
51
52% bond level affects steady state interest rate
53% see how it is calibrated in model_cali
54B = 5.6;
55
56% initial
57N = 1;
58
59var_agg_shock beta m_shock;
60m_shock = 0.0;
61
62model;
63    N = Y*S / z;
64    D = Y-w*N;
65    ii = max(ii0 + phi*pii + m_shock,0);
66    r = (1+ii) / (1+pii(+1)) - 1;
67    tau = (B+G-B/(1+r)) / pop_taxed;
68    pstar = PA/PB;
69    
70    S == theta*pstar^(mu/(1-mu)) + (1/(1+pii))^(mu/(1-mu))*(1-theta)*S(-1);
71    1+pii == ( (1-theta)/(1-theta*(pstar)^(1/(1-mu))) )^(1-mu);
72    PA == mu*w/z*Y + (1-theta)*beta*(1+pii(+1))^(-mu/(1-mu))*PA(+1);
73    PB == Y + (1-theta)*beta*(1+pii(+1))^(-1/(1-mu))*PB(+1);
74    N == ne;
75    B == bp;
76end;
77
78% a different block for calibration; arguments to overwrite aggregate unknowns (var_agg)
79model_cali(N, B);
80    Y = z*N;
81    w = z/mu;
82    D = Y - w*N;
83    r = ii0;
84    tau = (B+G-B/(1+r)) / pop_taxed;
85
86    N == ne;
87    B == bp;
88    
89    PA = mu*w/z*Y / (1-(1-theta)*beta);
90    PB = Y / (1-(1-theta)*beta);
91    S = 1;
92    pii = 0;
93end;

均衡系统现在包含了非平凡的市场出清条件,但是仍然可以被表示成方程组。在 var_agg 中定义所有未知数的时间序列,并且在 model 模块中用 “==” 定义相同数量的方程 (见下面代码中的高亮部分):

43var_agg Y pii w S PA PB;
44mu = 1.2;           % markup
45theta = 0.15;       % prob staggered price
46pop_taxed = 0.25;
47ii0 = 0.005;
48G = 0;
49phi = 1.5;
50z = 1.0;            % labor productivity
51
52% bond level affects steady state interest rate
53% see how it is calibrated in model_cali
54B = 5.6;
55
56% initial
57N = 1;
58
59var_agg_shock beta m_shock;
60m_shock = 0.0;
61
62model;
63    N = Y*S / z;
64    D = Y-w*N;
65    ii = max(ii0 + phi*pii + m_shock,0);
66    r = (1+ii) / (1+pii(+1)) - 1;
67    tau = (B+G-B/(1+r)) / pop_taxed;
68    pstar = PA/PB;
69    
70    S == theta*pstar^(mu/(1-mu)) + (1/(1+pii))^(mu/(1-mu))*(1-theta)*S(-1);
71    1+pii == ( (1-theta)/(1-theta*(pstar)^(1/(1-mu))) )^(1-mu);
72    PA == mu*w/z*Y + (1-theta)*beta*(1+pii(+1))^(-mu/(1-mu))*PA(+1);
73    PB == Y + (1-theta)*beta*(1+pii(+1))^(-1/(1-mu))*PB(+1);
74    N == ne;
75    B == bp;
76end;

可以定义一个不同于主 model 模块的替代模型块。例如,脚本文件中的以下模块定义了用于校准的块,它采用不同的未知数和不同的方程组。校准在这里处于稳态,因此我们可以将校准系统简化为总劳动力和债券持有的方程,所有其他变量都是两个未知数的简单函数,或者由稳态条件隐含。

79model_cali(N, B);
80    Y = z*N;
81    w = z/mu;
82    D = Y - w*N;
83    r = ii0;
84    tau = (B+G-B/(1+r)) / pop_taxed;
85
86    N == ne;
87    B == bp;
88    
89    PA = mu*w/z*Y / (1-(1-theta)*beta);
90    PB = Y / (1-(1-theta)*beta);
91    S = 1;
92    pii = 0;
93end;

所有的 var_agg 都需要在声明之后进行正确的初始化,除非它们的值是由替代模块返回的 (即, 此处的 model_cali 模块)。关于如何通过传递解出的校准来求解主模型块,请参见下文。

使用工具箱

在解析完脚本文件之后,工具箱生成了 MATLAB 文件:solve_vfi.msolve_ss.msolve_trans_linear.msolve_trans_nonlinear.msolve_cali.m 以及其他可用于求解稳态、平稳分布、转移路径和替代系统 (在此处是用于校准) 的函数。生成文件的使用如下所示。

解析 .hmod 文件

解析 .hmod 文件

假设 hank1.hmod 已经位于工作文件夹中。在 MATLAB 中调用
clear_hans
hans hank1
Parsing...ok! Compiling dpopt_vfi Building with 'MinGW64 Compiler (C++)'. MEX completed successfully.
ans = struct with fields:
parameters: {'beta' 'gamma' 'nu' 'chi' 'w' 'r' 'D' 'tau'} var_shock: {'e' 'taxed'} var_state: 'b' var_pre_vfi: 'budget_n1' var_policy: {'c' 'bp' 'n'} var_aux: 'ne' var_agg: {'Y' 'pii' 'w' 'S' 'PA' 'PB'} var_agg_shock: {'beta' 'm_shock'} var_agg_params: {'G' 'theta' 'pop_taxed' 'phi' 'z' 'ii0' 'mu' 'B'} var_agg_assign: {'N' 'D' 'ii' 'r' 'tau' 'pstar'} var_agg_in_ind_params: {'w' 'D' 'r' 'tau' 'beta'} var_ind_in_eq: {'ne' 'bp'}
如上所示, HANS 解析了 hmod 文件,编译了 mex 文件,并且返回了一个描述模型的结构体。
第一行的 clear_hans 清空了所有之前生成的缓存文件。

求解静态均衡

调用生成的代码 solve_cali 用于校准
tic;
cali_rslt = solve_cali;
Evaluating at var_agg: 1, 5.6, VFI converged (metric_v) 0.00168503, (metric_pol) 0 in 476 iterations Range of b: 0, 32.3227 Equilbirium residual: -0.0405098, -0.323861, Iteration Line Search Func-count ||f(x)||^2 fnorm(x) Norm of Step Step Size Algorithm 0 0 1 1.065268e-01 3.263845e-01 Evaluating at var_agg: 1.0001, 5.6, VFI converged (metric_v) 8.03659e-05, (metric_pol) 0 in 216 iterations Range of b: 0, 32.3227 Equilbirium residual: -0.0404013, -0.323684, Evaluating at var_agg: 1, 5.60056, VFI converged (metric_v) 4.51514e-06, (metric_pol) 0 in 222 iterations Range of b: 0, 32.3227 Equilbirium residual: -0.0405116, -0.323222, Evaluating at var_agg: 1.03796, 5.8252, VFI converged (metric_v) 3.06396e-05, (metric_pol) 0 in 386 iterations Range of b: 0, 31.3304 Equilbirium residual: -4.0175e-06, 0.000127707, 1 1 4 1.632513e-08 1.277698e-04 2.283784e-01 1.000000e+00 Newton Evaluating at var_agg: 1.03796, 5.82509, VFI converged (metric_v) 4.45515e-06, (metric_pol) 0 in 140 iterations Range of b: 0, 31.3304 Equilbirium residual: -3.37884e-09, 1.08386e-08, 2 1 5 1.288908e-16 1.135301e-08 1.171250e-04 1.000000e+00 Broyden Evaluating at var_agg: 1.03796, 5.82509, VFI result reused Range of b: 0, 31.3304 Equilbirium residual: -3.37884e-09, 1.08386e-08,
fprintf('Time used for calibration at the steady state:\n');toc;
Time used for calibration at the steady state: Elapsed time is 1.122064 seconds.
cali_rslt.var_agg
ans = struct with fields:
N: 1.0380 B: 5.8251 beta: 0.9860 m_shock: 0 Y: 1.0380 w: 0.8333 D: 0.1730 r: 0.0050 tau: 0.1159 PA: 6.4111 PB: 6.4111 S: 1 pii: 0
如上所示,函数返回了一个描述校准静态均衡的结构体。

求解线性转移矩阵作为预热

我们求解了一个平凡的线性化转移路径,以得到个体总体变量关于参数的雅各比矩阵。
雅各比矩阵将应用于后续非线性转移路径的求解之中。
options = struct;
trans_linear_rslt = solve_trans_linear(cali_rslt, options);

求解流动性冲击的转移路径

流动性冲击提高了所有家庭的贴现因子。在新凯恩斯框架中,这是一个负向需求冲击,并且可能导致经济趋于零利率下限。
让我们按照原始文章生成流动性冲击。β 在 33 个时期内有小规模的提升。
T = 200;
beta_factor = 1.001638;
beta_t = cali_rslt.var_agg.beta*ones(1,T);
beta_t(1:33) = cali_rslt.var_agg.beta * beta_factor;
figure; plot(beta_t); title('beta')
我们随后输入流动性冲击,求解流动性冲击发生后的转移路径。
options = struct;
options.beta_t = beta_t;
options.trans_linear_rslt = trans_linear_rslt;
options.trans_solver = 'Newton';
tic;
trans_nonlinear_rslt_zlb = solve_trans_nonlinear(cali_rslt, cali_rslt, options);
Iteration Line Search Func-count ||f(x)||^2 fnorm(x) Norm of Step Step Size Algorithm 0 0 1 4.486206e+00 2.118066e+00 1 1 2 6.245582e-01 7.902899e-01 4.268511e+00 1.000000e+00 Newton 2 1 4 8.501378e-02 2.915712e-01 3.329662e+00 1.000000e+00 Newton 3 1 6 1.200015e-03 3.464123e-02 5.306648e-01 1.000000e+00 Newton 4 1 8 8.453417e-06 2.907476e-03 5.548852e-02 1.000000e+00 Newton 5 1 10 1.127025e-07 3.357119e-04 9.155388e-03 1.000000e+00 Newton 6 1 12 1.286371e-10 1.134183e-05 5.020893e-04 1.000000e+00 Newton
fprintf('Time used for solving the transition path after the liquidty shock:\n');toc;
Time used for solving the transition path after the liquidty shock: Elapsed time is 2.615578 seconds.
注意,我们在 trans_linear_rslt 中再次使用了与参数相关的个体总体变量的雅可比矩阵,将其传递给选项。我们也使用了 “Newton” 求解器。
我们现在查看转移路径。如下所示,流动性冲击确实触发了零利率下限,导致产出和通胀大幅下降。
varnames = {'Y','pii','ii'};
for i=1:length(varnames)
figure; hold on;
var = varnames{i};
plot(trans_nonlinear_rslt_zlb.var_agg_t.(var)(1:40),'-','LineWidth',2.0);
legend({'No Forward Guidance'},'FontSize',14,'Location','Best');
title(var);
end

求解具有流动性冲击与前瞻性指引的转移路径

如上所示,流动性冲击导致了一个持续 20 期的零下限。
前瞻指引承诺将名义利率在额外三个时期内设定为 0。这可以通过在前 23 个时期引入一个极度负向的泰勒规则冲击来实现,因为根据均衡条件的定义,名义利率是低于零的。
m_shock_t = zeros(1,T);
m_shock_t(1:23) = -100; % a large number make sure it's pegging
m_shock_t(24) = -0.00092; % this adjustment follows MNS's original paper
 
options = struct;
options.beta_t = beta_t;
options.m_shock_t = m_shock_t;
options.trans_linear_rslt = trans_linear_rslt;
options.HANS_x = trans_nonlinear_rslt_zlb.HANS_x;
options.trans_solver = 'Newton';
trans_nonlinear_rslt_zlb_and_fg = solve_trans_nonlinear(cali_rslt, cali_rslt, options);
Iteration Line Search Func-count ||f(x)||^2 fnorm(x) Norm of Step Step Size Algorithm 0 0 1 1.690161e-02 1.300062e-01 1 1 2 1.548295e-02 1.244305e-01 1.815699e+00 1.000000e+00 Newton 2 1 4 9.094189e-06 3.015657e-03 2.100678e-01 1.000000e+00 Newton 3 1 6 9.868972e-06 3.141492e-03 3.518881e-02 1.000000e+00 Newton 3 2 7 7.076167e-07 8.411996e-04 1.759440e-02 5.000000e-01 Newton 4 1 9 1.264677e-06 1.124578e-03 2.507298e-03 1.000000e+00 Newton 4 2 10 6.810113e-07 8.252341e-04 1.253649e-03 5.000000e-01 Newton 5 1 12 1.165918e-07 3.414554e-04 7.582783e-03 1.000000e+00 Newton 6 1 14 6.522481e-08 2.553915e-04 7.383555e-03 1.000000e+00 Newton 7 1 16 1.251368e-10 1.118645e-05 9.005057e-04 1.000000e+00 Newton
请注意,我们将之前求解的转移路径 HANS_x 传递到选项之中,作为求解带有前瞻性指引模型的预热。这并非强制需求,但可以更快速地求解模型。
接下来,我们比较了有无前瞻性指引情况下的转移路径。这复现了他们文章中的图 7 — 9。
varnames = {'Y','pii','ii'};
for i=1:length(varnames)
figure; hold on;
var = varnames{i};
plot(trans_nonlinear_rslt_zlb.var_agg_t.(var)(1:40),'-','LineWidth',2.0);
plot(trans_nonlinear_rslt_zlb_and_fg.var_agg_t.(var)(1:40),'--','LineWidth',2.0);
legend({'No Forward Guidance','With Forward Guidance'},'FontSize',14,'Location','Best');
title(var);
end