// Model of small open economy with incomplete pass-through, Monacelli (2005)

//----------------------------------------
//		Preamble
//----------------------------------------

var y_gap pi r_h pi_h r_nat psi_f y_f a_h pi_f y_h s r_f a_f q y_nat p_h cpi mc_h mc_f;
varexo eps_a_h eps_a_f eps_r_h eps_r_f;

parameters beta sigma alpha eta epsilon phi kappa_c_y kappa_c_psi kappa_y kappa_psi theta_h theta_f
		omega_s omega_psi lambda_h lambda_f rho_a_h rho_a_f big_gamma_y a_shock_correl phi_a_f phi_pi_f rho phi_1 phi_2 rho_r;

// Calibrations

beta=0.99;						// temporal discount factor
sigma=0.5;						// intertemporal elasticity of consumption
alpha=0.4;						// degree of openness in home economy
eta=1;							// elasticity of substitution between home and foreign goods
phi=3;							// labor disutility
theta_f=0.75;						// import pricing Calvo probability
theta_h=0.75;						// home producers Calvo probability
rho=0.5;
lambda_h = ((1-theta_h)*(1-beta*theta_h)) / theta_h;	// coefficient on marginal cost on domestic phillips curve
lambda_f = ((1-theta_f)*(1-beta*theta_f)) / theta_f;	// coefficient on marginal cost on import prices phillips curve
omega_s = 1 + alpha * (2-alpha) * (sigma*eta - 1);	// elasticity of relative output to terms of trade
omega_psi = 1 + alpha * (sigma*eta - 1);		// elasticity of relative output to law of one price gap
kappa_y = lambda_h * (phi + (sigma/omega_s));
kappa_psi = lambda_h * ((1-omega_psi) / omega_s);
kappa_c_y = (1-alpha) * kappa_y;
kappa_c_psi = (1-alpha) * kappa_psi + alpha*lambda_f;
big_gamma_y = (alpha*(1-alpha)*(sigma*eta-1)) / sigma;

// Parameters of the productivity shocks
rho_a_h = 0.9;
rho_a_f = 0.9;
a_shock_correl = 0.77;

// Monetary policy in the world economy
phi_a_f = -(sigma * (1+phi) * (1-rho_a_f)) / (phi+sigma);
phi_pi_f = 1.01;
phi_1 = 1.5;
phi_2 = .4;

rho_r = .9;

//----------------------------------------
//		Model
//----------------------------------------

model(linear);

    // Home IS Curve
        y_gap = y_gap(+1)-(omega_s/sigma)*(r_h-pi_h(+1)-r_nat) + big_gamma_y*(psi_f(+1)-psi_f);   // ygap

    // Home Wicksellian interest rate
        r_nat = sigma*((phi*(omega_s-1)) / (sigma+phi*omega_s)) * (y_f(+1)-y_f) - ((sigma*(1-rho)*(1+phi)) / (sigma+phi*omega_s))*a_h;  // r_nat

    // Home Taylor Rule
        //r_h = 0.5 * r_h(-1) + 1.5 * pi + 0.2 * y_gap; 		// simple taylor rule with coefficients plucked out of air  // r_h
        r_h = rho_r * r_h(-1) + (1-rho_r) * (phi_1*pi + phi_2*(y_gap - y_gap(-1))) + eps_r_h;

    // Home natural output level
        y_nat = ((omega_s * (1+phi)) / (sigma + phi*omega_s)) * a_h + ((sigma*(1-omega_s)) / (sigma + phi*omega_s)) * y_f;  // y_nat
        
    // Definition of output gap
        y_gap = y_h - y_nat;
    
    // Wedge between domestic and world output, affected by incomplete pass-through, pins down foreign output
        y_h = y_f + (1/sigma) * (omega_s * s + omega_psi * psi_f);  //s

    // Foreign production
        y_f = y_f(+1) - (r_f - pi_f(+1))/sigma;    //y_f

    // Overall inflation
        pi = (1-alpha) * pi_h + alpha * pi_f;    //pi
      //   pi = pi_h + alpha * (s - s(-1)); // alternative

    // Foreign Taylor Rule
       // r_f = phi_pi_f * pi_f(+1) + phi_a_f*a_f;            // borrowed from Gali Monacelli (2005)    r_f
        r_f = rho_r * r_f(-1);// + (1-rho_r) * (phi_1*pi + phi_2*(y_f - y_f(-1))) + eps_r_f;

    // Home technology process
        a_h = rho_a_h * a_h(-1) + eps_a_h + a_shock_correl*eps_a_f;    //a_h

    // Foreign technology process
        a_f = rho_a_f * a_f(-1) + eps_a_f;   //a_f

    // Home inflation
        pi_h = beta * pi_h(+1) + lambda_h * mc_h;   // pi_h
      // pi_h = beta * pi_h(+1) + kappa_y * y_gap + kappa_psi * psi_f;  // alternative

    // Imported inflation
        pi_f = beta * pi_f(+1) + lambda_f * psi_f;   // pi_f

    // Home marginal cost
        mc_h = phi*y_h - (1 + phi)*a_h + sigma*y_f + s + psi_f;  // mc_h
      //  mc_h = (phi + (sigma/omega_s)) * y_gap + (1 - (omega_psi / omega_s)) * psi_f; // eq (20) commented out for reference

    // Terms of trade (differenced version)
        s = s(-1) + pi_f - pi_h;     
    
    // LOP gap
        psi_f = (1-alpha)*s - q;

    // UIP condition
        //q(+1) - q = -(r_h - pi_h(+1)) - (r_f - pi_f(+1));

    // Identity to pin down relative price of home goods
        p_h = p_h(-1) + pi_h;

    // Identity to pin down relative price of CPI level
        cpi = cpi(-1) + pi;

    // Foreign marginal cost
        mc_f = (sigma + phi)*y_f - (1+phi)*a_f;					// Foreign's marginal cost, log-deviation form of (32)


end;



/*
initval;

r_h = 0;
r_f = 0;
q = 0;
y_h = 0;
y_f = 0;
pi_h = 0;
pi_f = 0;
end;
*/

//----------------------------------------
//		Steady state
//----------------------------------------

steady;

//----------------------------------------
//		Check Blanchard-Kahn conditions
//----------------------------------------

check;

//----------------------------------------
//		Shocks
//----------------------------------------

shocks;
var eps_a_h;
stderr 1;
end;

//----------------------------------------
//		Computation
//----------------------------------------

stoch_simul(irf=25);
