% 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 		mc x y z c pi_h pi_f phi_f pi q s piw yw i iw ygap yflex xflex;
varexo 		eps_pih eps_pif eps_q eps_i eps_yw eps_piw eps_iw;
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_iw rho_piw;

%----------------------------------------------------------------
% 2. Calibration
%----------------------------------------------------------------

beta = 0.9961;
gamma = 0.25;
sigma = 1;
phi = 1;
h = 0.5;
sigma = 1;
eta = 1;
theta_h = 0.75;
theta_f = 0.75;
rho_z = 0.9;
rho_i = 0.7;
phi_pi = 1.50;
phi_a = 0.50;
phi_s = 0.25;
delta_h = 0.5;
delta_f = 0.5;
phi_yy = 1;
phi_xz = 0;

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;

% Variance of the Shocks
sigma_pih = 0.01;
sigma_pif = 0.01;
sigma_q   = 0.01;
sigma_i   = 0.01;
sigma_yw  = 0.01;
sigma_piw = 0.01;
sigma_iw  = 0.01;
%----------------------------------------------------------------
% 3. Model
%----------------------------------------------------------------

model(linear);
    //eqn 1 marginal costs
	mc = gamma * x + phi * y - (1+phi) * z + sigma * 1/(1-h) * (c - h*c(-1));
    
    //eqn 2 Domestic inflation
    pi_h = delta_h * pi_h(-1) + beta*(pi_h(+1) - delta_h * pi_h) + kappa_h * mc + eps_pih;

    //eqn 3 foreign inflation
    pi_f = delta_f * pi_f(-1) + beta*(pi_f(+1) - delta_f * pi_f) + 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 = h*c(-1) + yw - h*yw(-1) + 1/sigma *(1-h) *((1-gamma)*x + phi_f);
    
    //eqn 9 UIP
    i = pi(+1) + iw - piw(+1) + q(+1) - q + eps_q;
    
    //eqn 10 Aggregate Demand
    c = 1/(1-gamma)* (y - gamma * eta *(2-gamma)*x - gamma*eta*phi_f-gamma*yw);

    //eqn 11 MPR
    i = rho_i*i(-1) + (1-rho_i)*(phi_pi*pi + phi_a* y + phi_s * (s-s(-1)) + eps_i;
    
    //eqn 12 output gap
    ygap = y - yflex;
    
    //eqn 13 potential output
    yflex = 1+phi/phi*z - xflex/phi+phi_yy*yw;
   
    //eqn 14 potential output
    xflex = A*xflex(-1) + B*(z-h*z(-1)) - phi_xz*yw;
    
    //eqn 15 Technology process
    z = rho_z*z(-1) + eps_z;

    //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; mc=0; x=0; y=0; z=0; c=0; pi_h=0; pi_f=0; phi_f=0; pi=0; q=0; s=0; piw=0; yw=0; iw=0; ygap=0; yflex=0; xflex=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_yw  = sigma_yw^2;
var eps_piw = sigma_piw^2;
var eps_iw  = sigma_iw^2;
end;

check;
//steady;
stoch_simul(irf=32,order=1,periods=10000,drop=200);