
%*************************************************************************
% PREAMBLE 
%*************************************************************************

% VARIABLE DECLARATIONS

var y c s psi z mc i pi pi_h pi_f y_star mc_star i_star pi_star a a_star 
    x x_star e e_star y_n y_n_star s_n 
    % observables
    obs_y obs_pi obs_i obs_s obs_z obs_y_star obs_pi_star obs_i_star;
    
varexo 
    epsilon_a       % domestic productivity shock
    epsilon_i       % domestic interest rate shock
    epsilon_s       % exchange rate shock
    epsilon_pih     % domestic inflation shock
    epsilon_pif     % import inflation shock
    epsilon_astar   % foreign productivity shock
    epsilon_istar   % foreign interest rate shock
    epsilon_pistar; % foreign inflation shock

% PARAMETER DECLARATIONS 

parameters 
% Domestic parameters
    beta            % lifetime discount factor
    sigma           % inverse elasticity of intertemporal substitution
    varphi          % inverse elasticity of intertemporal labor supply
    b               % degree of habit persistence
    rho             % elasticity of substitution between domestic and imported goods
    alpha           % share of foreign goods in consumption 
    theta_h         % domestic producer Calvo parameter
    theta_f         % domestic importer Calvo parameter
    theta_star      % foreign Calvo parameter
    rho_a           % technology process coefficient
    
% Domestic monetary policy parameters
    rho_i           % interest rate persistence
    phi_pi          % response to inflation
    phi_y           % response to the output gap
    phi_e           % response to the nominal exchange rate

% All foreign parameters
    rho_a_star      % foreign technology process coefficient
    rho_i_star      % foreign interest rate persistence
    phi_pi_star     % foreign response to inflation
    phi_y_star      % foreign response to the output gap
    phi_e_star;     % foreign response to the nominal exchange rate
    
% INITIAL PARAMETER CALIBRATION

beta = 0.99;
sigma = 1;
varphi = 3; 
b = 0.9; 
rho = 1; 
alpha = 0.25; 
theta_h = 0.75;
theta_f = 0.75;
theta_star = 0.65;
rho_a = 0.9;
rho_i = 0.5;
phi_pi = 1.5; % original Taylor estimate
phi_y = 0.5; % original Taylor estimate 
phi_e = 0.2; 
rho_a_star = 0.9;
rho_i_star = 0.5;
phi_pi_star = 1.5; % original Taylor estimate
phi_y_star = 0.5; % original Taylor estimate
phi_e_star = 0.2;

%*************************************************************************
% MODEL 
%*************************************************************************

model(linear);

    % # lambda_h = ((1-beta*theta_h)(1-theta_h))/theta_h;
    % # lambda_f = ((1-beta*theta_f)(1-theta_f))/theta_f;
    % # lambda_star = ((1-beta*theta_star)(1-theta_star))/theta_star;
    
    % Domestic inflation
        pi_h = beta*(1-theta_h)*pi_h(+1) + theta_h*pi_h(-1) + (((1-beta*theta_h)*(1-theta_h))/theta_h)*mc+epsilon_pih;
    % Imported inflation
        pi_f = beta*(1-theta_f)*pi_f(+1) + theta_f*pi_f(-1) + (((1-beta*theta_f)*(1-theta_f))/theta_f)*mc+epsilon_pif;
    % CPI inflation
        pi = (1-alpha)*pi_h + alpha*pi_f;
    % Domestic marginal cost
        mc = varphi*y + alpha*s - (1+varphi)*a + (sigma/(1-b))*(c-b*c(-1));
    % Real exchange rate
        z = psi + (1-alpha)*s;
    % Terms of trade
        s - s(-1) = pi_f - pi_h;
    % International risk sharing
        c = b*c + y_star - b*y_star + (1/sigma)*(1-b)*(psi + (1-alpha)*s);
    % Uncovered interest parity
       (i - pi(+1)) - (i_star - pi_star(+1)) = z(+1) - z + epsilon_s;
    % Goods market clearing
        y = (1-alpha)*c + alpha*y_star + (2-alpha)*alpha*rho*s + alpha*rho*psi;
    % Monetary policy rule
        i = rho_i*i(-1) + (1-rho_i)*(phi_pi*pi + phi_y*x + phi_e*(e-e(-1))) + epsilon_i;
    % Output gap
        x = y - y_n; 
    % Technology process
        a = rho_a*a(-1) + epsilon_a;
    % Law of one price gap
        psi - psi(-1) = e - e(-1) + pi_star - pi_f;
        
    % Foreign Euler equation
        y_star = b*y_star(-1) + y_star(+1) - b*y_star - (1/sigma)*(1-b)*(i_star - pi_star(+1));
    % Foreign inflation
        pi_star = beta*(1-theta_star)*pi_star(+1) + theta_star*pi_star(-1) + (((1-beta*theta_star)*(1-theta_star))/theta_star)*mc_star+epsilon_pistar;
    % Foreign marginal cost
        mc_star = varphi*y_star + alpha*s - (1+varphi)*a_star + (sigma/(1-b))*(y_star-b*y_star(-1));
    % Foreign monetary policy rule
        i_star = rho_i_star*i_star(-1) + (1-rho_i_star)*(phi_pi_star*pi_star + phi_y_star*x_star + phi_e_star*(e_star-e_star(-1))) + epsilon_istar;
    % Foreign output gap
        x_star = y_star - y_n_star;
    % Foreign technology process
        a_star = rho_a_star*a_star(-1) + epsilon_astar;
    % Foreign nominal exchange rate
        e_star - e_star(-1) = e(-1) - e;

% Measurement equations
    % Domestic output
        obs_y = y - y(-1);
    % Domestic inflation
        obs_pi = pi;
    % Domestic interest rate
        obs_i = i;
    % TOT
        obs_s = s - s(-1);
    % Real XR
        obs_z = z - z(-1);
    % Foreign output
        obs_y_star = y_star - y_star(-1);
    % Foreign inflation
        obs_pi_star = pi_star;
    % Foreign interest rate
        obs_i_star = i_star; 
        
% Output gap

    % Domestic definitions
        s_n = (((b*sigma)*(1+(varphi*alpha*rho)*(2-alpha)))/((sigma*(1+(varphi*alpha*rho)*(2-alpha)))+(varphi*(1-b)*(1-alpha)^2)))*s_n(-1) + ((sigma*(1+varphi))/((sigma*(1+(varphi*alpha*rho)*(2-alpha)))+(varphi*(1-b)*(1-alpha)^2)))*(a-b*a(-1)-(a_star-b*a_star(-1)));
    % Domestic output gap
        y_n = ((1+varphi)/varphi)*(a-a_star) - (s_n/varphi) + y_n_star;
    % Foreign output gap
        y_n_star = a_star*(((1-b)*(1-varphi))/(sigma+varphi*(1-b))) + ((b*sigma)/(sigma+varphi*(1-b)))*y_n_star(-1);

end;

%*************************************************************************
% INITIAL VALUES 
%*************************************************************************


initval;
    y = 0;
    c = 0;
    s = 0;
    psi = 0;
    z = 0;
    mc = 0;
    i = 0; 
    pi = 0;
    pi_h = 0;
    pi_f = 0;
    y_star = 0;
    mc_star = 0;
    i_star = 0;
    pi_star = 0;
    a = 0;
    a_star = 0;
    x = 0;
    x_star = 0;
    e = 0;
    e_star = 0;
    y_n = 0;
    y_n_star = 0;
    obs_y = 0;
    obs_pi = 0;
    obs_i = 0;
    obs_s = 0;
    obs_z = 0;
    obs_y_star = 0;
    obs_pi_star = 0;
    obs_i_star = 0;
end;

steady; 

%*************************************************************************
% CHECK BLANCHARD-KAHN CONDITIONS
%*************************************************************************

check;

%*************************************************************************
% SHOCKS 
%*************************************************************************

shocks;
    % var epsilon_a; stderr 2;  
    % var epsilon_i; stderr 2;  
    % var epsilon_s; stderr 2;
    % var epsilon_pih; stderr 2; 
    % var epsilon_pif; stderr 2; 
    % var epsilon_astar; stderr 2; 
    % var epsilon_istar; stderr 2; 
    % var epsilon_pistar; stderr 2;    
   
    var epsilon_a = 0.03^2; 
    var epsilon_i = 0.03^2; 
    var epsilon_s = 0.03^2; 
    var epsilon_pih = 0.03^2; 
    var epsilon_pif = 0.03^2;
    var epsilon_astar = 0.03^2; 
    var epsilon_istar = 0.03^2;
    var epsilon_pistar = 0.03^2; 
end;



%*************************************************************************
% ESTIMATED PARAMETERS 
%*************************************************************************

%  estimated_params; 
%     sigma, normal_pdf, 2.0, 0.75;   
%     varphi, normal_pdf, 2.0, 0.5;  
%     b, beta_pdf, 0.7, 0.2;   
%     theta_h, beta_pdf, 0.5, 0.2;  
%     theta_f, beta_pdf, 0.5, 0.2;  
%     theta_star, normal_pdf, 0.65, 0.05;  
%     rho_a, beta_pdf, 0.8, 0.1; 
%     rho_i, beta_pdf, 0.6, 0.2;  
%     phi_pi, gamma_pdf, 1.45, 0.3;  
%     phi_y, gamma_pdf, 0.325, 0.2; 
%     phi_e, normal_pdf, 0.1, 0.05;  
%     rho_a_star, beta_pdf, 0.8, 0.1;  
%     rho_i_star, beta_pdf, 0.6, 0,2;  
%     phi_pi_star, gamma_pdf, 1.45, 0.3;  
%     phi_y_star, gamma_pdf, 0.325, 0.2;  
%     phi_e_star, normal_pdf, 0.1, 0.05; 
%     
%     stderr epsilon_a, inv_gamma_pdf, 2, inf;        
%     stderr epsilon_i, inv_gamma_pdf, 2, inf;     
%     stderr epsilon_s, inv_gamma_pdf, 2, inf;       
%     stderr epsilon_pih, inv_gamma_pdf, 2, inf;     
%     stderr epsilon_pif, inv_gamma_pdf, 2, inf;     
%     stderr epsilon_astar, inv_gamma_pdf, 2, inf;   
%     stderr epsilon_istar, inv_gamma_pdf, 2, inf;   
%     stderr epsilon_pistar, inv_gamma_pdf, 2, inf;
% end; 

%*************************************************************************
% OBSERVED VARIABLES 
%*************************************************************************

%varobs obs_y obs_pi obs_i obs_s obs_z obs_y_star obs_pi_star obs_i_star;

%*************************************************************************
% COMPUTATION  
%*************************************************************************

stoch_simul(irf=40); 

%*************************************************************************
% ESTIMATION  
%*************************************************************************

%*************************************************************************
% SENSITIVITY ANALYSIS  
%*************************************************************************

