% Simple New Keynesian Model, 18/10/2012
% Non-linear 
% FOC test

%----------------------------------------------------------------
% 0. Housekeeping
%----------------------------------------------------------------



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

// Endogenous Variables
var c, llambda, R, ppi, W, mc, A, P, b, v, H, Y, Ystar, G, a, zzeta, g, Util, Welf;

// Shocks
varexo epsr epsa epsg;

// Paramters 
parameters nbeta ttau oomega eeta ggamma gbar ppsipi ppibar ppsiy rrhor rrhoa rrhog
  ssigmar ssigmaa ssigmag
  Y_SS ppi_SS b_SS c_SS R_SS v_SS a_SS g_SS A_SS H_SS Util_SS Welf_SS zzeta_SS
llambda_SS W_SS mc_SS P_SS G_SS Ystar_SS;

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

// Parameters

load param_nc;

set_param_value('nbeta',nbeta);
set_param_value('ttau',ttau);
set_param_value('oomega',oomega);
set_param_value('eeta',eeta);
set_param_value('ggamma',ggamma);
set_param_value('gbar',gbar);
set_param_value('ppibar',ppibar);
set_param_value('ppsipi',ppsipi);
set_param_value('ppsiy',ppsiy);
set_param_value('rrhor',rrhor);
set_param_value('rrhog',rrhog);
set_param_value('rrhoa',rrhoa);
set_param_value('ssigmar',ssigmar);
set_param_value('ssigmaa',ssigmaa);
set_param_value('ssigmag',ssigmag);

set_param_value('Y_SS',Y_SS);
set_param_value('ppi_SS',ppi_SS);
set_param_value('b_SS',b_SS);
set_param_value('c_SS',R_SS);
set_param_value('v_SS',v_SS);
set_param_value('a_SS',a_SS);
set_param_value('g_SS',g_SS);
set_param_value('A_SS',A_SS);
set_param_value('H_SS',H_SS);
set_param_value('Util_SS',Util_SS);
set_param_value('Welf_SS',Welf_SS);
set_param_value('zzeta_SS',zzeta_SS);
set_param_value('llambda_SS',llambda_SS);
set_param_value('W_SS',W_SS);
set_param_value('mc_SS',mc_SS);
set_param_value('P_SS',P_SS);
set_param_value('G_SS',G_SS);
set_param_value('Ystar_SS',Ystar_SS);


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

// model in logs 
model;

Util = c^(1-ttau)/(1-ttau) - H;
Welf = Util + nbeta*Welf(+1);

1/c^ttau - llambda;
llambda - nbeta*(llambda(+1)/A(+1))*(R/ppi(+1));
1 - llambda*W;
W - mc;
b - (eeta-1)/eeta *P*Y - nbeta*ggamma*(llambda(+1)/llambda)*(P/P(+1))*(ppi_SS/ppi(+1))^(1-eeta)*b(+1);
b - mc*Y - nbeta*ggamma*(llambda(+1)/llambda)*(ppi_SS/ppi(+1))^(-eeta)*b(+1);
1 - ggamma*(ppi_SS/ppi)^(1-eeta)-(1-ggamma)*P^(1-eeta);
G - zzeta*Y;
H - v*(c+G);
H - v*Y;
v - (1-ggamma)*P^(-eeta) - ggamma *(ppi_SS/ppi)^(-eeta) * v(-1);
Ystar - ((eeta-1)/eeta)^(1/ttau) * 1/(1-zzeta);
log(A) - oomega - a;
a - rrhoa*a(-1) - ssigmaa*epsa;
g - 1/(1-zzeta);
log(g) - (1-rrhog)*log(g_SS) - rrhog*log(g(-1))  - ssigmag*epsg;

// Monetary Policy Rule
(R(-1)/R_SS)^rrhor*((ppi/ppi_SS)^ppsipi*(Y/(((eeta-1)/eeta)^(1/ttau)*g))^ppsiy)^(1-rrhor)*exp(ssigmar*epsr) - R/R_SS;


end;

%----------------------------------------------------------------
% 4. Computation
%----------------------------------------------------------------

// Steady State
steady_state_model;
// Analytic Steady State
Y_SS = ((eeta-1)/eeta)^(1/ttau)*gbar;
ppi_SS = ppibar;
b_SS = (eeta-1)/eeta*(((eeta-1)/eeta)^(1/ttau)*gbar)/(1-nbeta*ggamma);
c_SS = ((eeta-1)/eeta)^(1/ttau);
R_SS = ppibar*exp(oomega)/nbeta;
v_SS = 1;
a_SS = 0;
g_SS = gbar;
A_SS = exp(oomega);
H_SS = ((eeta-1)/eeta)^(1/ttau)*gbar;
Util_SS = c_SS^(1-ttau)/(1-ttau) - H_SS;
Welf_SS = Util_SS/(1-nbeta);
zzeta_SS = (gbar-1)/gbar;
llambda_SS = 1/((eeta-1)/eeta);
W_SS = 1/(1/(((eeta-1)/eeta)^(1/ttau))^ttau);
mc_SS = 1/(1/(((eeta-1)/eeta)^(1/ttau))^ttau);
P_SS = 1;
G_SS = ((gbar-1)/gbar)*((eeta-1)/eeta)^(1/ttau)*gbar;
Ystar_SS = (((eeta-1)/eeta)^(1/ttau))*(1/(1-((gbar-1)/gbar)));

  Util = Util_SS;
  Welf = Welf_SS;
  H = H_SS;  
  Y = Y_SS;
  ppi = ppi_SS;
  b = b_SS;
  c = c_SS;
  R = R_SS;
  v = v_SS;
  a = a_SS;
  g = g_SS;
  A = A_SS;
  zzeta = zzeta_SS;
  llambda = llambda_SS;
  W = W_SS;
  mc = mc_SS;
  P = P_SS;
  G = G_SS;
  Ystar = Ystar_SS;

end;

resid;
check;


// Setting Variances of Shocks
shocks;
    var epsr = 1;
    var epsa = 1;
    var epsg = 1;
end;

// Stochastic Simulation
stoch_simul(order=2,nocorr,nograph,noprint);


