%**************************************************************************************************
%                      EXCHANGE RATE DYNAMICS IN NEW-KEYNESIAN DSGE MODELS                        *
%                                 Yamin Ahmad, UW-Whitewater                                      *
%                           Ming Chien Lo, St. Cloud State University                             *
%                            Olena Mykhaylova, University of Richmond                             *
%                                           June 2010                                             *
%**************************************************************************************************


% Most variables are expressed in logs, except for
%    optimal price and wage setting variables and dispersion terms;
%    interest rates int and ints;
%    governments transfers (tr and trs);
%    Lagrange multipliers ksi and ksis;
%    home bias parameters mu(i).


%periods     5500;              % For simulated variables

var         % Foreign variables end in "s"
            y, ys,              % GDPs
            c, cs,              % Consumption
            invt, invts,        % Capital investment
            g, gs,              % Government spending
            ch, cf,             % Home consumption of home and foreign goods, respectively
            cfs, chs,           % Foreign consumption of foreign and home goods, respectively
            invh, invf,         % Home investment of home and foreign goods, respectively
            invfs, invhs,       % Foreign investment of foreign and home goods, respectively
            gh, gf,             % Home gov't spending on home and foreign goods, respectively
            ghs, gfs,           % Foreign gov't spending on foreign and home goods, respectively
            infl, infls,        % CPI inflations
            ph, pfs,            % Real price of H goods, delated by H CPI, and F goods, deflated by F CPI
            infh, inffs,        % Growth rates of ph and pfs, respectively (PPI inflations)
            phn, pbh, pah,      % Home optimal price for sale in H (phn) and its components
            pfsn, pafs, pbfs,   % Foreign optimal price for sale in F (pfsn) and its components
            DPh, DPfs,          % Price dispersions
            rer, delS,          % RER (from perspective of H) and NER (growth rate)
            tot,                % Terms of trade (from perspective of H)
            w, ws,              % Wages
            wn, wb, wa,         % Home optimal wage and its components
            wsn, wbs, was,      % Foreign optimal wage and its components
            l, ls,              % Labor efforts
            winfl, winfls,      % Wage inflations
            r, rs,              % Returns on capital
            k, ks,              % Capital stocks
            z, zs,              % Solow residuals
            mc, mcs,            % Marginal costs
            yh, yhs,            % Output of H good for sale in H and F, respectively
            yfs, yf,            % Output of F good for sale in F and H, respectively
            int, ints,          % Interest rates (central bank instruments)
            tr, trs,            % Government transfers (lump-sum tax)
            lam, lams,          % Marginal utilities of comsumption
            ksi, ksis,          % Lagrange multipliers in capital accumulation decision
            mu1, mu2,           % Time-varying weights of H households on H and F goods, respetively
            mus1, mus2,         % Same for foreign households
            prefshock,          % Shock to home biases (mu1, mu2) - demand shocks
            pmark, wmark,       % Price and wage markups
            ikr, ikrs,          % Auxiliary variables, capital adjustment costs
            klr, klrs,          % Capital-labor ratios (for steady state computations)
            ilr, ilrs,          % Investment-labor ratios (for steady state computations)
            ylr, ylrs,          % Output-labor ratios (for steady state computations)
            clr, clrs,          % Consumption-labor ratios (for steady state computations)
            wrate, crate,       % Ratios of H-to-F wages and consumption, respectively
            relc, rely,         % Ratios of H-to-F consumption and output, respectively
            cr, crs,            % Consumption-to-GDP ratios
            ir, irs,            % Investment-to-GDP ratios
            kr, krs,            % Capital-to-GDP ratios
            gr, grs,            % Gov't spending-to-GDP ratios
            trr, trrs,          % Transfers-to-GDP ratios
            ishock, ishocks,
            infdif;
        
    
varexo      hepsz, fepsz,       % Shocks to home and foreign technologies
            epsp,               % Preference shock (to home biases)
            hepsg, fepsg,       % Shock to government purchases (demand)
            hepsi, fepsi;       % Shocks to monetary policy


parameters  ssmu, ssmus, eta, theta, thetas, delta, psi, psis, beta, nu, A11, A12, A21, A22,
            sig, alpha, alphas, omega, omegas, chi, phi, rhoint, gshare, gshares,
            ssy, ssys, M, Ms, rhopi, rhogap, rhoi, trials, per;

            % load  Param.mat;

            ssmu = 0.50;        % Consumption home bias in the Home country
            ssmus = 0.50;       % Consumption home bias in the Foreign country
            eta = 1.5;          % Elasticity in the final goods aggregators
            theta = 5;          % Risk aversion in the home consumer utility function
            thetas = 5;         % Risk aversion in the foreign consumer utility function
            delta = 0.021;      % Capital depreciation rate
            psi = 95;           % Coefficient in adjustment cost for home investment
            psis = 95;          % Coefficient in adjustment cost for foreign investment
            beta = 0.99;        % Discount factor
            nu = 0.33;          % Share of capital in production
            A11 = 0.95;         % Tech.: home AR(1) coefficient
            A12 = 0.00;         % Tech.: link from foreign to home technology level
            A21 = 0.00;         % Tech.: link from home to foreign technology level
            A22 = 0.95;         % Tech.: foreign AR(1) coefficient
            sig = 10;           % Elasticity in the goods varieties aggregators
            alpha = 0.75;       % Home price stickiness parameter
            omega = 0.75;       % Home wage stickiness parameter
            alphas = 0.75;      % Foreign price stickiness parameter
            omegas = 0.75;      % Foreign wage stickiness parameter
            chi = 3;            % Inverse of Frisch labor supply elasticity
            phi = 7.7;          % Elasticity in labor aggregators
            rhoint = 0.79;      % AR(1) coefficient in the Taylor rule
            rhopi = 2.15;       % Taylor coefficient in the Taylor Rule
            rhogap = 0.23;      % Coefficient on output gap in the Taylor Rule
            gshare  = 0.20;     % Share of home government purchases in home output
            gshares = 0.20;     % Share of foreign government purchases in foreign output
            ssy  = 0.794913;    % Steady state level of home output
            ssys = 0.794913;    % Steady state level of foreign output
            M = 1;              % Size of the home country
            Ms = 1;             % Size of the foreign country
            rhoi = 0.9;         % Persistence in the monetary policy shock
            trials = 10;       % Number of data-generating trials
            per = 5500;         % Number of periods (same as in declaration above)


model;

    %************************************    PREFERENCE SHOCKS    *********************************
        %prefshock = 0.9 * prefshock(-1) + epsp;                 % Zero in the steady state
    prefshock = 0;                                    % For version with no demand shocks
    mu1 = ssmu * exp(prefshock);
    mu2 = 1 - mu1;
    mus1 = 1 - mus2;
    mus2 = (1 - ssmus) * exp(prefshock);

    
    %*****************************    AGGREGATION AND MARKET CLEARING    **************************
    exp(yh)  = M * (exp(ch) + exp(invh) + exp(gh) );
    exp(yhs) = Ms * (exp(chs) + exp(invhs) + exp(ghs) ); 
    y        = log(exp(yh) + exp(yhs));
    exp(yfs) = Ms * (exp(cfs) + exp(invfs) + exp(gfs) );
    exp(yf)  = M * (exp(cf) + exp(invf) + exp(gf) );
    ys       = log(exp(yfs) + exp(yf));
    ch    = log(mu1) - eta*ph + c;
    cf    = log(mu2) - eta*(rer + pfs) + c;
    invh  = log(mu1) - eta*ph + invt;
    invf  = log(mu2) - eta*(rer + pfs) + invt;
    gh    = log(mu1) - eta*ph + g;
    gf    = log(mu2) - eta*(rer + pfs) + g;
    cfs   = log(mus1) - eta*pfs + cs;
    chs   = log(mus2) - eta*(ph - rer) + cs;
    invfs = log(mus1) - eta*pfs + invts;
    invhs = log(mus2) - eta*(ph - rer) + invts;
    gfs   = log(mus1) - eta*pfs + gs;
    ghs   = log(mus2) - eta*(ph - rer) + gs;
    rer - rer(-1) = delS + infls - infl;
    tot = pfs + rer - ph;


    %**********************************    PRICE INDICES    ***************************************
    1 = mu1 * exp((1-eta)*ph) + mu2 * exp((1-eta)*(pfs+rer));
    1 = mus1 * exp((1-eta)*pfs) + mus2 * exp((1-eta)*(ph-rer));
    exp((1-sig)*ph)  = (1-alpha) * exp((1-sig)*phn) + alpha * exp((1-sig)*(ph(-1) - infl));
    exp((1-sig)*pfs) = (1-alphas) * exp((1-sig)*pfsn) + alphas * exp((1-sig)*(pfs(-1) - infls));
    (1-omega) * exp((1-phi)*wn) + omega * exp((phi-1)*winfl) = 1;
    (1-omegas) * exp((1-phi)*wsn) + omegas * exp((phi-1)*winfls) = 1;
    w - w(-1) = winfl - infl;    
    ws - ws(-1) = winfls - infls;
    infh  = infl + ph - ph(-1);
    inffs = infls + pfs - pfs(-1);
    infdif = infls - infl;


    %**********************************    CONSUMER FOCs    ***************************************
    theta*c - thetas*cs = rer;

    lam = -theta * c;
    1/(1 + int) = beta * exp(lam(+1) - lam - infl(+1));
        ikr  = exp(invt - k(-1)) - delta;
    exp(lam) = ksi - ksi * psi * ikr;
    ksi/beta = exp(lam(+1) + r(+1)) +
                ksi(+1) * ( (1-delta) - 0.5 * psi * ikr(+1)^2 + psi * ikr(+1) * (ikr(+1) + delta) );
    exp(k) = (1-delta) * exp(k(-1)) + exp(invt) - 0.5 * psi * exp(k(-1)) * ikr^2;

    lams = -thetas * cs;
    1/(1 + ints) = beta * exp(lams(+1) - lams - infls(+1));
        ikrs = exp(invts - ks(-1)) - delta;
    exp(lams) = ksis - ksis * psis * ikrs;
    ksis/beta = exp(lams(+1) + rs(+1)) + 
                ksis(+1) * ( (1-delta) - 0.5 * psis * ikrs(+1)^2 + psis * ikrs(+1) * (ikrs(+1) + delta) );
    exp(ks) = (1-delta) * exp(ks(-1)) + exp(invts) - 0.5 * psis * exp(ks(-1)) * ikrs^2;


    %***********************************    WAGE SETTING    ***************************************
    wmark = phi / (phi - 1);
    
    exp((1 + phi*chi) * wn) = wmark * wb / wa;
    wb = exp( (1+chi)*l ) + omega*beta * wb(+1) * exp(phi*(1+chi)*winfl(+1));
    wa = exp(lam + l + w) + omega*beta * wa(+1) * exp((phi-1)*winfl(+1));
    
    exp((1+phi*chi) * wsn) = wmark * wbs / was;
    wbs = exp( (1+chi)*ls ) + omegas*beta * wbs(+1) * exp(phi*(1+chi)*winfls(+1));
    was = exp(lams + ls + ws) + omegas*beta * was(+1) * exp((phi-1)*winfls(+1));
    
    
    %*************************************    PRODUCTION    ***************************************
    z  = A11 * z(-1) + A12 * zs(-1) + hepsz;
    zs = A21 * z(-1) + A22 * zs(-1) + fepsz;
    r - w = log(nu/(1-nu)) + l - k(-1);    
    exp(y) * DPh = M * exp(z + nu * k(-1) + (1-nu) * l);
    mc = nu * r + (1-nu) * w - nu * log(nu) - (1-nu) * log(1-nu) - z;
    rs - ws = log(nu/(1-nu)) + ls - ks(-1);    
    exp(ys) * DPfs = Ms * exp(zs + nu * ks(-1) + (1-nu) * ls);
    mcs = nu * rs + (1-nu) * ws - nu * log(nu) - (1-nu) * log(1-nu) - zs;
        

    %***********************************    PRICE SETTING    **************************************
    pmark = sig / (sig - 1);
    
    exp(phn) = pmark * pbh / pah;
    pbh = exp( lam + sig*ph + mc + yh) + alpha*beta * pbh(+1) * exp(sig * infl(+1));
    pah = exp( lam + sig*ph + yh ) + alpha*beta * pah(+1) * exp((sig-1) * infl(+1));

    exp(pfsn) = pmark * pbfs / pafs;
    pbfs = exp( lams + sig*pfs + mcs + yfs) + alphas*beta * pbfs(+1) * exp(sig * infls(+1));
    pafs = exp( lams + sig*pfs + yfs) + alphas*beta * pafs(+1) * exp((sig-1) * infls(+1));

    DPh  = (1-alpha) * exp(sig * (ph - phn)) + alpha * exp(sig * (ph - ph(-1) + infl)) * DPh(-1);
    DPfs = (1-alphas) * exp(sig * (pfs - pfsn)) + alphas * exp(sig * (pfs - pfs(-1) + infls)) * DPfs(-1);
    

    %**********************************    MONETARY POLICY    ************************************
    ishock = rhoi * ishock(-1) + hepsi;
    ishocks = rhoi * ishocks(-1) + fepsi;
    
    % Taylor Rules without output gap
    % int  = (1-rhoint)*(1/beta - 1) + rhoint*int(-1) + (1-rhoint) * rhopi * infl + hepsi;
    % ints  = (1-rhoint)*(1/beta - 1) + rhoint*ints(-1) + (1-rhoint) * rhopi * infls + fepsi;
    
    % Taylor Rules with output gap
    int  = (1-rhoint)*(1/beta - 1) + rhoint*int(-1) + (1-rhoint) * rhopi * infl(+1) + (1-rhoint) * rhogap * (y - ssy) + hepsi;
    ints  = (1-rhoint)*(1/beta - 1) + rhoint*ints(-1) + (1-rhoint) * rhopi * infls(+1) + (1-rhoint) * rhogap * (ys - ssys) + fepsi;
    
    % Foreign country stabilizes NER
    % delS = 0;


    %**********************************    FISCAL POLICY    **************************************
    g  = 0.03 * (log(gshare) + ssy - log(M)) + 0.97 * g(-1) + hepsg;
    gs = 0.03 * (log(gshares) + ssys - log(Ms)) + 0.97 * gs(-1) + fepsg;
    exp(g) = -tr;
    exp(gs) = -trs;

        
    %***********************************    USEFUL RATIOS    *************************************
    gr    = M * exp(g - y);
    grs   = Ms * exp(gs - ys);
    cr    = M * exp(c - y);
    crs   = Ms * exp(cs - ys);
    ir    = M * exp(invt - y);
    irs   = Ms * exp(invts - ys);
    kr    = M * exp(k - y)/4;       %Since K is a stock variable and Y is a flow variable
    krs   = Ms * exp(ks - ys)/4;
    trr   = -M * tr / exp(y);
    trrs  = -Ms * trs / exp(ys);
    wrate = exp(w - ws - rer);
    crate = exp(c - cs - rer);
    relc  = c - cs;
    rely  = y - ys;
    
   
    %**************************    STEADY-STATE AUXILIARY VARIABLES    ****************************
    klr  = k - l;
    klrs = ks - ls;
    ilr  = invt - l;
    ilrs = invts - ls;
    ylr  = yh - l;
    ylrs = yfs - ls;
    clr  = c - l;
    clrs = cs - ls;
    
end;

initval;

    % DISTURBANCES AND AUXILIARY VARIABLES
    prefshock = 0;
    mu1 = ssmu;
    mu2 = 1 - ssmu;
    mus2 = 1 - ssmus;
    mus1 = 1 - mus2;
    pmark = sig / (sig - 1);
    wmark = phi / (phi - 1);
    z = 0;
    zs = 0;
    ishock = 0;
    ishocks = 0;

    % PRICES AND INFLATION
    rer   = 0;
    delS  = 0;
    tot   = 0;
    ph    = 0;
    pfs   = 0;
    infl   = 0;
    infls  = 0;
    infdif = infls - infl;
    infh  = 0;
    inffs = 0;
    winfl  = 0;
    winfls = 0;
    DPh   = 1;
    DPfs  = 1;

    % STEADY STATE REDUCED FORM EQUATIONS
    int  = (1/beta) - 1;
    ints = int;
    r   = log( delta + int );
    rs  = log( delta + ints );
    mc  = -log(pmark);
    mcs = -log(pmark);
    w   = (1/(1-nu)) * ( mc + nu * log(nu) + (1-nu) * log (1-nu) + z - nu * r );
    ws  = (1/(1-nu)) * ( mcs + nu * log(nu) + (1-nu) * log (1-nu) + zs - nu * rs );
    wn  = 0;
    wsn = 0;

    klr  = w - r + log(nu) - log(1 - nu);
    klrs = ws - rs + log(nu) - log(1 - nu);
    ilr  = log(delta) + klr;
    ilrs = log(delta) + klrs;
    ylr  = nu * klr + log(M) + z;
    ylrs = nu * klrs + log(Ms) + zs;
    clr  = log( (1/M) * ( exp(ylr)*(1 - ssmu*gshare) -
                exp(ylrs)*(1-ssmus)*gshares ) - exp(ilr) );
    clrs = log( (1/Ms) * ( exp(ylrs)*(1 - ssmus*gshares) -
                exp(ylr)*(1-ssmu)*gshare ) - exp(ilrs) );
    l = (w - log(wmark) - theta * clr)/(theta + chi);
    ls = (ws - log(wmark) - thetas * clrs)/(thetas + chi);
    
    k     = klr + l;
    ks    = klrs + ls;
    invt  = ilr + l;
    invts = ilrs + ls;
    invh  = log(ssmu) + invt;
    invf  = log(1 - ssmu) + invt;
    invfs = log(ssmus) + invts;
    invhs = log(1 - ssmus) + invts;
    y   = ylr + l;        
    ys  = ylrs + ls;
    yh  = log(ssmu) + y;
    yhs = log(1 - ssmu) + y;
    yfs = log(ssmus) + ys;
    yf  = log(1 - ssmus) + ys;
    c   = clr + l;
    cs  = clrs + ls;
    ch  = log(ssmu) + c;
    cf  = log(1 - ssmu) + c;
    cfs = log(ssmus) + cs;
    chs = log(1 - ssmus) + cs;

    lam  = -theta * c;
    lams = -thetas * cs;
    ksi  = exp(lam);
    ksis = exp(lams);
    g   = log(gshare) + y - log(M);
    gs  = log(gshares) + ys - log(Ms);
    gh  = log(ssmu) + g;
    gf  = log(1 - ssmu) + g;
    gfs = log(ssmus) + gs;
    ghs = log(1 - ssmus) + gs;

    wb   = exp(l * (1 + chi)) / (1 - omega * beta);
    wbs  = exp(ls * (1 + chi)) / (1 - omegas * beta);
    wa   = exp(lam + w + l) / (1 - omega * beta);
    was  = exp(lams + ws + ls) / (1 - omegas * beta);
    pbh  = exp(lam + mc + yh) / (1 - alpha * beta);
    pah  = exp(lam + yh) / (1 - alpha * beta);
    pbfs = exp(lams + mcs + yfs) / (1 - alphas * beta);
    pafs = exp(lams + yfs) / (1 - alphas * beta);
    phn  = ph;
    pfsn = pfs;


    wrate = exp(w - ws - rer);
    crate = exp(c - cs - rer);
    relc  = c - cs;
    rely  = y - ys;
    gr  = M * exp(g - y);
    grs = Ms * exp(gs - ys);
    cr  = M * exp(c - y);
    crs = Ms * exp(cs - ys);
    ir  = M * exp(invt - y);
    irs = Ms * exp(invts - ys);
    kr  = M * exp(k - y)/4;
    krs = Ms * exp(ks - ys)/4;
    
    tr  = -exp(g);
    trs = -exp(gs);

    trr  = -M * tr / exp(y);
    trrs = -Ms * trs / exp(ys);
 
    ikr  = exp(invt - k) - delta;
    ikrs = exp(invts - ks) - delta;
    
end;

steady;
check;

Sigma_e = [0.000049 0.000012 0 0 0 0 0; 0.000049 0 0 0 0 0; 0.0001 0 0 0 0; 0.0001 0 0 0; 0.0001 0 0; 0.000089 0.0000889; 0.000089];
    %     hepsz                         fepsz               epsp            hepsg         fepsg       hepsi            fepsi

% Business cycle properties, theoretical moments
stoch_simul(IRF=0,ORDER=1) y, ys, c, cs, invt, rer, delS;

%stoch_simul(IRF=0,hp_filter=1600,ORDER=1) y, ys, c, cs, invt, rer, delS;
%stoch_simul(IRF=0,ORDER=1) y, ys, c, invt, ints, infdif, tot, rer, delS;

% Recover time series for NER (note: unfiltered)
% Output: a (per + 3) x (trials x 2) matrix
% First (trials) columns contain RER data
% Last (trials) columns contain NER data
% "trials" is defined above in the Parameters section

% This portion of the code generates several simulations of non-filtered RER and NER time series
EXR = zeros(per+3,trials*2);
YS  = zeros(per+3,trials*2);
Temp2 = zeros(per+3,1);
for j = 1:trials
    Temp1 = zeros(per+3,1);
    stoch_simul(IRF=0,ORDER=1,noprint,nocorr,nofunctions,nomoments) y, rer, delS;
    EXR(:,j) = [rer];
    YS(:,j) = [y];
    Temp2 = [delS];
    for i = 2:(per+3)
        Temp1(i,1) = Temp1(i-1,1) + Temp2(i,1);
    end
    EXR(:,j+trials) = Temp1;
    YS(:,j+trials) = Temp1;
end
save exr_sim_data.out EXR -ASCII
%xlswrite('exr_sim_data.xls', EXR, 'Exchange Rates', 'A1');
xlswrite('HP Filters.xls', YS, 'SimData', 'B2');


% This portion of the code is for computing business cycle properties of the model
SimData = zeros(per+3,7,trials);
Temp2 = zeros(per+3,1);
for j = 1:trials
    Temp1 = zeros(per+3,1);
    stoch_simul(IRF=0,hp_filter=1600,ORDER=1,noprint,nocorr,nofunctions,nomoments) y, c, invt, rer, delS, ys, cs;
    SimData(:,1,j) = [y];
    SimData(:,2,j) = [c];
    SimData(:,3,j) = [invt];
    SimData(:,4,j) = [rer];
    SimData(:,6,j) = [ys];
    SimData(:,7,j) = [cs];
    Temp2 = [delS];
    for i = 2:(per+3)
        Temp1(i,1) = Temp1(i-1,1) + Temp2(i,1);
    end
    SimData(:,5,j) = Temp1;
end
save BCProp.mat SimData;