% Mod file to solve NK model with Ricardian and non-Ricardian HHs

close all;

%----------------------------------------------------------------
% 1. Defining variables
%----------------------------------------------------------------

var Cr Cn C Nr Nn L W R Rk Lambda K MC Gamma_1 Gamma_2 Y Pstar_P Pi sp G B_P Pr eps_a eps_c eps_l eps_R G_Y B_Y; 
varexo eta_g eta_a eta_R eta_l eta_c;

parameters delta eta zeta lambda theta_p theta_w PHI alpha beta rho_R phi_pi phi_y rho_a rho_r rho_l rho_c sigma_a sigma_g sigma_r sigma_l sigma_c GY_ss psi k upsilon tau_w rho_b rho_g tau_c tau_k tau_p nu Cr_ss Cn_ss C_ss Nr_ss Nn_ss L_ss W_ss R_ss Rk_ss Lambda_ss K_ss MC_ss Gamma_1_ss Gamma_2_ss Y_ss Pstar_P_ss Pi_ss sp_ss G_ss B_P_ss Pr_ss;

%----------------------------------------------------------------
% 2. Calibration
%----------------------------------------------------------------

load parameters;

set_param_value('delta' , delta);
set_param_value('nu',nu);
set_param_value('eta' , eta);
set_param_value('zeta' , zeta);
set_param_value('lambda' , lambda);
set_param_value('theta_p' , theta_p);
set_param_value('theta_w' , theta_w);
set_param_value('PHI' , PHI);
set_param_value('alpha' , alpha);
set_param_value('beta' , beta);
set_param_value('rho_R' , rho_R);
set_param_value('phi_pi' , phi_pi);
set_param_value('phi_y' , phi_y);
set_param_value('rho_a' , rho_a);
set_param_value('rho_b' , rho_b);
set_param_value('rho_r' , rho_r);
set_param_value('rho_c' , rho_c);
set_param_value('rho_l' , rho_l);
set_param_value('rho_g',rho_g);
set_param_value('sigma_a' , sigma_a);
set_param_value('sigma_g' , sigma_g);
set_param_value('sigma_r' , sigma_r);
set_param_value('sigma_c' , sigma_c);
set_param_value('sigma_l' , sigma_l);
set_param_value('psi' , psi);
set_param_value('k' , k);
set_param_value('upsilon' , upsilon);
set_param_value('tau_w',tau_w);
set_param_value('tau_c',tau_c);
set_param_value('tau_k',tau_k);
set_param_value('tau_p',tau_p);

set_param_value('GY_ss' , GY_ss);
set_param_value('B_P_ss' , B_P_ss);
set_param_value('Y_ss',Y_ss);
set_param_value('C_ss',C_ss);
set_param_value('L_ss',L_ss);
set_param_value('K_ss',K_ss); 
set_param_value('W_ss',W_ss);
set_param_value('R_ss',R_ss);
set_param_value('Rk_ss',Rk_ss);
set_param_value('MC_ss',MC_ss); 
set_param_value('Gamma_1_ss',Gamma_1_ss); 
set_param_value('Gamma_2_ss',Gamma_2_ss); 
set_param_value('Pr_ss',Pr_ss); 
set_param_value('Nr_ss',Nr_ss); 
set_param_value('Cr_ss',Cr_ss); 
set_param_value('Nn_ss',Nn_ss); 
set_param_value('Cn_ss',Cn_ss); 
set_param_value('Pi_ss',Pi_ss); 
set_param_value('Pstar_P_ss',Pstar_P_ss); 
set_param_value('sp_ss',sp_ss);
set_param_value('Lambda_ss',Lambda_ss); 
set_param_value('G_ss' , G_ss);

%----------------------------------------------------------------
% 3. Model
%----------------------------------------------------------------

model;
%-----------
% Ricardian
%-----------
((1-tau_w)/(1+tau_c))*W = (eps_l/eps_c)*Cr*(Nr)^upsilon;             % 1. Ricardian HH Intratemporal EE
1 = beta*R(+1)*(1-tau_w)*(eps_c(+1)/eps_c)*(Cr/Cr(+1))*Pi(+1)^(-1);  % 2. Ricardian HH EE
1 = beta*(1-tau_p)*(eps_c(+1)/eps_c)*(Cr/Cr(+1))*(1-delta+Rk(+1));   % 3. Ricardian HH, capital stock choice (interest rate determination)
Lambda = beta*(eps_c(+1)/eps_c)*(Cr/Cr(+1));                         % 4. Ricardian HH stochastic discount factor

%--------------
% Non Ricardian
%--------------
(1+tau_c)*Cn = (1-tau_w)*W*Nn;                                       % 5. Non-Ricardian HH BC
((1-tau_w)/(1+tau_c))*W = (eps_l/eps_c)*Cn*(Nn)^upsilon;             % 6. Non-Ricardian HH EE

%--------
% Firms
%--------
K(-1)/L = (alpha/(1-alpha))*W/Rk;                                   %   7. Capital to labour ratio
MC = eps_a*((Rk/alpha)^alpha)*(W/(1-alpha))^(1-alpha);              %   8. Margina cost
Gamma_1 = MC*Y + theta_p*Lambda(+1)*((Pi(+1))^zeta)*Gamma_1(+1);    %   9
Gamma_2 = Y + theta_p*Lambda(+1)*((Pi(+1))^(zeta-1))*Gamma_2(+1);   %   10
Pstar_P*Gamma_2 = (zeta/(zeta-1))*Gamma_1;                          %   11. Price setting
Pr = Y - L*W - K(-1)*Rk;                                            %   12. Profit

%-------------------------
% Aggregate Price Dynamics
%-------------------------
1 = (1-theta_p)*(Pstar_P)^(1-zeta)+theta_p*Pi^(zeta-1);             %   13. Inflation
sp = (1-theta_p)*Pstar_P^(-zeta)+theta_p*Pi^(zeta)*sp(-1);          %   14. Relative price dispersion

%-------------
%Government
%-------------
G + R*B_P(-1)/Pi = tau_w*W*L + tau_c*C + tau_k*Pr + tau_p*(1-delta+Rk)*K(-1) + B_P;     %   15. Government BC
log((G/Y)/GY_ss) = rho_b*log(B_P(-1)/B_P_ss) + eta_g;                                   %   16. Government spending rule

%-------------
% Central Bank
%-------------
R/R_ss = (Pi^phi_pi)*eps_R;                                         %   17. MP rule

%---------------------------------
% Market clearing and feasibility
%---------------------------------
Y = C+K-(1-delta)*K(-1)+G;                                          %   18. Aggregate Resource constraint
sp*Y = eps_a*K(-1)^(alpha)*L^(1-alpha);                             %   19. Goods market clearance
L = nu*Nn + (1-nu)*Nr;                                              %   20. Total labour
C = nu*Cn + (1-nu)*Cr;                                              %   21. Total Consumption
G_Y = G/Y;                                                          %   22. Government spending as percentahe of Y
B_Y = B_P/Y;                                                        %   23. Government debt as percentage of Y

%--------
% Shocks
%--------
log(eps_a) = rho_a*log(eps_a(-1))+eta_a;    % 24. Technology shock
log(eps_R) = rho_r*log(eps_R(-1))+eta_R;    % 25. Monetary Policy      
log(eps_l) = rho_l*log(eps_l(-1))+eta_l;    % 26. Labour            
log(eps_c) = rho_c*log(eps_c(-1))+eta_c;    % 27. Consumption       
end;


%----------------------------------------------------------------
% 4. Steady State
%----------------------------------------------------------------

initval;

Cr = Cr_ss;
Cn = Cn_ss;
C = C_ss;
Nr = Nr_ss;
Nn = Nn_ss;
L = L_ss;
W = W_ss;
R = R_ss;
Rk = Rk_ss;
Lambda = Lambda_ss;
K = K_ss;
MC = MC_ss;
Gamma_1 = Gamma_1_ss;
Gamma_2 = Gamma_2_ss;
Y = Y_ss;
Pstar_P = Pstar_P_ss;
Pi = Pi_ss;
sp = sp_ss;
G = G_ss;
B_P = B_P_ss;
Pr = Pr_ss;

eps_a=1; 
eps_R=1;
eps_l=1;
eps_c=1;

end;

resid(1);
steady(solve_algo=3,maxit=100000);
check;

%----------------------------------------------------------------
% 5. Shocks
%----------------------------------------------------------------

shocks;
var eta_g = sigma_g^2;
var eta_a = sigma_a^2;
var eta_R = sigma_r^2;
var eta_l = sigma_l^2;
var eta_c = sigma_c^2;
end;

%----------------------------------------------------------------
% 6. Solve
%----------------------------------------------------------------

stoch_simul(hp_filter = 1600, order=1, irf=80);

%----------------------------------------------------------------
% 7. Output
%----------------------------------------------------------------

output = Y_eta_g;