From 71fd7730f04e60cb1f1c230e6577cf3f3e9e891c Mon Sep 17 00:00:00 2001 From: Johannes Pfeifer Date: Mon, 31 Aug 2015 19:08:23 +0200 Subject: [PATCH] Add unit test for Ramsey policy that checks correctness with analytical results --- tests/Makefile.am | 1 + .../optimal_policy/Ramsey/Gali_commitment.mod | 197 ++++++++++++++++++ 2 files changed, 198 insertions(+) create mode 100644 tests/optimal_policy/Ramsey/Gali_commitment.mod diff --git a/tests/Makefile.am b/tests/Makefile.am index a639bf838..0eea42d1a 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -41,6 +41,7 @@ MODFILES = \ optimal_policy/Ramsey/ramsey_ex.mod \ optimal_policy/Ramsey/ramsey_ex_initval_AR2.mod \ optimal_policy/Ramsey/ramsey_ex_aux.mod \ + optimal_policy/Ramsey/Gali_commitment.mod \ optimal_policy/RamseyConstraints/test1.mod \ discretionary_policy/dennis_1.mod \ initval_file/ramst_initval_file.mod \ diff --git a/tests/optimal_policy/Ramsey/Gali_commitment.mod b/tests/optimal_policy/Ramsey/Gali_commitment.mod new file mode 100644 index 000000000..029b2b33c --- /dev/null +++ b/tests/optimal_policy/Ramsey/Gali_commitment.mod @@ -0,0 +1,197 @@ +/* + * This file implements the optimal monetary policy under commitment exercise + * in Jordi Galí (2008): Monetary Policy, Inflation, and the Business Cycle, + * Princeton University Press, Chapter 5.1.2 + * + * It demonstrates how to use the ramsey_policy command of Dynare. + * + * Notes: + * - all model variables are expressed in deviations from steady state, i.e. + * in contrast to to the chapter, both the nominal interest rate and + * natural output are not in log-levels, but rather mean 0 + * + * This implementation was written by Johannes Pfeifer. In case 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) 2015 Johannes Pfeifer + * + * 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 pi ${\pi}$ (long_name='inflation') + y_gap ${tilde y}$ (long_name='output gap') + y_nat ${y^{nat}}$ (long_name='natural output') + y ${y}$ (long_name='output') + r_e ${r^{e}}$ (long_name='efficient interest rate') + y_e ${y^{nat}}$ (long_name='efficient output') + x ${x}$ (long_name='welfare-relevant output gap') + r_nat ${r^{nat}}$ (long_name='natural interest rate') + r_real ${r^r}$ (long_name='real interest rate') + i ${i}$ (long_name='nominal interest rate') + n ${n}$ (long_name='hours worked') + m_growth_ann ${\Delta m}$ (long_name='money growth') + u ${u}$ (long_name='AR(1) cost push shock process') + a ${a}$ (long_name='AR(1) technology shock process') + r_real_ann ${r^{r,ann}}$ (long_name='annualized real interest rate') + i_ann ${i^{ann}}$ (long_name='annualized nominal interest rate') + r_nat_ann ${r^{nat,ann}}$ (long_name='annualized natural interest rate') + pi_ann ${\pi^{ann}}$ (long_name='annualized inflation rate') + p ${p}$ (long_name='price level') + ; + +varexo eps_a ${\varepsilon_a}$ (long_name='technology shock') + eps_u ${\varepsilon_u}$ (long_name='monetary policy shock'); + +parameters alppha ${\alppha}$ (long_name='capital share') + betta ${\beta}$ (long_name='discount factor') + rho_a ${\rho_a}$ (long_name='autocorrelation technology shock') + rho_u ${\rho_{u}}$ (long_name='autocorrelation cost push shock') + siggma ${\sigma}$ (long_name='log utility') + phi ${\phi}$ (long_name='unitary Frisch elasticity') + phi_y ${\phi_{y}}$ (long_name='output feedback Taylor Rule') + eta ${\eta}$ (long_name='semi-elasticity of money demand') + epsilon ${\epsilon}$ (long_name='demand elasticity') + theta ${\theta}$ (long_name='Calvo parameter') + ; +%---------------------------------------------------------------- +% Parametrization, p. 52 +%---------------------------------------------------------------- +siggma = 1; +phi=1; +phi_y = .5/4; +theta=2/3; +rho_u = 0; +rho_a = 0.9; +betta = 0.99; +eta =4; +alppha=1/3; +epsilon=6; + + + +%---------------------------------------------------------------- +% First Order Conditions +%---------------------------------------------------------------- + +model(linear); +//Composite parameters +#Omega=(1-alppha)/(1-alppha+alppha*epsilon); //defined on page 47 +#psi_n_ya=(1+phi)/(siggma*(1-alppha)+phi+alppha); //defined on page 48 +#lambda=(1-theta)*(1-betta*theta)/theta*Omega; //defined on page 47 +#kappa=lambda*(siggma+(phi+alppha)/(1-alppha)); //defined on page 49 +#alpha_x=kappa/epsilon; //defined on page 96 +#phi_pi=(1-rho_u)*kappa*siggma/(alpha_x)+rho_u; //defined on page 101 + +//1. Definition efficient interest rate, below equation (4) +r_e=siggma*(y_e(+1)-y_e); + +//2. Definition efficient output +y_e=psi_n_ya*a; + +//3. Definition linking various output gaps, bottom page 96 +y_gap=x+(y_e-y_nat); + +//4. New Keynesian Phillips Curve eq. (2) +pi=betta*pi(+1)+kappa*x + u; + +//5. Dynamic IS Curve eq. (4) +x=-1/siggma*(i-pi(+1)-r_e)+x(+1); + +//6. Definition natural rate of interest eq. (23) +r_nat=siggma*psi_n_ya*(a(+1)-a); + +//7. Definition real interest rate +r_real=i-pi(+1); + +//8. Natural output +y_nat=phi*a; + +//9. Definition output gap +y_gap=y-y_nat; + +//10. cost push shock, equation (3) +u=rho_u*u(-1)+eps_u; + +//11. TFP shock +a=rho_a*a(-1)+eps_a; + +//12. Production function (eq. 13) +y=a+(1-alppha)*n; + +//13. Money growth (derived from eq. (4)) +m_growth_ann=4*(y-y(-1)-eta*(i-i(-1))+pi); + +//14. Annualized nominal interest rate +i_ann=4*i; + +//15. Annualized real interest rate +r_real_ann=4*r_real; + +//16. Annualized natural interest rate +r_nat_ann=4*r_nat; + +//17. Annualized inflation +pi_ann=4*pi; + +//18. Definition price level +pi=p-p(-1); + +//19. Interest Rate Rule that implements optimal solution, eq. (10) +% i=r_e+phi_pi*pi; +end; + +%---------------------------------------------------------------- +% define shock variances +%--------------------------------------------------------------- + +shocks; +var eps_u = 1; +end; + +//planner objective using alpha_x expressed as function of deep parameters +planner_objective pi^2 +(((1-theta)*(1-betta*theta)/theta*((1-alppha)/(1-alppha+alppha*epsilon)))*(siggma+(phi+alppha)/(1-alppha)))/epsilon*y_gap^2; + +ramsey_policy(instruments=(i),irf=13,planner_discount=betta) x pi p u; + +verbatim; +%% Check correctness +Omega=(1-alppha)/(1-alppha+alppha*epsilon); %defined on page 47 +lambda=(1-theta)*(1-betta*theta)/theta*Omega; %defined on page 47 +kappa=lambda*(siggma+(phi+alppha)/(1-alppha)); %defined on page 49 +alpha_x=kappa/epsilon; %defined on page 96 +Psi=1/(kappa^2+alpha_x*(1-betta*rho_u)); %defined on page 99 +Psi_i=Psi*(kappa*siggma*(1-rho_u)+alpha_x*rho_u); %defined on page 101 +phi_pi=(1-rho_u)*kappa*siggma/(alpha_x)+rho_u; %defined on page 101 +a_parameter=alpha_x/(alpha_x*(1+betta)+kappa^2); +delta = (1-sqrt(1-4*betta*a_parameter^2))/(2*a_parameter*betta); + +p_irf(1)=delta/(1-delta*betta*rho_u); +x_irf(1)=-kappa*delta/(alpha_x*(1-betta*delta*rho_u)); +u_irf(1)=1; +for ii=2:options_.irf + u_irf(ii)=rho_u*u_irf(ii-1); + p_irf(ii)=delta*p_irf(ii-1)+delta/(1-delta*betta*rho_u)*u_irf(ii); + x_irf(ii)=delta*x_irf(ii-1)-kappa*delta/(alpha_x*(1-betta*delta*rho_u))*u_irf(ii); +end +pi_irf=diff([0 p_irf]); + +if max(abs(u_irf-oo_.irfs.u_eps_u))>1e-10 || max(abs(p_irf-oo_.irfs.p_eps_u))>1e-10 || max(abs(p_irf-oo_.irfs.p_eps_u))>1e-10 || max(abs(x_irf-oo_.irfs.x_eps_u))>1e-10 + error('IRFs do not match theoretical ones') +end