// My adjusted model based on Gerali et al. (2010)

// model with: TWO WAGES; INVESTMENT ADJ. COSTS;  VARIABLE CAPITAL UTILIZATION;  CONSUMPTION HABITS
//            STICKY BANK RATES, PRICES & WAGES à la Rotemberg with indexation to both past and st.st. inflation
// 8 blocks: 1) PATIENTs  2) IMPATIENTs  3) CAPITAL PRODUCERS  4) ENTREPRENEURS   5) BANKS   6) RETAILERS        
//           7) AGGREGATION & EQUILIBRIUM  8) EXOGENOUS PROCESSES 

grid_vi             = ( 0.09*1.02 : 0.01 : 0.10 )  ;

[n4, n_grid_vi ]    = size(grid_vi)    ;
 
counter = 0;
    
//-------------------------------------------------------------------------
// 1. Declaration of endogenous and exogenous variables 
//-------------------------------------------------------------------------
    
    var c_p h_p d_p l_p J_R c_i h_i b_i l_i I q_k c_e k_e l_pd l_id b_ee y_e d_b b_h b_e r_d r_bh r_be K_b 
    pie x C Y D BE BH B w_p w_i J_B j_B q_h K A_e ee_j m_i m_e eps_y Y1 vi weight_BH weight_BE u; // 48 variables 
      
    varexo e_A_e e_j e_me e_mi e_y e_r_ib;  // 5 varexo
    
//-------------------------------------------------------------------------
// 2. Declaration of parameters
//-------------------------------------------------------------------------
    
    parameters  beta_p j phi beta_i m_i_ss beta_e m_e_ss alpha h gamma_p gamma_i gamma_e gamma r_k_ss psi_b delta_kb kappa_kb                                         
    eps_y_ss kappa_p zeta kappa_i deltak piss vi_ss rho_A_e rho_ee_j rho_mi rho_me rho_eps_y xi_1 xi_2 x_ss mu_qp mu_k mu_qi 
    mu_ci mu_dp mu_cp mu_ce y_e_ss rho_ib phi_pie phi_y r_ib_ss eps_d r_ss;                      
                                                  
//-------------------------------------------------------------------------
// 3. Parameter calibration
//-------------------------------------------------------------------------
    
beta_p     	=	0.994550000000000	; 
beta_i     	=	0.975000000000000	; 
beta_e     	=	0.975000000000000	; 
j          	=	0.203000000000000	; 
phi        	=	1.500000000000000	;
rho_mi     	=	0.938578931344182	; 
rho_me     	=	0.910171380445550	;
m_i_ss      =   1/(1-rho_mi)        ;%??
m_e_ss      =   1/(1-rho_me)        ;%??
%m_i_ss     =	0.750000000000000	; 
%m_e_ss     =	0.400000000000000	; 
alpha      	=	0.340000000000000	; 
h          	=	1.000000000000000	;
gamma_p     =   0.4000000000000000	; 
gamma_i  	=	0.4000000000000000	; 
gamma_e    	=	0.200000000000000	;  
gamma     	=	0.800000000000000	;    
psi_b    	=	1.000000000000000	; 
delta_kb    =   0.049000000000000   ;
deltak     	=	0.040000000000000	; 
piss       	=	1.000000000000000	; 
q_k_ss      =   1.000000000000000	; 
vi_ss      	=	0.090000000000000   ;
eps_y_ss   	=	8.90000000000000	;
kappa_kb   	=	11.0683         	; 
kappa_p    	=	28.6502         	; 
zeta       	=	0.1605          	; 
kappa_i    	=	10.1822         	; 
rho_A_e    	=	0.9390          	; 
rho_ee_j   	=	0.909222967643905	; 
rho_mi     	=	0.938578931344182	; 
rho_me     	=	0.910171380445550	; 
rho_eps_y  	=	0.256295678347778	; 
y_e_ss      =   1                   ;   
rho_ib      =   0.7686              ;
phi_pie     =   1.9816              ;
phi_y       =   0.3459              ;
eps_d       =   -1.1                ;

r_ss        = 1/beta_p -1;
r_ib_ss     = (piss/beta_p - 1) * (eps_d-1)/eps_d ;
r_k_ss      = -(1-deltak)-m_e_ss*(1-deltak)*piss/beta_e*(1/(piss/beta_p)-beta_e/piss)+1/beta_e;
xi_1        = r_k_ss ; 
xi_2        = 0.1 * r_k_ss ;
x_ss        = eps_y_ss / (eps_y_ss - 1) ;

mu_qp = j / (1-beta_p);
mu_k  = (alpha*beta_e) / (1 - beta_e*(1-deltak) - (m_e_ss * (1-deltak) * (beta_p - beta_e)));
mu_qi = j / (1-(beta_i * (1-m_i_ss)) - (m_i_ss * beta_p));
mu_ci = (gamma_e*(1-alpha)*(1-gamma)) / (gamma_i*(1-mu_qi*m_i_ss*(beta_p-1)));
mu_dp = ((gamma_p/gamma_e) * (mu_k*m_e_ss*beta_p*(1-deltak)) + ((gamma_p/gamma_i) * (mu_qi*m_i_ss*beta_p*mu_ci)));
mu_cp = ((1-alpha) * gamma * gamma_e / gamma_p) + (gamma_e*(x_ss-1)) + (mu_dp * (beta_p-1) / beta_p);
mu_ce = alpha + mu_k * ((m_e_ss*(beta_p-1)*(1-deltak))-deltak);

     
//-------------------------------------------------------------------------
// 4. The MODEL
//-------------------------------------------------------------------------

model;

////***********   1) PATIENT HHs ********************************************************
 
    (exp(q_h) / exp(c_p)) = ((j * (exp(ee_j))) / exp(h_p)) + ((beta_p * exp(q_h(+1))) / exp(c_p(+1)));
    
    1 / exp(c_p) = beta_p * ((1+exp(r_d)) / (exp(pie(+1)) * exp(c_p(+1))));
    
    exp(w_p) = (exp(l_p) ^ (phi)) * exp(c_p);
    
    exp(c_p) + (exp(q_h) * (exp(h_p) - exp(h_p(-1)))) + exp(d_p) = exp(w_p) * exp(l_p) 
            + (((1+exp(r_d(-1))) * exp(d_p(-1))) / exp(pie)) + (exp(J_R)/gamma_p) ;  //4
    
////***********   2) IMPATIENT HHs ********************************************************
    
    (exp(q_h) / exp(c_i)) = ((j * (exp(ee_j))) / exp(h_i)) + ((exp(m_i) * exp (q_h(+1)) * exp(pie(+1))) / ((1+exp(r_bh)) * (exp(c_i)))) + ((beta_i * (exp (q_h(+1)) * (1-exp(m_i)))) / (exp(c_i(+1))));
    
    exp(w_i) = (exp(l_i) ^ (phi)) * exp(c_i);

    ((1+exp(r_bh)) * exp(b_i)) = (exp(m_i) * exp(q_h(+1)) * exp(h_i) * exp(pie(+1)));

    exp(c_i) + (exp(q_h) * (exp(h_i) - exp(h_i(-1)))) + (((1+exp(r_bh(-1)))*exp(b_i(-1)))/exp(pie)) = (exp(w_i) * exp(l_i)) + exp(b_i)  ; //8
        
////***********  3) CAPITAL PRODUCERS *****************************************************
   
    exp(K) = ((1-deltak) * exp(K(-1))) + ( 1 - kappa_i/2 * (exp(I)/exp(I(-1)) - 1)^2 ) * exp(I) ;
    
    1 / exp(q_k) = ( 1 -  kappa_i/2 * (exp(I)/exp(I(-1)) - 1)^2  - kappa_i * (exp(I)/exp(I(-1)) - 1) * (exp(I)/exp(I(-1))) )
    + (beta_e * (exp(c_e) / exp(c_e(+1))) * (exp(q_k(+1)) / exp(q_k)) * kappa_i * (exp(I(+1))/exp(I) - 1) * (exp(I(+1))/exp(I))^2) ; // 10
    
////************  4) ENTREPRENEURS *********************************************************
    
    exp(w_p) = ((1-alpha) * gamma * exp (y_e)) / ( exp(l_pd) * exp(x) );
    
    exp(w_i) = ((1-alpha) * (1-gamma) * exp(y_e)) / ( exp(l_id) * exp(x) );
    
    (xi_1 + xi_2 * exp(u-1)) = (alpha * exp(A_e) * (exp(k_e(-1)) * exp(u))^(alpha-1) * ( exp(l_pd)^(gamma) * exp(l_id)^(1-gamma) ) ^ (1-alpha)) / exp(x);
    
    (exp(q_k) / exp(c_e))-(((exp(m_e) * exp(q_k(+1)) * exp(pie(+1)) * (1-deltak)) / ((1+exp(r_be)) * exp(c_e)))) = beta_e * (1 / exp(c_e(+1))) * (((alpha * exp(A_e(+1)) * 
    exp(k_e)^(alpha-1) * exp(u(+1))^(alpha) * ( exp(l_pd)^(gamma) * exp(l_id)^(1-gamma) ) ^ (1-alpha)) / 
    exp(x(+1))) + exp(q_k(+1)) * (1-deltak)-(xi_1*(exp(u(+1))-1)+(xi_2/2)*(exp(u(+1))-1)^2) - (exp(m_e) * exp(q_k(+1)) *(1-deltak)));
    
    exp(y_e) = exp(A_e) * (exp(k_e(-1)) * exp(u))^(alpha) * ( exp(l_pd)^gamma * exp(l_id)^(1-gamma) ) ^ (1-alpha);

    (1+exp(r_be)) * exp(b_ee) = exp(m_e) * exp(q_k(+1)) * exp(pie(+1)) * exp(k_e) * (1-deltak);

    exp(c_e) + ((1+exp(r_be(-1))) * exp(b_ee(-1)) / exp(pie) ) +  (exp(w_p)*exp(l_p) + exp(w_i)*exp(l_i)) + exp(q_k) * exp(k_e) + (xi_1*(exp(u)-1)+(xi_2/2)*(exp(u)-1)^2) =
    (exp(y_e) / exp(x)) + exp(b_ee) + exp(q_k) * (1-deltak) * exp(k_e(-1))  ;    //17
    
////*************  5)BANKS ****************************************************************
    
    exp(r_be) = - kappa_kb * ( exp(K_b) / exp(B) - exp(vi) ) * (exp(K_b)/exp(B)) ^2  + exp(r_d) ;    
    exp(r_bh) = - kappa_kb * ( exp(K_b) / exp(B) - exp(vi) ) * (exp(K_b)/exp(B)) ^2  + exp(r_d) ;
    
    exp(K_b) * exp(pie) = (1-delta_kb) * exp(K_b(-1))  + exp(j_B(-1)) ;
    
    psi_b * exp(d_b)  = gamma_p * exp(d_p);
    psi_b * exp(b_h)  = gamma_i * exp(b_i);
    psi_b * exp(b_e)  = gamma_e * exp(b_ee);
    
    %(exp(b_h) + exp(b_e))  = ( exp(d_b) + exp(K_b) ) ; //24
    
    %exp(vi) =  ((vi_ss)^( 1-0.92 ) ) * ( (exp(b_h)+ exp(b_e))/exp((Y1(-4)))  )^( (1-0.92)*0.1 )* exp( vi(-1) )^0.92 ;% Countercyclical Capital Buffer Equation
    
    exp(vi) = ( vi_ss ^( 1-0.92 ) ) * ( exp(Y)/exp(Y(-4)) )^( ( 1 - 0.92 )  )* exp( vi(-1) )^0.92;
         
    exp(weight_BH) = ( 1 ^( 1-0.94 ) ) * ( exp(Y1) / exp(Y1(-4)) )^( ( 1 - 0.94 ) * ( - 10 * 1 ) ) * exp( weight_BH(-1) )^0.94;

    exp(weight_BE) = ( 1 ^( 1-0.92 ) ) * ( exp(Y1)/exp(Y1(-4)) )^(( 1 - 0.92 ) * ( - 15 * 1  ))* exp( weight_BE(-1) )^0.92;
    
    exp(j_B) = exp(r_bh) * exp(b_h) + exp(r_be)  *  exp(b_e) - exp(r_d)  *  exp(d_b) - kappa_kb/2 * ( ( exp(K_b) / exp(B)  - exp(vi) ) ^2) * exp(K_b); //28 not including % countercyclical cbe
    
////***********  6)RETAILERS **************************************************************
    
    exp(J_R)  = exp(Y) * (1 - (1/exp(x)) - (kappa_p/2) * (exp(pie) - ( (exp(pie(-1)) ^ zeta) * (piss ^ (1-zeta)) ))^2 ) ;
    
    1 - exp(eps_y) + exp(eps_y) / exp(x) - kappa_p * (exp(pie) - ( exp(pie(-1)) ^ zeta * piss ^ (1-zeta))) * exp(pie)
    + beta_p * (exp(c_p) / exp(c_p(+1)))* kappa_p * (exp(pie(+1)) - ( exp(pie)     ^ zeta * piss ^ (1-zeta))) * exp(pie(+1)) * (exp(Y(+1))/exp(Y)) = 0; //%30
    
////************ 7) AGGREGATION & EQUILIBRIUM  ************************************************
    
    exp(C)              = gamma_p * exp(c_p) + gamma_i * exp(c_i) + gamma_e * exp(c_e);
    exp(BH)             = psi_b * exp(b_h);
    exp(BE)             = psi_b * exp(b_e);
    exp(B)              = ( exp(weight_BH) * exp(BH) + exp(weight_BE) * exp(BE) );
    exp(D)              = gamma_p * exp(d_p);
    exp(Y)              = gamma_e * exp(y_e);
    exp(J_B)            = psi_b * exp(j_B);
    gamma_e * exp(l_pd) = gamma_p * exp(l_p);
    gamma_e * exp(l_id) = gamma_i * exp(l_i);
    h                   = gamma_p * exp(h_p) + gamma_i * exp(h_i);
    exp(K)              = gamma_e * exp(k_e);
    exp(Y1)             = exp(C) + 1 * (exp(K)-(1-deltak)*exp(K(-1))) ;
    exp(Y)              = exp(C) + exp(q_k) * (exp(K)-(1-deltak)*exp(K(-1))) + (delta_kb + kappa_kb/2* ( exp(K_b) / exp(B)  - exp(vi) ) ^2)* exp(K_b(-1))
           + (xi_1*(exp(u)-1) + xi_2/2*((exp(u)-1)^2))* exp(k_e(-1))+ kappa_p/2  * (  exp(pie) - ( exp(pie(-1)) ^ (zeta) * piss ^ (1-zeta) ))^2 * exp(Y); //43 

////***********  8) TAYLOR RULE & PROFITS CB *****************************************************
    
    (1+exp(r_d)) = (1+r_ss)^(1-0) * (1+exp(r_d(-1)))^rho_ib *  
    (( exp(pie) / piss) ^phi_pie * (exp(Y)/exp(Y(-1)))^phi_y  ) ^ (1-rho_ib) * exp(e_r_ib) ;//   43
           
////***********  9) EXOGENOUS PROCESSES **********************************************************
    
    exp(A_e)      = 1 - rho_A_e    *    1          + rho_A_e    * exp(A_e(-1))     + e_A_e;
    exp(ee_j)     = 1 - rho_ee_j   *    1          + rho_ee_j   * exp(ee_j(-1))    + e_j;
    exp(m_i)      = (1-rho_mi)     *  m_i_ss       + rho_mi     * exp(m_i(-1))     + e_mi;
    exp(m_e)      = (1-rho_me)     *  m_e_ss       + rho_me     * exp(m_e(-1))     + e_me;
    exp(eps_y)    = (1-rho_eps_y)  * eps_y_ss      + rho_eps_y  * exp(eps_y(-1))   + e_y; //48

end;

//-------------------------------------------------------------------------
// 5. Initial guesses for steady state computation
//-------------------------------------------------------------------------

%initval;
%c_p = mu_cp * (y_e_ss / x_ss) ;
%h_p = (gamma * mu_qp * mu_cp) / ((gamma * mu_qp * mu_cp) + ((1-gamma) * mu_qi * mu_ci)) ;
%q_h = mu_qp * (c_p / h_p) ; 
%d_p = mu_dp * (y_e_ss / x_ss) ;
%c_i = mu_ci * (y_e_ss / x_ss) ;
%h_i = ((1-gamma) * mu_qi * mu_ci) / ((gamma * mu_qp * mu_cp) + ((1-gamma) * mu_qi * mu_ci)) ;
%q_h = mu_qi * (c_i / h_i) ; 
%b_i = mu_qi * m_i_ss * beta_p * c_i ; 
%k_e = mu_k * (y_e_ss / (x_ss * q_k_ss)) ;
%b_ee = mu_k * m_e_ss * beta_p * (1-deltak) * (y_e_ss / x_ss) ;
%c_e = mu_ce * (y_e_ss / x_ss) ;
%I = deltak * k_e ;
%j_B = 0 ;
%y_e_ss = 1;

%end;
resid (1);
steady ;
check;
//-------------------------------------------------------------------------
// 6. Specification of shocks
//-------------------------------------------------------------------------

shocks; 
var e_A_e = 0.00512426105215156^2;
var e_j = 0.0666521707690898^2;
var e_mi = 0.00243843645883989^2;
var e_me = 0.00325455234425937^2;
var e_y = 0.620300719165277^2;  
var e_r_ib = 0.00157434820106446^2;   
end;

%ramsey_policy (periods=100,order=1,planner_discount=((beta_p^gamma_p) * (beta_i^gamma_i) * (beta_e^gamma_e))) ;  
%planner_objective gamma_p * (log (c_p) + j * log (h_p) - ((l_p^(1+phi))/(1+phi))) + gamma_i * (log (c_i) + j * log (h_i) - ((l_i^(1+phi))/(1+phi))) + gamma_e * (log (c_e));

stoch_simul(periods=10000, irf=100); 
    