%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%%%            Choques petroleros y política monetaria          %%%           
%%%    Análisis de un modelo DSGE para la economía colombiana   %%%
%%%                    Gonzalo Jiménez Murcia                   %%%
%%%                   Universidad de los Andes                  %%%
%%%                        Enero de 2017                        %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


 
%%% Primera parte - preámbulo (variables endógenas, variables exógenas y parámetros)
  
var p_OIL, y_OIL, R_ast, R_f, b_ast, lambda_1, c, h, w, R, q, c_T, p_T, c_NT, p_NT, y_T, z_T, h_T, z_NT, fi_NT, h_NT, y_NT, OIL_IN, PSI, PI_NT, ZETA, p_NT_hat, I, PI, z_I, y, 
p_T_ast, PI_T, OIL_OUT, Dev_nom, PI_ast, p_OIL_OBS, y_OBS, PI_OBS, I_OBS, Dev_nom_OBS;
  

varexo e_p_OIL, e_y_OIL, e_R_f, e_z_T, e_z_NT, e_z_I, e_p_T_ast, e_PI_ast;
 
 
parameters beta, ro_p_OIL, p_OIL_bar, ro_y_OIL, y_OIL_bar, omega, b_ast_par, ro_R_f, R_f_bar, chi, sigma, gama, varteta, ro_z_T, z_T_bar, ro_z_NT, z_NT_bar, alfa, fi, teta, 
PI_bar, eta_PI, eta_y, ro_z_I, z_I_bar, ro_p_T_ast, p_T_ast_bar, ro_PI_ast, PI_ast_bar, delta,
            
p_OIL_ee, y_OIL_ee, R_ast_ee, R_f_ee, b_ast_ee, lambda_1_ee, c_ee, h_ee, w_ee, R_ee, q_ee, c_T_ee, p_T_ee, c_NT_ee, p_NT_ee, y_T_ee, z_T_ee, h_T_ee, z_NT_ee, fi_NT_ee, h_NT_ee, 
y_NT_ee, OIL_IN_ee, PSI_ee, PI_NT_ee, ZETA_ee, p_NT_hat_ee, I_ee, PI_ee, z_I_ee, y_ee, p_T_ast_ee, PI_T_ee, OIL_OUT_ee, Dev_nom_ee, PI_ast_ee;
 
 
beta = 1 / ((1+0.025)^(1/4));   % Implica una tasa de interés real de 2,5% anual
ro_p_OIL = 0.9829; 
p_OIL_bar = 0.17; %%%
ro_y_OIL = 0.4996; 
y_OIL_bar = 0.17; %%%
omega = 0.0544;
b_ast_par = 0.6; 
ro_R_f = 0.8432; 
R_f_bar = 1 / beta;
%chi;
sigma = 0.6085;
gama = 0.3; 
varteta = 0.78;
ro_z_T = 0.8324; 
z_T_bar = 1;
ro_z_NT = 0.8910; 
%z_NT_bar;
alfa = 0.98;
fi = 0.5762;
teta = 6;
PI_bar = 1.03^(1/4);
eta_PI = 1.3859; 
eta_y = 0; 
ro_z_I = 0.4977; 
z_I_bar = 1;
ro_p_T_ast = 0.8555; 
p_T_ast_bar = 1;
ro_PI_ast = 0.33;
PI_ast_bar = PI_bar;
delta = 1.5;
 

% Definición del estado estacionario del modelo
 
h_ee = log(0.3);
p_T_ee = log(1);
 
p_OIL_ee = log(p_OIL_bar);   %(1)
y_OIL_ee = log(y_OIL_bar);   %(2)
R_f_ee = log(R_f_bar);   %(4)
R_ast_ee = log(exp(R_f_ee));   %(3)
b_ast_ee = log(b_ast_par);   %(3)
R_ee = log(1 / beta);   %(7)
p_NT_ee = log(1);   %(12)
z_T_ee = log(z_T_bar);   %(14)
p_NT_hat_ee = log(1);   %(23)
z_I_ee = log(z_I_bar);   %(25)
I_ee = log(((1 / beta) * PI_bar) * (exp(z_I_ee)^(1 / (1 - ro_z_I))));   %(24)
p_T_ast_ee = log(p_T_ast_bar);   %(28)
PI_ast_ee = log(PI_ast_bar);   %(35)
 
w_ee = log(exp(z_T_ee) * exp(p_T_ee));   %(15)
q_ee = log(exp(p_T_ee) / exp(p_T_ast_ee));   %(27)
PI_ee = log(exp(I_ee) / exp(R_ee));   %(31)
PI_NT_ee = log(exp(PI_ee));   %(32)
PI_T_ee = log(exp(PI_ee));   %(33)
c_ee = log((exp(w_ee) * exp(h_ee)) + (exp(q_ee) * exp(b_ast_ee)) + (exp(q_ee) * exp(p_OIL_ee) * exp(y_OIL_ee)) - (exp(R_ast_ee) * exp(q_ee) * exp(b_ast_ee)));   %(9)
%chi = exp(w_ee) / (exp(h_ee)^sigma);   %(6)
% GHH. chi = exp(w_ee) / (exp(h_ee)^sigma);   %(6)
lambda_1_ee = log(1 / exp(c_ee));   %(5)
% KPR. lambda_1_ee = log(1 / exp(c_ee));   %(5)
% GHH. lambda_1_ee = log((exp(c_ee) - (chi * ((exp(h_ee)^(1 + sigma)) / (1 + sigma))))^(-delta));   %(5)
c_T_ee = log(gama * exp(c_ee) * (exp(p_T_ee)^(-varteta)));   %(10)
c_NT_ee = log((1 - gama) * exp(c_ee) * (exp(p_NT_ee)^(-varteta)));   %(11)
y_NT_ee = log(exp(c_NT_ee));   %(30)
ZETA_ee = log(exp(y_NT_ee) / (1 - (fi * beta)));   %(21)
PSI_ee = log(((teta - 1) / teta) * (exp(ZETA_ee) * exp(p_NT_hat_ee)));   %(22)
fi_NT_ee = log((1 - (fi * beta)) * (exp(PSI_ee) / exp(y_NT_ee)));   %(20)
h_NT_ee = log((alfa * exp(p_NT_ee) * exp(fi_NT_ee) * exp(y_NT_ee)) / exp(w_ee));   %(17)
OIL_IN_ee = log(((1 - alfa) * exp(p_NT_ee) * exp(fi_NT_ee) * exp(y_NT_ee)) / (exp(q_ee) * exp(p_OIL_ee)));   %(18)
z_NT_ee = log(exp(y_NT_ee) / ((exp(h_NT_ee)^alfa) * (exp(OIL_IN_ee)^(1 - alfa))));   %(19)
h_T_ee = log(exp(h_ee) - exp(h_NT_ee));   %(29)
y_T_ee = log(exp(z_T_ee) * exp(h_T_ee));   %(13)
y_ee = log((exp(p_T_ee) * exp(y_T_ee)) + (exp(p_NT_ee) * exp(y_NT_ee)) + (exp(p_OIL_ee) * exp(y_OIL_ee)));   %(26)
OIL_OUT_ee = log(exp(y_OIL_ee) - exp(OIL_IN_ee));   %(34)
Dev_nom_ee = log(exp(PI_ee) / exp(PI_ast_ee));   %(36)

chi = (exp(lambda_1_ee) * exp(w_ee)) / (exp(h_ee)^sigma);   %(6)
% KPR. chi = (exp(lambda_1_ee) * exp(w_ee)) / (exp(h_ee)^sigma);   %(6)
z_NT_bar = exp(z_NT_ee);   %(16)
 
 
%%% Segunda parte - Descripción del modelo
 
model;
 
p_OIL = (ro_p_OIL * p_OIL(-1)) + ((1 - ro_p_OIL) * log(p_OIL_bar)) + e_p_OIL;   %(1)   
y_OIL = (ro_y_OIL * y_OIL(-1)) + ((1 - ro_y_OIL) * log(y_OIL_bar)) + e_y_OIL;   %(2)   
exp(R_ast) = exp(R_f) + (omega * (exp(exp(b_ast) - b_ast_par) - 1));   %(3)   
R_f = (ro_R_f * R_f(-1)) + ((1 - ro_R_f) * log(R_f_bar)) + e_R_f;   %(4)   
exp(lambda_1) = 1 / exp(c);   %(5)
% KPR. exp(lambda_1) = 1 / exp(c);   %(5)
% GHH. exp(lambda_1) = (exp(c) - (chi * ((exp(h)^(1 + sigma)) / (1 + sigma))))^(-delta);   %(5)
exp(lambda_1) = (chi * (exp(h)^sigma)) / exp(w);   %(6)
% KPR. exp(lambda_1) = (chi * (exp(h)^sigma)) / exp(w);   %(6)
% GHH. exp(w) = chi * (exp(h)^sigma);   %(6)
exp(lambda_1) = beta * exp(lambda_1(+1)) * exp(R);   %(7)
exp(lambda_1) = beta * exp(lambda_1(+1)) * exp(R_ast) * (exp(q(+1)) / exp(q));   %(8)
exp(c) = (exp(w) * exp(h)) + (exp(q) * exp(b_ast)) + (exp(q) * exp(p_OIL) * exp(y_OIL)) - (exp(R_ast(-1)) * exp(q) * exp(b_ast(-1)));   %(9)   
exp(c_T) = gama * exp(c) * (exp(p_T)^(-varteta));   %(10)
exp(c_NT) = (1 - gama) * exp(c) * (exp(p_NT)^(-varteta));   %(11)
1 = (gama * (exp(p_T)^(1 - varteta))) + ((1 - gama) * (exp(p_NT)^(1 - varteta)));   %(12)
exp(y_T) = exp(z_T) * exp(h_T);   %(13)
z_T = (ro_z_T * z_T(-1)) + ((1 - ro_z_T) * log(z_T_bar)) + e_z_T;   %(14)
exp(w) = exp(z_T) * exp(p_T);   %(15)
z_NT = (ro_z_NT * z_NT(-1)) + ((1 - ro_z_NT) * log(z_NT_bar)) + e_z_NT;   %(16)
exp(h_NT) = (alfa * exp(p_NT) * exp(fi_NT) * exp(y_NT)) / exp(w);   %(17)
exp(OIL_IN) = ((1 - alfa) * exp(p_NT) * exp(fi_NT) * exp(y_NT)) / (exp(q) * exp(p_OIL));   %(18)
exp(y_NT) = exp(z_NT) * (exp(h_NT)^alfa) * (exp(OIL_IN)^(1 - alfa));   %(19)
exp(PSI) = (exp(fi_NT) * exp(y_NT)) + (fi * beta * (exp(lambda_1(+1)) / exp(lambda_1)) * ((exp(PI_NT(+1)) / exp(PI_NT))^teta) * exp(PSI(+1)));   %(20)
exp(ZETA) = exp(y_NT) + (fi * beta * (exp(lambda_1(+1)) / exp(lambda_1)) * ((exp(PI_NT(+1)) / exp(PI_NT))^(teta - 1)) * exp(ZETA(+1)));   %(21)
exp(p_NT_hat) = (teta / (teta - 1)) * (exp(PSI) / exp(ZETA));   %(22)
exp(PI_NT) = ((fi * (exp(PI_NT(-1))^(1 - teta))) + ((1 - fi) * ((exp(p_NT_hat) * exp(PI_NT))^(1 - teta))))^(1 / (1 - teta));   %(23)
exp(I) = (exp(I(-1))^ro_z_I) * ((((1 / beta) * PI_bar) * ((exp(PI) / PI_bar)^eta_PI) * ((exp(y) / steady_state(exp(y)))^eta_y))^(1 - ro_z_I)) * exp(z_I);   %(24)
z_I = (ro_z_I * z_I(-1)) + ((1 - ro_z_I) * log(z_I_bar)) + e_z_I;   %(25)
exp(y) = (exp(p_T) * exp(y_T)) + (exp(p_NT) * exp(y_NT)) + (exp(p_OIL) * exp(y_OIL));   %(26)
exp(p_T) = exp(q) * exp(p_T_ast);   %(27)
p_T_ast = (ro_p_T_ast * p_T_ast(-1)) + ((1 - ro_p_T_ast) * log(p_T_ast_bar)) + e_p_T_ast;   %(28)
exp(h) = exp(h_T) + exp(h_NT);   %(29)
exp(y_NT) = exp(c_NT);   %(30)
exp(R) = exp(I) / exp(PI(+1));   %(31)
exp(p_NT) = exp(p_NT(-1)) * (exp(PI_NT) / exp(PI));   %(32)
exp(p_T) = exp(p_T(-1)) * (exp(PI_T) / exp(PI));   %(33)
exp(y_OIL) = exp(OIL_IN) + exp(OIL_OUT);   %(34)
PI_ast = (ro_PI_ast * PI_ast(-1)) + ((1 - ro_PI_ast) * log(PI_ast_bar)) + e_PI_ast;   %(35)
exp(Dev_nom) = (exp(q) / exp(q(-1))) * (exp(PI) / exp(PI_ast));   %(36)

p_OIL_OBS = p_OIL - p_OIL(-1);   %(37)
y_OBS = y - y(-1);   %(38)
PI_OBS = PI - steady_state(PI);   %(39)
I_OBS = I - steady_state(I);   %(40)
Dev_nom_OBS = Dev_nom - steady_state(Dev_nom);   %(41)

end;


%%% Tercera parte - Declaración de variables observables

varobs p_OIL_OBS, y_OBS, PI_OBS, I_OBS, Dev_nom_OBS;


%%% Cuarta parte - Valores iniciales (estado estacionario)
 
initval;
%steady_state_model;
 
h = h_ee;
p_T = p_T_ee;
 
p_OIL = p_OIL_ee;
y_OIL = y_OIL_ee;
R_f = R_f_ee;
R_ast = R_ast_ee;
b_ast = b_ast_ee;
R = R_ee;
p_NT = p_NT_ee;
z_T = z_T_ee;
p_NT_hat = p_NT_hat_ee;
z_I = z_I_ee;
I = I_ee;
p_T_ast = p_T_ast_ee;
PI_ast = PI_ast_ee;

w = w_ee;
q = q_ee;
PI = PI_ee;
PI_NT = PI_NT_ee;
PI_T = PI_T_ee;
c = c_ee;
lambda_1 = lambda_1_ee;
c_T = c_T_ee;
c_NT = c_NT_ee;
y_NT = y_NT_ee;
ZETA = ZETA_ee;
PSI = PSI_ee;
fi_NT = fi_NT_ee;
h_NT = h_NT_ee;
OIL_IN = OIL_IN_ee;
z_NT = z_NT_ee;
h_T = h_T_ee;
y_T = y_T_ee;
y = y_ee;
OIL_OUT = OIL_OUT_ee;
Dev_nom = Dev_nom_ee;

p_OIL_OBS = 0;
y_OBS = 0;
PI_OBS = 0;
I_OBS = 0;
Dev_nom_OBS = 0;

end;
resid;
steady;
check;  
%return;


%%% Quinta parte - Choques
 
shocks;
var e_p_OIL; stderr 0.1591;
var e_y_OIL; stderr 0.0041;
var e_R_f; stderr 0.0017;
var e_z_T; stderr 0.007;
var e_z_NT; stderr 0.0078;
var e_z_I; stderr 0.0038;
var e_p_T_ast; stderr 0.0035;
var e_PI_ast; stderr 0.0535;
end;


%%% Sexta parte - Computación del modelo
 
stoch_simul(irf=40,order=1);