/*
 * This file implements the baseline New Keynesian model of Jordi Galí (2008): Monetary Policy, Inflation,
 * and the Business Cycle, Princeton University Press, Second Edition, Chapter 3
 *
 * The model equations and FOC's are obtained without linearization.
 *
 * 08.12.2016 */
    
%----------------------------------------------------------------
% Define Variables
%----------------------------------------------------------------
var 
    C               ${C}$           (long_name='Consumption')
    W_real          ${\frac{W}{P}}$ (long_name='Real Wage')
    Pi              ${\Pi}$         (long_name='inflation')
    A               ${A}$           (long_name='AR(1) technology process')
    N               ${N}$           (long_name='Hours worked')
    R               ${R^n}$         (long_name='Nominal Interest Rate') 
    realinterest    ${R^{r}}$       (long_name='Real Interest Rate')
    Y               ${Y}$           (long_name='Output') 
    Q               ${Q}$           (long_name='Bond price')
    Z               ${Z}$           (long_name='AR(1) preference shock process')
    S               ${S}$           (long_name='Price dispersion')
    Pi_star         ${\Pi^*}$       (long_name='Optimal reset price')
    x_aux_1         ${x_1}$         (long_name='aux. var. 1 recursive price setting')
    x_aux_2         ${x_2}$         (long_name='aux. var. 2 recursive price setting')
    MC              ${mc}$          (long_name='real marginal costs')
    i_ann           ${i^{ann}}$     (long_name='annualized nominal interest rate')
    pi_ann          ${\pi^{ann}}$   (long_name='annualized inflation rate')
    r_real_ann      ${r^{r,ann}}$   (long_name='annualized real interest rate')
    P               ${P}$           (long_name='price level')
    log_y           ${log(M)}$      (long_name='log output')
    log_W_real      ${log(W/P)}$    (long_name='log real wage')
    log_N           ${log(N)}$      (long_name='log hours')
    log_P           ${log(P)}$      (long_name='log price level')
    log_A           ${log(A)}$      (long_name='log technology level')
    log_Z           ${log(Z)}$      (long_name='log preference shock')
    nu              ${\nu}$         (long_name='AR(1) monetary policy shock process')
    sigma_a         ${\sigma_a}$
    sigma_nu        ${\sigma_nu}$
    sigma_z         ${\sigma_z}$
;    
%----------------------------------------------------------------
% Define Shock Variables
%----------------------------------------------------------------
varexo 
       eps_a        ${\varepsilon_a}$   (long_name='technology shock')
       eps_z        ${\varepsilon_z}$   (long_name='preference shock')
       eps_nu       ${\varepsilon_\nu}$ (long_name='monetary policy shock')
       eps_sigma_a
       eps_sigma_nu
       eps_sigma_z
;       
%----------------------------------------------------------------
% Define Parameters
%----------------------------------------------------------------
parameters   
    alppha              ${\alpha}$      (long_name='capital share')
    betta               ${\beta}$       (long_name='discount factor')
    rho_a               ${\rho_a}$      (long_name='autocorrelation technology shock')
    rho_nu              ${\rho_{\nu}}$  (long_name='autocorrelation monetary policy shock')
    rho_z               ${\rho_{z}}$    (long_name='autocorrelation monetary demand shock')
    siggma              ${\sigma}$      (long_name='inverse EIS')
    varphi              ${\varphi}$     (long_name='inverse Frisch elasticity')
    phi_pi              ${\phi_{\pi}}$  (long_name='inflation feedback Taylor Rule')
    phi_y               ${\phi_{y}}$    (long_name='output feedback Taylor Rule')
    epsilon             ${\epsilon}$    (long_name='demand elasticity')
    theta               ${\theta}$      (long_name='Calvo parameter')
    tau                 ${\tau}$        (long_name='labor subsidy')
    rho_sigma_a
    sigma_a_bar
    eta_a
    rho_sigma_nu
    sigma_nu_bar
    eta_nu
    rho_sigma_z
    sigma_z_bar
    eta_z    
;    
%----------------------------------------------------------------
% Parametrization, p. 67  and p. 113-115
%----------------------------------------------------------------
siggma = 1;
varphi=5;
phi_pi = 1.5;
phi_y  = 0.125;
theta=3/4;
rho_nu =0.5;
rho_z  = 0.5;
rho_a  = 0.9;
betta  = 0.99;
alppha=1/4;
epsilon=9;
tau=0; //1/epsilon;
rho_sigma_a = 0.94;
sigma_a_bar = -2;
eta_a = 0.13;

rho_sigma_nu = 0.94;
sigma_nu_bar = -2;
eta_nu = 0.13;

rho_sigma_z = 0.94;
sigma_z_bar = -2;
eta_z = 0.13;
%----------------------------------------------------------------
% First Order Conditions
%----------------------------------------------------------------
model;
    [name='Labor demand']
    W_real=C^siggma*N^varphi;
    [name='Euler equation']
    Q=betta*(C(+1)/C)^(-siggma)*(Z(+1)/Z)/Pi(+1);
    [name='Definition nominal interest rate)']
    R=1/Q;
    [name='Aggregate output']
    Y=A*(N/S)^(1-alppha);
    [name='Definition Real interest rate']
    R=realinterest*Pi(+1);
    [name='Monetary Policy Rule']
    R=1/betta*Pi^phi_pi*(Y/steady_state(Y))^phi_y*exp(nu);
    [name='Market Clearing']
    C=Y;
    [name='Technology shock']
    log(A)=rho_a*log(A(-1))+eps_a*exp(sigma_a);
    sigma_a=(1-rho_sigma_a)*sigma_a_bar + rho_sigma_a*sigma_a(-1)+eta_a*eps_sigma_a;
    [name='Preference shock']
    log(Z)=rho_z*log(Z(-1))-eps_z*exp(sigma_z);
    sigma_z=(1-rho_sigma_z)*sigma_z_bar + rho_sigma_z*sigma_z(-1)+eta_z*eps_sigma_z;
    [name='Monetary policy shock']
    nu=rho_nu*nu(-1)+eps_nu*exp(sigma_nu);
    sigma_nu=(1-rho_sigma_nu)*sigma_nu_bar + rho_sigma_nu*sigma_nu(-1)+eta_nu*eps_sigma_nu;
    [name='Definition marginal cost']
    MC=W_real/((1-alppha)*Y/N*S);
    [name='Aggregate prices']
    1=theta*Pi^(epsilon-1)+(1-theta)*(Pi_star)^(1-epsilon);
    [name='Price dispersion']
    S=(1-theta)*Pi_star^(-epsilon/(1-alppha))+theta*Pi^(epsilon/(1-alppha))*S(-1);
    [name='FOC price setting']
    Pi_star^(1+epsilon*(alppha/(1-alppha)))=x_aux_1/x_aux_2*(1-tau)*epsilon/(epsilon-1);
    [name='Auxiliary price setting recursion 1']
    x_aux_1=C^(-siggma)*Y*MC+betta*theta*Pi(+1)^(epsilon+alppha*epsilon/(1-alppha))*x_aux_1(+1);
    [name='Auxiliary price setting recursion 2']
    x_aux_2=C^(-siggma)*Y+betta*theta*Pi(+1)^(epsilon-1)*x_aux_2(+1);
    [name='Definition price level']
    Pi=P/P(-1);
    [name='Definition log output']
    log_y = log(Y);
    [name='Definition log real wage']
    log_W_real=log(W_real);
    [name='Definition log hours']
    log_N=log(N);
    [name='Annualized inflation']
    pi_ann=4*log(Pi);
    [name='Annualized nominal interest rate']
    i_ann=4*log(R);
    [name='Annualized real interest rate']
    r_real_ann=4*log(realinterest);
    [name='Definition log price level']
    log_P=log(P);
    [name='Definition log TFP']
    log_A=log(A);
    [name='Definition log preference']
    log_Z=log(Z);    
end;
%----------------------------------------------------------------
%  Steady state values
%---------------------------------------------------------------
steady_state_model;
sigma_a = sigma_a_bar;
sigma_nu = sigma_nu_bar;
sigma_z = sigma_z_bar;
A=1;
Z=1;
S=1;
Pi_star=1;
P=1;
MC=(epsilon-1)/epsilon/(1-tau);
R=1/betta;
Pi=1;
Q=1/R;
realinterest=R;
N=((1-alppha)*MC)^(1/((1-siggma)*alppha+varphi+siggma));
C=A*N^(1-alppha);
W_real=C^siggma*N^varphi;
Y=C;
nu=0;
x_aux_1=C^(-siggma)*Y*MC/(1-betta*theta*Pi^(epsilon/(1-alppha)));
x_aux_2=C^(-siggma)*Y/(1-betta*theta*Pi^(epsilon-1));
log_y = log(Y);
log_W_real=log(W_real);
log_N=log(N);
pi_ann=4*log(Pi);
i_ann=4*log(R);
r_real_ann=4*log(realinterest);
log_P=log(P);
log_A=0;
log_Z=0;
end;
%----------------------------------------------------------------
% Write Latex File for the Model
%----------------------------------------------------------------
write_latex_dynamic_model;

%----------------------------------------------------------------
% Define the Monetary Policy Shock
%----------------------------------------------------------------

resid(1);
steady;
check;

shocks;
    var eps_nu = 0.25^2; //1 standard deviation shock of 25 basis points, i.e. 1 percentage point annualized
    var eps_z = 0.5^2;  //unit shock to preference
    var eps_a = 1^2;    //unit shock to technology
    var eps_sigma_a = 0.25^2;
    var eps_sigma_nu = 0.5^2;
    var eps_sigma_z = 1;
   
end;

%----------------------------------------------------------------
% Solve the Model
%----------------------------------------------------------------
    stoch_simul(order = 3, pruning, irf=20) Y Pi nu log_A log_Z sigma_a sigma_z sigma_nu;