From 1ce2ad22c5ac26cef5f6709c8a8481cb71020c9d Mon Sep 17 00:00:00 2001 From: Johannes Pfeifer Date: Fri, 13 Nov 2020 14:29:12 +0100 Subject: [PATCH] Add example for user-defined steady state file Closes https://git.dynare.org/Dynare/dynare/-/issues/1576 --- doc/manual/source/examples.rst | 8 +- examples/Ramsey_steady_file.mod | 119 ++++++++++++++++++++++ examples/Ramsey_steady_file_steadystate.m | 79 ++++++++++++++ 3 files changed, 205 insertions(+), 1 deletion(-) create mode 100644 examples/Ramsey_steady_file.mod create mode 100644 examples/Ramsey_steady_file_steadystate.m diff --git a/doc/manual/source/examples.rst b/doc/manual/source/examples.rst index 457086877..471dd4209 100644 --- a/doc/manual/source/examples.rst +++ b/doc/manual/source/examples.rst @@ -61,4 +61,10 @@ description, please refer to the comments inside the files themselves. File demonstrating how to conduct optimal policy experiments in a simple New Keynesian model either under commitment (Ramsey) or using - optimal simple rules (OSR) \ No newline at end of file + optimal simple rules (OSR) + +``Ramsey_steady_file.mod`` + + File demonstrating how to conduct optimal policy experiments in a + simple New Keynesian model under commitment (Ramsey) with a user-defined + conditional steady state file \ No newline at end of file diff --git a/examples/Ramsey_steady_file.mod b/examples/Ramsey_steady_file.mod new file mode 100644 index 000000000..1d8db31a8 --- /dev/null +++ b/examples/Ramsey_steady_file.mod @@ -0,0 +1,119 @@ +/* + * This file replicates the model studied in: + * Lawrence J. Christiano, Roberto Motto and Massimo Rostagno (2007): + * "Notes on Ramsey-Optimal Monetary Policy", Section 2 + * The paper is available at http://faculty.wcas.northwestern.edu/~lchrist/d16/d1606/ramsey.pdf + * + * Notes: + * - This mod-files allows to simulate a simple New Keynesian Model with Rotemberg price + * adjustment costs under fully optimal monetary under commitment (Ramsey) + * + * - This files shows how to use a userd-defined conditional steady state file in the Ramsey case. It takes + * the value of the defined instrument R as given and then computes the rest of the steady + * state, including the steady state inflation rate, based on this value. The initial value + * of the instrument for steady state search must then be defined in an initval-block. + * + * This implementation was written by Johannes Pfeifer. + * + * If you spot mistakes, email me at jpfeifer@gmx.de + * + * Please note that the following copyright notice only applies to this Dynare + * implementation of the model. + */ + +/* + * Copyright (C) 2019 Dynare Team + * + * This is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * It is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * For a copy of the GNU General Public License, + * see . + */ + + +var C $C$ (long_name='Consumption') + pi $\pi$ (long_name='Gross inflation') + h $h$ (long_name='hours worked') + Z $Z$ (long_name='TFP') + R $R$ (long_name='Net nominal interest rate') + log_C ${\ln C}$ (long_name='Log Consumption') + log_h ${\ln h}$ (long_name='Log hours worked') + pi_ann ${\pi^{ann}}$ (long_name='Annualized net inflation') + R_ann ${R^{ann}}$ (long_name='Annualized net nominal interest rate') + r_real ${r^{ann,real}}$ (long_name='Annualized net real interest rate') + y_nat ${y^{nat}}$ (long_name='Natural (flex price) output') + y_gap ${r^{gap}}$ (long_name='Output gap') +; + +varexo epsilon ${\varepsilon}$ (long_name='TFP shock') + ; + +parameters beta ${\beta}$ (long_name='discount factor') + theta ${\theta}$ (long_name='substitution elasticity') + tau ${\tau}$ (long_name='labor subsidy') + chi ${\chi}$ (long_name='labor disutility') + phi ${\phi}$ (long_name='price adjustment costs') + rho ${\rho}$ (long_name='TFP autocorrelation') + ; + +beta=0.99; +theta=5; +phi=100; +rho=0.9; +tau=0; +chi=1; + +model; + [name='Euler equation'] + 1/(1+R)=beta*C/(C(+1)*pi(+1)); + [name='Firm FOC'] + (tau-1/(theta-1))*(1-theta)+theta*(chi*h*C/(exp(Z))-1)=phi*(pi-1)*pi-beta*phi*(pi(+1)-1)*pi(+1); + [name='Resource constraint'] + C*(1+phi/2*(pi-1)^2)=exp(Z)*h; + [name='TFP process'] + Z=rho*Z(-1)+epsilon; + [name='Definition log consumption'] + log_C=log(C); + [name='Definition log hours worked'] + log_h=log(h); + [name='Definition annualized inflation rate'] + pi_ann=4*log(pi); + [name='Definition annualized nominal interest rate'] + R_ann=4*R; + [name='Definition annualized real interest rate'] + r_real=4*log((1+R)/pi(+1)); + [name='Definition natural output'] + y_nat=exp(Z)*sqrt((theta-1)/theta*(1+tau)/chi); + [name='output gap'] + y_gap=log_C-log(y_nat); +end; + +initval; + R=1/beta-1; +end; + +shocks; + var epsilon = 0.01^2; +end; + +//use Ramsey optimal policy + +//define planner objective, which corresponds to utility function of agents +planner_objective log(C)-chi/2*h^2; + +//set up Ramsey optimal policy problem with interest rate R as the instrument,... +// defining the discount factor in the planner objective to be the one of private agents +ramsey_model(instruments=(R),planner_discount=beta,planner_discount_latex_name=$\beta$); + +//conduct stochastic simulations of the Ramsey problem +stoch_simul(order=1,irf=20,periods=500) pi_ann log_h R_ann log_C Z r_real; +evaluate_planner_objective; + diff --git a/examples/Ramsey_steady_file_steadystate.m b/examples/Ramsey_steady_file_steadystate.m new file mode 100644 index 000000000..c5b484487 --- /dev/null +++ b/examples/Ramsey_steady_file_steadystate.m @@ -0,0 +1,79 @@ +function [ys,params,check] = Ramsey_steady_file_steadystate(ys,exo,M_,options_) +% function [ys,params,check] = Ramsey_steady_file_steadystate(ys,exo,M_,options_) +% computes the steady state for the Ramsey_steady_file.mod, conditional on +% the instrument value provided +% +% Inputs: +% - ys [vector] vector of initial values for the steady state of +% the endogenous variables +% - exo [vector] vector of values for the exogenous variables +% - M_ [structure] Dynare model structure +% - options [structure] Dynare options structure +% +% Output: +% - ys [vector] vector of steady state values for the the endogenous variables +% - params [vector] vector of parameter values +% - check [scalar] set to 0 if steady state computation worked and to +% 1 of not (allows to impose restrictions on parameters) + +% Copyright (C) 2020 Dynare Team +% +% This file is part of Dynare. +% +% Dynare is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Dynare is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Dynare. If not, see . + +% read out parameters to access them with their name +beta=NaN; %make parameter known to Matlab function, prevents crashes due to Matlab function with same name; + %will be overwritten next + +NumberOfParameters = M_.param_nbr; +for ii = 1:NumberOfParameters + paramname = M_.param_names{ii}; + eval([ paramname ' = M_.params(' int2str(ii) ');']); +end + +% read in instrument values +for ii = 1:size(options_.instruments,1) + eval([options_.instruments{ii} ' = ys(strmatch(options_.instruments{ii},M_.endo_names,''exact'')) ;']); +end +% initialize indicator +check = 0; + + +%% Enter model equations here + + Z=0; + pi=(R+1)*beta; + C=sqrt((1+1/theta*((1-beta)*(pi-1)*pi-(tau-1/(theta-1))*(1-theta)))/(chi*(1+phi/2*(pi-1)^2))); + h=C*(1+phi/2*(pi-1)^2); + log_C=log(C); + log_h=log(h); + pi_ann=4*log(pi); + R_ann=4*R; + r_real=4*log((1+R)/pi); + y_nat=sqrt((theta-1)/theta*(1+tau)/chi); + y_gap=log_C-log(y_nat); + +%% end own model equations + +params=NaN(NumberOfParameters,1); +for iter = 1:length(M_.params) %update parameters set in the file + eval([ 'params(' num2str(iter) ') = ' M_.param_names{iter} ';' ]) +end + +NumberOfEndogenousVariables = M_.orig_endo_nbr; %auxiliary variables are set automatically +for ii = 1:NumberOfEndogenousVariables + varname = M_.endo_names{ii}; + eval(['ys(' int2str(ii) ') = ' varname ';']); +end