% "Asset Price Channels and Macroeconomic Fluctuations"
% XXX
% Changes from v14: Testing file
%
% Code by Jacob Smith and Diego Vilán

%----------------------------------------------------------------
% 0. Housekeeping:
%----------------------------------------------------------------

close all;
//clc;

%----------------------------------------------------------------
% 1. Define variables:
%----------------------------------------------------------------

var gmuhhat, chhat, ghatlambda, what, nhat, qlhat, lhhat, rhat, gmuehat, cehat, yhat, qkhat, gmubhat, ghatq, lehat, khat, ghatz, ihat, bhat, glambdaahat, glambdaqhat, glambdazhat, gpsihat, gthetahat, gvarphihat, gnuqhat, gnuzhat, chat, obs1, obs2, obs3, obs4, obs5, obs6;
varexo ez, enuz, eq, enuq, ea, evarphi, epsi, etheta;

parameters gbeta, galpha, glambdaq, glambdaa, ggammah, ggammae, geta, gOmega, gOmegah, gOmegae, gtheta, gdelta, gphi qlLeOY, CeOY, ChOY, qlLeOB,
iy, ky, gmuboe, by, r, lbar, LhOLe, Le, Lh, grhoz, grhonuz, grhoq, grhonuq, grhoa, grhovarphi, grhopsi, grhotheta, sigma, qlLhOY, COY, CeOC, ChOC, glambdastar, n_bar, ik, glambdaK;

%----------------------------------------------------------------
% 2. Calibration - Deep parameters:
%----------------------------------------------------------------

gbeta = 0.98;
geta = 0.0;         
r = 1.01;
by = 2.52;
ky = 5.40;
ik =  0.148/4;
qlLeOY = 2.60;
qlLhOY = 4.5664;
n_bar = 0.22;
lbar = 1;
//sigma = 0.1;
//g = 1.005;  
//yk = 1/ky;
//glambdaq = 1.01;
//ggammah = 0.7;
//ggammae = 0.7;
//glambdastar = 1.0045; 
//gOmega = 2.0;
//grhoz = 0.1;
//grhonuz = 0.9;
//grhoq = 0.1;
//grhonuq = 0.9;
//grhoa = 0.9;
//grhovarphi = 0.9; 
//grhopsi = 0.9;
//grhotheta = 0.9;

%----------------------------------------------------------------
% 3. Calibration - Parameters:
%----------------------------------------------------------------

glambdaK = glambdaq*glambdastar;
gtheta = by/(glambdastar*qlLeOY+ky/glambdaq);
// gtheta = 0.3166;
gdelta = 1-(1-ik)*glambdastar*glambdaq; 
glambdaa = glambdastar/(gbeta*r)-1;
//glambdaa = 0.00154;
galpha =  (1-gbeta-gbeta*glambdaa*gtheta)*qlLeOY/gbeta  + (1-gbeta*glambdaa*gtheta/glambdaK-gbeta*(1-gdelta)/glambdaK)*ky/gbeta;
//galpha = 0.3246;
gphi =  qlLeOY*(1-gbeta*(1+glambdaa*gtheta))/(gbeta*galpha);
//gphi = 0.1245;
iy = ik*ky;
//iy = 0.1998;
CeOY =  galpha-iy-by*(1-gbeta*(1+glambdaa))/glambdastar; 
//CeOY = 0.0784;
ChOY =  1-CeOY-iy; 
//ChOY = 0.7218;
COY = CeOY + ChOY;
CeOC = CeOY/COY; 
ChOC = ChOY/COY;
gmuboe =  gbeta*glambdaa/glambdastar;
//gmuboe = 0.0015;
LhOLe = qlLhOY/qlLeOY;
qlLeOB = qlLeOY/by;
//qlLeOB = 1.0317;
Le = 1/(1+LhOLe);
Lh = 1-Le;
gOmegah =  (glambdastar-gbeta*(1+glambdaa)*ggammah)*(glambdastar-ggammah);
//gOmegah = 0.0970;
gOmegae =  (glambdastar-gbeta*ggammae)*(glambdastar-ggammae);
//gOmegae = 0.0973;

%----------------------------------------------------------------
% 4. The Model:
%----------------------------------------------------------------

model(linear);

gOmegah * gmuhhat = -(glambdastar^2+ggammah^2*gbeta*(1+glambdaa))*chhat+glambdastar*ggammah*(chhat(-1) - ghatlambda)-gbeta*glambdaa*ggammah*(glambdastar-ggammah)*glambdaahat(+1)+gbeta*(1+glambdaa)*glambdastar*ggammah*(chhat(+1)+ghatlambda(+1));
what + gmuhhat = gpsihat + geta*nhat;
qlhat + gmuhhat = gbeta*(1+glambdaa)*(gmuhhat(+1)+qlhat(+1))+(1-gbeta*(1+glambdaa))*(gvarphihat-lhhat)+gbeta*glambdaa*glambdaahat(+1);
gmuhhat - rhat = gmuhhat(+1)+ (glambdaa/(1+glambdaa))*glambdaahat(+1) - ghatlambda(+1);
gOmegae * gmuehat = -(glambdastar^2 + gbeta*ggammae^2)*cehat + glambdastar*ggammae*(cehat(-1)-ghatlambda)+gbeta*glambdastar*ggammae*(cehat(+1)+ghatlambda(+1));
what = yhat - nhat;
qkhat = (1 + gbeta)*gOmega*glambdastar^2*ihat*glambdaq^2 - gOmega*glambdastar^2*ihat(-1)*glambdaq^2 + gOmega*glambdastar^2*glambdaq^2*(ghatlambda + ghatq) - gbeta*gOmega*glambdastar^2*glambdaq^2*(ihat(+1)+ghatlambda(+1)+ghatq(+1));
qkhat + gmuehat = gmuboe*(gtheta/glambdaq)*(gmubhat + gthetahat)+((gbeta*(1-gdelta))/glambdastar*glambdaq)*(qkhat(+1)+ ghatq(+1)+ghatlambda(+1))+(1-gmuboe*(gtheta/glambdaq))*gmuehat(+1)+ gmuboe*(gtheta/glambdaq)*(qkhat(+1)-ghatq(+1))+gbeta*galpha*(1-gphi)*(1/ky)*(yhat(+1)-khat);
qlhat + gmuehat = gmuboe*glambdastar*gtheta*(gthetahat + gmubhat)+(1-gmuboe*glambdastar*gtheta)*gmuehat(+1)+ gmuboe*glambdastar*gtheta*(qlhat(+1)+ghatlambda(+1))+gbeta*qlhat(+1)+(1-gbeta-gbeta*gtheta*glambdaa)*(yhat(+1)-lehat);
gmuehat - rhat = (1/(1+glambdaa))*(gmuehat(+1)-ghatlambda(+1)+glambdaa*gmubhat);
yhat = galpha*gphi*lehat(-1)+ galpha*(1-gphi)*khat(-1)+ (1-galpha)*nhat - (ghatq + ghatz)*((1-gphi)*galpha/(1-(1-gphi)*galpha));
khat = ((1-gdelta)/(glambdastar*glambdaq))*(khat(-1)- ghatlambda - ghatq)+(1-((1-gdelta)/(glambdastar*glambdaq)))*ihat;
yhat = ChOY*chhat + CeOY*cehat + iy*ihat;
0 = (Lh/lbar)*lhhat + (Le/lbar)*lehat;
galpha*yhat = CeOY*cehat + iy*ihat + qlLeOY*(lehat-lehat(-1))+(1/glambdastar)*by*(bhat(-1)-ghatlambda)- (1/r)*by*(bhat-rhat);
bhat = gthetahat + glambdastar*gtheta*qlLeOB*(qlhat(+1)+ lehat - ghatlambda(+1)) + (1 - glambdastar*gtheta*qlLeOB)*(qkhat(+1)+khat-ghatq(+1));
ghatz = glambdazhat + gnuzhat - gnuzhat(-1);
ghatq = glambdaqhat + gnuqhat - gnuqhat(-1);
ghatlambda = (1/(1-(1-gphi)*galpha))*ghatz + (((1-gphi)*galpha)/((1-(1-gphi)*galpha)))*ghatq;
glambdazhat = grhoz*glambdazhat(-1)+ ez;
gnuzhat = grhonuz*gnuzhat(-1)+ enuz;
glambdaqhat = grhoq*glambdaqhat(-1) + eq;
gnuqhat = grhonuq*gnuqhat(-1) + enuq;
glambdaahat = grhoa*glambdaahat(-1) + ea;
gvarphihat = grhovarphi*gvarphihat(-1) + evarphi; 
gpsihat = grhopsi*gpsihat(-1)+ epsi; 
gthetahat = grhotheta*gthetahat(-1)+ etheta;
chat = CeOC* cehat + ChOC*chhat;
obs1 = log(glambdastar)+ bhat - bhat(-1)+ (1/1 -(1 - gphi)*galpha)*(glambdazhat + gnuzhat - gnuzhat(-1) + (1 - gphi)*galpha*(glambdaqhat + gnuqhat - gnuqhat(-1)));          //(nonfinancial business debt per capita)
obs2 = log(glambdastar)+ (ihat - ihat(-1)) + (1/1 -(1 - gphi)*galpha)*(glambdazhat + gnuzhat - gnuzhat(-1) + (1 - gphi)*galpha*(glambdaqhat + gnuqhat - gnuqhat(-1)));      //(investment (in consumption units) per capita)
obs3 = log(glambdastar) + (qlhat - qlhat(-1)) + (1/1 -(1 - gphi)*galpha)*(glambdazhat + gnuzhat - gnuzhat(-1) + (1 - gphi)*galpha*(glambdaqhat + gnuqhat - gnuqhat(-1)));   //(land price)
obs4 = log(glambdaq) + glambdaqhat + gnuqhat - gnuqhat(-1);                                                                                                                 //(inverse of the relative price of investment)
obs5 = (ChOY/COY)*(chhat - chhat(-1))+ (CeOY/COY)*(cehat - cehat(-1)) + (1/1 -(1 - gphi)*galpha)*(glambdazhat + gnuzhat - gnuzhat(-1) + (1 - gphi)*galpha*(glambdaqhat + gnuqhat - gnuqhat(-1)));  //(consumption per capita)
obs6 = log(n_bar)+ nhat; //(hours (percent of 24 hours) per capita)
end;

varobs obs1, obs2, obs3, obs4, obs5, obs6;

%----------------------------------------------------------------
% 5. Computation:
%----------------------------------------------------------------


initval;
lhhat = (4.5664/4)*yhat; 
lehat = (2.60/4)*yhat; 
khat = (5.40/4)*yhat; 
ihat = yhat*(0.148/4); 
bhat = (2.52/4)*yhat; 
nhat = 0.22; 
gmuhhat = 0.1;
chhat = 0.1; 
ghatlambda = 0.1; 
what = 0.1; 
qlhat = 0.1; 
rhat = 1.01; 
gmuehat = 0.1; 
cehat = 0.1; 
qkhat = 0.1; 
gmubhat = 0.1; 
ghatq = 0.1; 
ghatz = 0.1; 
glambdaahat = 0.1; 
glambdaqhat = 0.1; 
glambdazhat = 0.1;
gpsihat = 0.1; 
gthetahat = 0.1; 
gvarphihat = 0.1; 
gnuqhat = 0.1; 
gnuzhat = 0.1;
ez = 0; 
enuz = 0; 
eq = 0; 
enuq = 0; 
ea = 0; 
evarphi = 0; 
epsi = 0; 
etheta = 0;
//yhat = 0.1;
end;


steady;
check;

%----------------------------------------------------------------
% 6. Estimation:
%----------------------------------------------------------------

estimated_params;
glambdaq,       gamma_pdf,      1.816,  3.0112;
glambdastar,    gamma_pdf,      1.816,  3.0112;
ggammah,        beta_pdf,       1.0,    2.0;   
ggammae,        beta_pdf,       1.0,    2.0;
gOmega,         gamma_pdf,      1.0,    0.5;
grhoz,          gamma_pdf,      1.0,    2.0;
grhonuz,        gamma_pdf,      1.0,    2.0;
grhoq,          gamma_pdf,      1.0,    2.0;
grhonuq,        gamma_pdf,      1.0,    2.0;
grhoa,          gamma_pdf,      1.0,    2.0;
grhovarphi,     gamma_pdf,      1.0,    2.0;
grhopsi,        gamma_pdf,      1.0,    2.0;
grhotheta,      gamma_pdf,      1.0,    2.0;
stderr ez,      inv_gamma_pdf,  0.0016, inf;
stderr enuz,    inv_gamma_pdf,  0.0016, inf;
stderr eq,      inv_gamma_pdf,  0.0016, inf;
stderr enuq,    inv_gamma_pdf,  0.0016, inf;
stderr ea,      inv_gamma_pdf,  0.0016, inf;
stderr evarphi, inv_gamma_pdf,  0.0016, inf;
stderr epsi,    inv_gamma_pdf,  0.0016, inf;
stderr etheta,  inv_gamma_pdf,  0.0016, inf; 
end;

estimated_params_init;
glambdaq,                 1.2789945000;
glambdastar,              0.6031216600;
ggammah,                  0.3998073600;
ggammae,                  0.6574084000;
gOmega,                   0.2936255400;
grhoa,                    0.9158842800;
grhoz,                    0.4480247600;
grhonuz,                  0.4371422800;
grhoq,                    0.7512594000;
grhonuq,                  0.7512221300;
grhovarphi,               0.9997822800;
grhopsi,                  0.9834809400;
grhotheta,                0.9802902600;
stderr ea,                0.1074987400;
stderr ez,                0.0032192108;
stderr enuz,              0.0043396775;
stderr eq,                0.0029014840;
stderr enuq,              0.0037502963;
stderr evarphi,           0.0632112430;
stderr epsi,              0.0069516930;
stderr etheta,            0.0130274290;
end;

estimated_params_bounds;
glambdastar, 0, r;
end;


%----------------------------------------------------------------
% 7. Results:
%----------------------------------------------------------------

estimation(datafile=data_tao, mh_replic=2000, mh_nblocks=2, mh_drop=0.5, mh_jscale=0.60, forecast=12) chat qkhat ihat qlhat nhat yhat;
//historicdec4 chat qkhat ihat qlhat nhat yhat +12;

