%*************************************************************************
% Title: Bayesian Estimation of a Small Open Economy Dynamic Stochastic 
% General Equilibrium (DSGE) Model 
% By: Nicola Babarcich
% Date: April 2014
% Senior Thesis
%************************************************************************

%*************************************************************************
% 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 y_n y_n_star s_n 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
% SEE: Alp and Elekdag (2011), Gali and Monacelli (2005)

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; 
phi_y = 0.5; 
phi_e = 0.2; 
rho_a_star = 0.9;
rho_i_star = 0.5;
phi_pi_star = 1.5; 
phi_y_star = 0.5; 
phi_e_star = 0.2;

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

model(linear);

    % 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)*psi + 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 + epsilon_s;
    % 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;
   
        
    % 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(-1)-e)) + 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;
    
    % Nominal exchange rate    
        e = z - z(-1) + pi - pi_star;

% 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;

%*************************************************************************
% CHECK BLANCHARD-KAHN CONDITIONS
% Conditions satisfied
%*************************************************************************

resid(1);
check;

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

varobs obs_y obs_pi obs_i obs_s obs_z obs_y_star obs_pi_star obs_i_star;

%*************************************************************************
% 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;
    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;

%*************************************************************************
% SHOCKS 
% Set shock stdev = 0.03 according to Alp and Elekdag (2011)
%*************************************************************************

% shocks;

% IN TERMS OF STANDARD DEVIATION
  %   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;    
    
% IN TERMS OF VARIANCE
%     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; 

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

%stoch_simul(irf=40, periods=20000); 

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

estimation(datafile=ThesisData, order=1, mh_replic=10000, mh_nblocks=2, conf_sig=0.95,
bayesian_irf, mh_jscale=0.5, mh_drop=0.4, mode_compute=6, nograph);
