/*
 * Finds the ramsey optimal policy for the model of Gali chapter 6 (note that Galis figures are all annualized).
 */

var y_tilde pi_p pi_w omega_tilde omega_n omega y y_n r_n n a i v annualized_pi_p annualized_pi_w;
varexo epsilon_as epsilon_vs;

parameters beta sigma varphi alpha epsilon_p epsilon_w mu_p mu_w theta_p theta_w lambda_p lambda_w kappa_p kappa_w captheta psi_n_ya psi_n_omegaa rho_a sigma_epsilon_as rho_v sigma_epsilon_vs vartheta_y_n rho phi_p phi_w phi_y;

/*
 *For explanation of what is going on, see the GaliChpt6.mod code which
 *goes through this model.
 */

beta = 0.99;
sigma = 1;
varphi = 1;
alpha = 0.33;
epsilon_p = 6/5;
epsilon_w = 6/5;
theta_p = 0.66;
theta_w = 0.0001;
rho_a=0.9;
rho_v=0.5;
sigma_epsilon_as=1;
sigma_epsilon_vs=0.25;

phi_p=1.5;
phi_w=0;
phi_y=0;

rho=-log(beta);

mu_p=log(epsilon_p/(epsilon_p-1));
mu_w=log(epsilon_w/(epsilon_w-1));
captheta = (1-alpha)/(1-alpha+alpha*epsilon_p);
lambda_p = (1-theta_p)*(1-beta*theta_p)*captheta/theta_p;
lambda_w = (1-theta_w)*(1-beta*theta_w)/(theta_w*(1+epsilon_w*varphi));
kappa_p = alpha*lambda_p/(1-alpha);
kappa_w = lambda_w*(sigma+varphi/(1-alpha));
psi_n_ya = (1+varphi)/(sigma*(1-alpha)+varphi+alpha);
psi_n_omegaa = (1-alpha*psi_n_ya)/(1-alpha);
vartheta_y_n = (1-alpha)*(mu_p-log(1-alpha))/(sigma*(1-alpha)+varphi+alpha);


model;
pi_p=beta*pi_p(+1)+kappa_p*y_tilde+lambda_p*omega_tilde;
pi_w=beta*pi_w(+1)+kappa_w*y_tilde-lambda_w*omega_tilde;
omega_tilde=omega_tilde(-1)+pi_w-pi_p-(omega_n-omega_n(-1));
y_tilde=-(1/sigma)*(i-pi_p(+1)-r_n)+y_tilde(+1);
y_tilde=y-y_n;
y = a + (1-alpha)*n;
y_n=psi_n_ya*a+vartheta_y_n;
omega_tilde=omega-omega_n;
omega_n=log(1-alpha)+psi_n_omegaa*a-mu_p;
r_n=rho+sigma*psi_n_ya*(a(+1)-a);
a=rho_a*a(-1)+epsilon_as;
v=rho_v*v(-1)+epsilon_vs;
annualized_pi_p=4*pi_p;
annualized_pi_w=4*pi_w;
end;
/*
 * To compute the Ramsey optimal monetary policy we have to remove the 
 * Taylor rule from the baseline model
 * i=rho+phi_p*pi_p+phi_w*pi_w+phi_y*y_tilde+v;
 */

shocks;
var epsilon_as; stderr sigma_epsilon_as;
var epsilon_vs; stderr sigma_epsilon_vs;
end;

/*
 *Note, we cannot calculate the steady state as the model is incomplete due 
 *to missing the interest rate rule
 */ 

planner_objective 1/2*((sigma+(varphi+alpha)/(1-alpha))*y_tilde^2 + epsilon_p/lambda_p*pi_p^2 + epsilon_w*(1-alpha)/epsilon_w*pi_w^2);

ramsey_policy(irf=12, planner_discount=0.99) y_tilde annualized_pi_p annualized_pi_w omega;