//************************************************
// Master Thesis 
//
// ---------------
// Donat Bünger
//
// stochastic
//************************************************



// 1. Declare variables and parameters
// -----------------------------------

var  
mc rk w K L Y X_pnr X_pnu X_pdr X_pdu E_u E_r pi u z I K_bar q C_u C_r r zeta X_wnu X_wnr X_wdu X_wdr rl B B_L T e_B yg s1 s2 s3 s4 e_m;// 

varexo eps_B eps_m;


parameters 
alpha beta_u beta_r zeta_p lam_f omega_r omega_u delta gamma A a_2 S_2 h sigma_u sigma_r zeta_w v lam_w chi_w kappa pi_s N M sigma_B 
rho_B phi_T rho_r phi_pi phi_y sigma_m zeta_2 rho_z sigma_z rho_zeta 

chi_p R_L q_u rk_s zeta_s I_s K_bar_s T_s C_u_s C_r_s BL_s B_s;


// 2. Calibrate parameters values
// -----------------------------------




alpha       =0.33;
beta_u      =0.997558;     
zeta_s      =0.001806;
beta_r      =beta_u/(1+zeta_s);

zeta_p      =0.5;
lam_f       =1.45;     
omega_r     =0.2666;
omega_u     =0.7334;
delta       =0.025;
A           =0.918;      
a_2         =0.1836;
S_2         =3.917;
sigma_u     =1.8360;
sigma_r     =1.8360;
zeta_w      =0.5;      
v           =1.9585;
lam_w       =1.05;
h           =0.6029;
chi_w       =0.6143;

gamma       = 0.00616675;
kappa       = 0.00483;
pi_s        = 0.00489625;



N           =0.9867;
M           =0.918;
sigma_B     =-0.3433;
rho_B       =0.8135;
phi_T       =1.4448;
rho_r       =0.7068;
phi_pi      =1.7026;
phi_y       =0.3672;      
sigma_m     =0.17;      
zeta_2      =0.012846;
rho_z       =0.3857;
sigma_z     =0.3433;


rho_zeta    =0.8135;



chi_p      = omega_u / (omega_u + omega_r*(((1-beta_u*zeta_p)/(1-beta_r*zeta_p))*(1/A)));
rk_s       = (1/((omega_u*A*beta_u+omega_r*beta_r)/(omega_u*A+omega_r)))*exp(gamma)-(1-delta);
    

q_u        = 1/(1+((omega_r/omega_u)*(1/A)));
R_L        = (exp(gamma)*pi_s+1)/beta_r;

I_s        = (exp(gamma)-(1-delta))*(alpha/(1+lam_f))*(1/rk_s);
BL_s       = (zeta_s)^(1/rho_zeta)*(R_L-kappa);
B_s        = BL_s/N;
T_s        = (-1)*(1-(1/beta_u))*B_s-((1/(R_L-kappa))-(R_L/(R_L-kappa))*(1/(pi_s*exp(gamma))))*BL_s;
C_r_s      =(1-I_s)/(omega_u*M+omega_r);
C_u_s      = M*C_r_s;
K_bar_s    = exp(gamma)*(alpha/(1+lam_f))*(1/rk_s);

    

// 4. Declare the model's dynamics
// -----------------------------------

model(linear);
    

//1. real marginal cost
    mc        = alpha*rk + (1-alpha)*w;                                                             //equation 1

//2. Capital demand
    K     = w - rk + L;                                                                             //equation 2

//3. Technology
    Y         = alpha*K + (1-alpha)*L;                                                              //3

//4. Price setting: p=price n=nominator, d= denominator, u=unrestricted, r= restricted p=price
    X_pnu      = (1-beta_u*zeta_p)*(E_u+Y+mc) + beta_u*zeta_p*(((1+lam_f)/lam_f)*pi(1)+X_pnu(1));   //4
    X_pnr      = (1-beta_r*zeta_p)*(E_r+Y+mc) + beta_r*zeta_p*(((1+lam_f)/lam_f)*pi(1)+X_pnr(1));   //5
    X_pdu      = (1-beta_u*zeta_p)*(E_u+Y) + beta_u*zeta_p*((1/lam_f)*pi(1)+X_pdu(1));              //6
    X_pdr      = (1-beta_r*zeta_p)*(E_r+Y) + beta_r*zeta_p*((1/lam_f)*pi(1)+X_pdr(1));              //7

//5. LOM prices (eq.8)
    pi         = ((1-zeta_p)/zeta_p)*(chi_p*X_pnu + (1-chi_p)*X_pnr - chi_p*X_pdu - (1-chi_p)*X_pdr);    //8

//6. Effective capital (9)
    K          = -z + u + K_bar(-1);                                                                     //9

//7. LOM capital
    K_bar      = (1-delta)*exp((-1)*gamma)*(K_bar(-1)-z) + (1-(1-delta)*exp((-1)*gamma))*I;             //10

//8. Capital utilization   
     rk*rk_s         = u*a_2;                                                                           //11

//9. LOM of Q                                                                                           //12
      q          = ((omega_u*A*beta_u+omega_r*beta_r)/(omega_u*A+omega_r))*exp((-1)*gamma)*(rk_s*rk(1)+(1-delta)*q(1)) - z(1) + q_u*(((1+zeta_s)/(1+q_u*zeta_s))*E_u(1)-E_u) 
                  + (1-q_u)*(((1/(1+q_u*zeta_s))*E_r(1)-E_r));
 

//10. Investment decision                                                                               //13
     0         = q - exp(2*gamma)*S_2*(z+I-I(-1)) + ((omega_u*A*beta_u+omega_r*beta_r)/(omega_u*A+omega_r))*exp(2*gamma)*S_2*(z(1)+I(1)-I); 

//11. marginal utilities
      E_r       = (1/(1-beta_r*h))*(-1)*(sigma_r/(1-h))*((1+beta_r*h*h)*C_r-beta_r*h*C_r(1)-h*C_r(-1)); //14
      E_u       = (1/(1-beta_u*h))*(-1)*(sigma_u/(1-h))*((1+beta_u*h*h)*C_u-beta_u*h*C_u(1)-h*C_u(-1)); //15

//12. Euler equation, unconstrained, short-term bonds
      E_u       = r + E_u(1)-z(1)-pi(1);                                                                //16

//13. Euler equation, unconstrained, long-term bonds  
      zeta+E_u  = (R_L/(R_L-kappa))*rl + E_u(1)-z(1)-pi(1)-(kappa/(R_L-kappa))*rl(1);                   //17

//14. Euler equation, constrained, long-term bonds (eq 21)
      E_r       = (R_L/(R_L-kappa))*rl + E_r(1)-z(1)-pi(1)-(kappa/(R_L-kappa))*rl(1);                   //18


//15. Wage setting
      X_wnu    = (1-zeta_w*beta_u)*((1+v)*L + ((1+lam_w)/lam_w)*(1+v)*w) + zeta_w*beta_u*(((1+lam_w)/lam_w)*(1+v)*(pi(1)+z(1))+X_wnu(1)); //19
      X_wnr    = (1-zeta_w*beta_r)*((1+v)*L + ((1+lam_w)/lam_w)*(1+v)*w) + zeta_w*beta_r*(((1+lam_w)/lam_w)*(1+v)*(pi(1)+z(1))+X_wnr(1)); //20
      X_wdu    = (1-zeta_w*beta_u)*(E_u + L + ((1+lam_w)/lam_w)*w) + zeta_w*beta_u*((1/lam_w)*(pi(1)+z(1))+X_wdu(1));                     //21
      X_wdr    = (1-zeta_w*beta_r)*(E_r + L + ((1+lam_w)/lam_w)*w) + zeta_w*beta_r*((1/lam_w)*(pi(1)+z(1))+X_wdr(1));                     //22

//16. LOM wages
      w        = (1-zeta_w)*(1/(1+((1+lam_w)/lam_w)*v))*(chi_w*(X_wnu-X_wdu)+(1-chi_w)*(X_wnr-X_wdr))+zeta_w*(w(-1)-pi-z); //23

//17. Budget constraint
      B_s*B+(N/(R_L-kappa))*B_L*B_s = (1/beta_u)*B_s*(B(-1)+r(-1))+B_s*(N/(R_L-kappa))*(1/beta_r)*B_L(-1)                  //24
                              + B_s*(((1-exp((-1)*gamma)*(1/pi_s)*kappa)*R_L)/(R_L-kappa))*(N*rl/(R_L-kappa))
                              - T - B_s*((1/beta_u)+(N/(R_L-kappa))*(1/beta_r))*(z+pi);

//18. Long-term bond policy
      
       B_L = (R_L/(R_L-kappa))*rl + rho_B*(((-1)*(R_L/(R_L-kappa))*rl(-1))+B_L(-1))+e_B;                                   //25
                               e_B = sigma_B*eps_B;                                                                        //26


//19. Transfers feedback rule
      T   = T_s* (phi_T*((B(-1)+(1/(R_L-kappa))*N*B_L(-1)-(R_L/((R_L-kappa)*(R_L-kappa)))*N*rl(-1))/(1+(1/(R_L-kappa))*N))); //27
                                                                                                

//20. Monetary policy
      
 
    r  = s1(-1);  //zero-lower bound trick for 4 periods                                                                      //28
    s1 = s2(-1);                                                                                                              //29
    s2 = s3(-1);                                                                                                              //30
    s3 = s4(-1);                                                                                                              //31
    
    s4 = rho_r*r(3)+(1-rho_r)*(phi_pi*pi(4) + phi_y*(Y(4)-Y+z(1)+z(2)+z(3)+z(4)))+ e_m;                                    //32

 //r    = rho_r*r(-1)+(1-rho_r)*(phi_pi*pi + phi_y*(Y-Y(-4)+z(-3)+z(-2)+z(-1)+z))+ e_m;  
                            
    e_m = sigma_m*eps_m;                                                                                                       //33

//21. Term premium
      zeta = zeta_2*B_L;                                                                                                       //34                                                                                      //32


//22. Resource constraint
            Y = omega_u*C_u_s*C_u + omega_r*C_r_s*C_r + I_s*I                                                                  //35
                + exp((-1)*gamma)*rk_s*K_bar_s*u;                                                                       


//23. remaining shocks
            z = rho_z*z(-1);                                                                                                   //36
   
yg =Y-Y(-1); //log-linearized output growth                                                                                    //37


end;


resid(1);
steady;


// 6. Simulate the stochastic model
// ----------------------------------------


shocks;
    var eps_B = 1;

end;


check;
stoch_simul(order=1,irf=30, relative_irf, periods=500, nograph);


P = 4/(rl_eps_B-kappa);

for ii = 1:8

figure(1)
subplot(4,2,ii)

if ii == 1; jm = plot([yg_eps_B]); set(jm(1),'linestyle','-','LineWidth',1,'color',[0.4 0 0]); end

if ii == 2; jm = plot([Y_eps_B]); set(jm(1),'linestyle','-','LineWidth',1,'color',[0.4 0 0]); end

if ii == 3; jm = plot([pi_eps_B]); set(jm(1),'linestyle','-','LineWidth',1,'color',[0.4 0 0]); end

if ii == 4; jm = plot([r_eps_B]); set(jm(1),'linestyle','-','LineWidth',1,'color',[0.4 0 0]); end

if ii == 5; jm = plot([rl_eps_B]); set(jm(1),'linestyle','-','LineWidth',1,'color',[0.4 0 0]); end

if ii == 6; jm = plot([zeta_eps_B]); set(jm(1),'linestyle','-','LineWidth',1,'color',[0.4 0 0]); end

if ii == 7; jm = plot([B_L_eps_B]); set(jm(1),'linestyle','-','LineWidth',1,'color',[0.4 0 0]); end

if ii == 8; jm = plot([P]); set(jm(1),'linestyle','-','LineWidth',1,'color',[0.4 0 0]); end



if ii == 1; title('Output Growth','color','k','fontname','times','fontsize',14, 'fontweight','b'); end
if ii == 2; title('Output Level','color','k','fontname','times','fontsize',14, 'fontweight','b'); end
if ii == 3; title('Inflation','color','k','fontname','times','fontsize',14, 'fontweight','b'); end
if ii == 4; title('r (FFR)','color','k','fontname','times','fontsize',14, 'fontweight','b'); end
if ii == 5; title('rl (10 Y Yield)','color','k','fontname','times','fontsize',14, 'fontweight','b'); end
if ii == 6; title('zeta (Risk Premium)','color','k','fontname','times','fontsize',14, 'fontweight','b'); end
if ii == 7; title('BL (Long term bond holdings)','color','k','fontname','times','fontsize',14, 'fontweight','b'); end
if ii == 8; title('Long-term bond market value (PL)','color','k','fontname','times','fontsize',14, 'fontweight','b'); end

if ii == 1; xlabel('Quarters after shock','color','k','fontname','times','fontsize',11); ylabel('Deviation from SS','color','k','fontname','times','fontsize',11);end
if ii == 2; xlabel('Quarters after shock','color','k','fontname','times','fontsize',11); ylabel('Deviation from SS','color','k','fontname','times','fontsize',11);end
if ii == 3; xlabel('Quarters after shock','color','k','fontname','times','fontsize',11); ylabel('Deviation from SS','color','k','fontname','times','fontsize',11);end
if ii == 4; xlabel('Quarters after shock','color','k','fontname','times','fontsize',11); ylabel('Deviation from SS','color','k','fontname','times','fontsize',11);end
if ii == 5; xlabel('Quarters after shock','color','k','fontname','times','fontsize',11); ylabel('Deviation from SS','color','k','fontname','times','fontsize',11);end
if ii == 6; xlabel('Quarters after shock','color','k','fontname','times','fontsize',11); ylabel('Deviation from SS','color','k','fontname','times','fontsize',11);end
if ii == 7; xlabel('Quarters after shock','color','k','fontname','times','fontsize',11); ylabel('Deviation from SS','color','k','fontname','times','fontsize',11);end
if ii == 8; xlabel('Quarters after shock','color','k','fontname','times','fontsize',11); ylabel('Deviation from SS','color','k','fontname','times','fontsize',11);end


if ii == 1; line([0 30],[0 0], 'color','k'); end
if ii == 2; line([0 30],[0 0], 'color','k'); end
if ii == 3; line([0 30],[0 0], 'color','k'); end
if ii == 4; line([0 30],[0 0], 'color','k'); end
if ii == 5; line([0 30],[0 0], 'color','k'); end
if ii == 6; line([0 30],[0 0], 'color','k'); end
if ii == 7; line([0 30],[0 0], 'color','k'); end
if ii == 8; line([0 30],[0 0], 'color','k'); end

end


//legend('without zlb','with zlb',1);