% 3-equation New Keynesian model

% Daniel Geissmann, based on Nicolas Cuche-Curti
% University of St.Gallen, Master Thesis

%----------------------------------------------------------------
% 0. Housekeeping (close all graphic windows)
%----------------------------------------------------------------

close all;


%----------------------------------------------------------------
% 1. Defining variables and parameters
%----------------------------------------------------------------

var 		x y c pi_h pi_f phi_f pi q s piw yw i iw;
varexo 		eps_pih eps_pif eps_q eps_i eps_z eps_yw eps_piw eps_iw eps_ad;
parameters 	gamma phi sigma h delta_h beta kappa_h delta_f kappa_f theta_h theta_f eta rho_i phi_pi phi_a phi_s phi_yy A B phi_xz rho_z rho_yw rho_piw rho_iw rho_y omega_s;

%----------------------------------------------------------------
% 2. Calibration
%----------------------------------------------------------------

beta = 0.9961;
gamma = 0.25;
sigma = 1;
phi = 0.75;
h = 0.85;
eta = 0.06;
theta_h = 0.97;
theta_f = 0.96;
rho_y = 0.8;
rho_z = 0.73;
rho_i = 0.90;
phi_pi = 1.12;
phi_a = 0.38;
phi_s = 0.30;
delta_h = 0.78;
delta_f = 0.5;
phi_yy = -0.82;
phi_xz = 0.35;
rho_iw = 0.1;
rho_piw = 0.5;
rho_yw = 0.8;

A = h*sigma*(phi*gamma*eta*(2-gamma)+1)/(sigma*(phi*gamma*eta*(2-gamma)+1)+(1-h)*((1-gamma)^2)*phi);
B = sigma*(1+phi)/(sigma*(phi*gamma*eta*(2-gamma)+1) + (1-h)*((1-gamma)^2)*phi);
kappa_h = (1-theta_h)*(1-beta*theta_h)/theta_h;
kappa_f = (1-theta_f)*(1-beta*theta_f)/theta_f;
omega_s = (1+gamma*(2-gamma)*(sigma*eta-1));

% Variance of the Shocks
sigma_pih = 0.46;
sigma_pif = 1.32;
sigma_q   = 4.66;
sigma_i   = 0.10;
sigma_z   = 0.60;
sigma_yw  = 0.01;
sigma_piw = 0.01;
sigma_iw  = 0.01;
sigma_ad  = 0.01;
%----------------------------------------------------------------
% 3. Model
%----------------------------------------------------------------

model(linear);
    //eqn 1 marginal costs
	
    
    //eqn 2 Domestic inflation
    pi_h = delta_h * pi_h(-1) + (1-delta_h)* beta*pi_h(+1) + kappa_h * y + eps_pih;

    //eqn 3 foreign inflation
    pi_f = delta_f * pi_f(-1) + (1-delta_f)*beta*pi_f(+1) + kappa_f * phi_f + eps_pif;

    //eqn 4 CPI inflation
    pi = pi_h + gamma * (x-x(-1));

    //eqn 5 Real exchange rate
    q = (1-gamma) * x + phi_f;

    //eqn 6 LOP gap
    phi_f = phi_f(-1) + s - s(-1) + piw  - pi_f;

    //eqn 7 Terms of trade
    x = x(-1)+ pi_f - pi_h;

    //eqn 8 International Risk sharing
    c = yw + 1/sigma *((1-gamma)*x + phi_f);
    
    //eqn 9 UIP
    i = pi(+1) + iw - piw(+1) + q(+1) - q + eps_q;
    
    //eqn 10 Aggregate Demand
    y = (1-rho_y) * y(+1) + rho_y * y(-1) + (1-omega_s/(1-gamma)) * (yw(+1) - yw) + gamma*eta / (1-gamma) * (phif(+1) - phif) - omega_s/(sigma*(1-gamma)) * (i - pi(+1)) + eps_ad;

    //eqn 11 MPR
    i = rho_i*i(-1) + (1-rho_i)*(phi_pi*pi + phi_a* y + phi_s*s) + eps_i;
    
   

    //eqn 16 foreign processes
    yw = rho_yw * yw(-1) + eps_yw;
    piw = rho_piw * piw(-1) + eps_piw;
    iw = rho_iw * iw(-1) + eps_iw;
end;


%----------------------------------------------------------------
% 4. Computation
%----------------------------------------------------------------

initval; x=0; y=0; c=0; pi_h=0; pi_f=0; phi_f=0; pi=0; q=0; s=0; piw=0; yw=0; iw=0; end;

shocks;
var eps_pih = sigma_pih^2;
var eps_pif = sigma_pif^2;
var eps_q  = sigma_q^2;
var eps_i   = sigma_i^2;
var eps_z   = sigma_z^2;
var eps_yw  = sigma_yw^2;
var eps_piw = sigma_piw^2;
var eps_iw  = sigma_iw^2;
var eps_ad  = sigma_ad^2;
end;

check;
//steady;
stoch_simul(irf=32,order=1,periods=10000,drop=200) pi_h y phi_f pi_f pi x q s i;