$TITLE Appendix C: OLG exchange model -- constant discount rate
*=====================================================================
* Introduce intertemporal sets
*=====================================================================
* The model captures all generations alive in the first model period
* (year 0) and all those born in the span of the subsequent 150
* years, where generations are labeled according to the year in which
* they are born. The model is solved in 1-year intervals with each
* new generation being born at the start of a period and living to
* the age of 55.
SCALARS
TIMINT Single period time interval /1/,
INIYEAR Year in with oldest generation was born /-54/;
SETS
G Generations in the model /
"-54","-53","-52","-51",
"-50","-49","-48","-47","-46","-45","-44","-43","-42","-41",
"-40","-39","-38","-37","-36","-35","-34","-33","-32","-31",
"-30","-29","-28","-27","-26","-25","-24","-23","-22","-21",
"-20","-19","-18","-17","-16","-15","-14","-13","-12","-11",
"-10","-9","-8","-7","-6","-5","-4","-3","-2","-1", 0*150/,
T(G) Time periods in the model /0*150/,
A(T) Typical life-cycle /0*54/;
* We need some special sets to identify key time periods and generations.
SETS TFIRST(T) First period in the model,
TLAST(T) Last period in the model,
ATGEN(G) Generations with terminal assets;
* These special sets are identified by their order in the declaration.
TFIRST(A) = YES$(ORD(A) EQ 1);
TLAST(T) = YES$(ORD(T) EQ CARD(T));
ATGEN(G) = YES$((CARD(G)-CARD(A)+1) LT ORD(G));
* Aliases used to manipulate sets.
ALIAS (G,GG,YR), (T,TT), (A,AA);
*=====================================================================
* Introduce fundamental parameters
*=====================================================================
SCALARS RBAR_A Annual interest rate /0.05/,
GAMMA_A Annual population growth rate /0.01/,
THETA Exponent in intertemporal utility /4.00/,
TDEF0 Base year trade deficit /0.01/;
* Modify annual rates of change to 5-year interval between solution
* periods
SCALARS RBAR Periodic interest rate,
GAMMA Periodic population growth rate;
RBAR = (1+RBAR_A)**TIMINT - 1;
GAMMA = (1+GAMMA_A)**TIMINT - 1;
*=====================================================================
* Time profiles
*=====================================================================
* Declare variables relating values to intertemporal sets and use
* annual growth and interest rates to create time profiles consistent
* with the 1-year interval between solution periods.
PARAMETERS
YEAR(G) Point in time,
AGE(A) Age at a given point in the life cycle,
PREF(G) Reference price path (present value price index),
QREF(G) Reference quantity path (population size index),
OMEGA0(A) Initial endowment profile;
* Time periods and ages can be identified by the order of the
* relevant set using the fact that each period has a length of 5
* years, and that generations are labeled according to the year they
* are born and live for 55 years.
YEAR(G) = INIYEAR + TIMINT * (ORD(G)-1);
AGE(A) = TIMINT * (ORD(A)-1);
* Declare indices for population size and present value prices.
QREF(G) = (1+GAMMA_A)**YEAR(G);
PREF(G) = 1 /(1+RBAR_A)**YEAR(G);
* Use ages and years to set up correspondence between generations,
* age, and year.
SET MAPG(G,A,YR) Assignment from generation and age to time period;
MAPG(G,A,YR) = YES$(YEAR(G)+AGE(A) EQ YEAR(YR));
* Endowment profile as in Auerbach and Kotlikoff (1987):
OMEGA0(A) = EXP(4.47 + 0.033*AGE(A) - 0.00067 * AGE(A)**2);
* Endowment profiles are scaled to an economy-wide level of 1 in the
* base year
OMEGA0(A) = OMEGA0(A) / SUM(AA, (1+GAMMA)**(1-ORD(AA)) * OMEGA0(AA));
*=====================================================================
* Calibration model: Solve for benchmark steady state of reference
* generation, with calibration model for endogenous consumption
*=====================================================================
* Find utility discount rate, RHO, to set implied aggregate
* consumption equal to aggregate endowments plus the trade deficit.
* We use the equations arising from the household utility
* maximization problem to set up a mixed complementarity problem
* (MCP) and use the solver to find the value of RHO that satisfies
* all the equations in the system. Alternatively, since the
* first-order conditions in this simple setting dictate that
* consumption is growing over the life cycle at a constant rate
* one could solve for rho analytically as it is done in appendixd.gms
VARIABLES
RHO Period utility discount rate;
POSITIVE VARIABLES
CC(T) Consumption profile of generation born in year 0,
LAMDA Shadow price of income (present value utils);
EQUATIONS
EQC(A) First order condition for consumption,
EQCCC Base year aggregate consumption,
EQLAMDA First order condition for price of income;
* First order conditions.
EQC(A).. LAMDA*PREF(A) =E= (1+RHO)**(1-ORD(A))*CC(A)**(-THETA);
EQLAMDA.. SUM(A,PREF(A)*CC(A)) =E= SUM(A,PREF(A)*OMEGA0(A));
* Aggregate consumption in the base year is implied by the
* consumption profile of the generation born in year 0 since the
* steady state assumption determines the relative sizes of each
* generation. We require that aggregate consumption equals total
* endowments plus the trade deficit.
EQCCC.. SUM(A,CC(A)/QREF(A)) =E= 1 + TDEF0;
* Associate variables with equations.
MODEL BENCH /EQC.CC, EQLAMDA.LAMDA, EQCCC.RHO/;
* Initialize variables and set bounds to prevent operation errors.
RHO.L = 0.01;
RHO.LO = -0.99;
CC.L(A) = 1/CARD(A);
CC.LO(A) = 1E-9;
LAMDA.L = 1;
LAMDA.LO = 1E-9;
* Solve calibration model.
BENCH.ITERLIM=50000;
SOLVE BENCH USING MCP;
* Derived utility discount rate on an annual basis.
PARAMETER RHO_A Annual utility discount (%);
RHO_A = 100 * ((1+RHO.L)**(1/TIMINT) - 1); DISPLAY RHO_A;
*=====================================================================
* Use endowments and the calibrated consumption profile for
* generation 0 to install baseline values for all generations
*=====================================================================
PARAMETERS
EREF(G,T) Baseline endowment profile,
CREF(G,T) Baseline consumption profile,
PREF_T(A) Baseline post-terminal price path,
CREF_T(G,A) Baseline post-terminal consumption profile,
MREF(G) Baseline present value of consumption;
* We assign demand and income profiles for generation G at time T
* based on endowments and the calibrated consumption profile for
* generation 0. The trick here is to use a GAMS loop over the mapping
* which relates generations (G), ages (A) and time periods (T):
LOOP(MAPG(G,A,T),
EREF(G,T) = QREF(G) * OMEGA0(A);
CREF(G,T) = QREF(G) * CC.L(A); );
* The last model generation is born in year 150 which means that in
* order to capture the full life cycle of all model generations we
* need to cover a 50-year "post-terminal" period. We index these
* post-terminal periods by the same index (A) that we use to index
* ages in a life cycle.
* Present value prices in post-terminal periods are extrapolated from
* the value of the reference price index in the terminal period.
LOOP((A,TLAST)$AGE(A), PREF_T(A) = PREF(TLAST) / (1 + RBAR_A)**AGE(A); );
* Consumption profiles in post-terminal periods for generation G at
* age AA are inferred from the consumption levels in the initial
* period of generations that have the same age.
LOOP((G,A,TLAST)$(YEAR(G)+AGE(A) GT YEAR(TLAST)),
CREF_T(G,AA)$(AGE(AA)+YEAR(TLAST) EQ AGE(A)+YEAR(G))
= CC.L(A) * QREF(G); );
* Present value of consumption by generation, including post-terminal
* consumption by generations who live beyond the model horizon.
MREF(G) = SUM(T, PREF(T)*CREF(G,T)) + SUM(A, PREF_T(A)*CREF_T(G,A));
*=====================================================================
* Use endowments and the calibrated consumption profiles for
* generation 0 to back out the evolution of asset holdings and
* distinguish between domestic and foreign debt
*=====================================================================
PARAMETERS
ASSETS(A) Present value of assets over the life cycle,
MA(A) Assets held in year 0 by age of generation,
ASSETH Positive asset holdings by age in year 0,
DEBT Net debt by age in year 0;
SCALAR THETAD Ratio of total assets to total debt;
* The present value of assets equals the sum of the value of
* endowments less consumption in all previous periods of the life
* cycle. The asset profile of the representative generation can then
* be used to find the distribution of asset holdings across
* generations alive in the base year.
ASSETS(A) = SUM(AA$(ORD(AA) LT ORD(A)), PREF(AA)*(OMEGA0(AA) - CC.L(AA)));
MA(A) = ASSETS(A)/(QREF(A)*PREF(A));
* We assume that negative asset positions reflect holdings of both
* domestic and foreign debt, while positive asset positions reflect
* holdings of domestic assets. We assume that all age groups with
* negative assets hold foreign and domestic debt in the same
* proportion which means that we can use the ratio of total assets to
* total debt to decompose the asset holdings by type
THETAD = -SUM(A$(MA(A) GT 0), MA(A))/ SUM(A$(MA(A) LT 0), MA(A));
ASSETH(A,"DOMESTIC")$(MA(A) GT 0) = MA(A);
DEBT(A,"DOMESTIC")$(MA(A) LT 0) = -MA(A)*THETAD;
DEBT(A,"FOREIGN")$(MA(A) LT 0) = -MA(A)*(1-THETAD);
* We model baseline assets and debt positions as inital endowments
* for generations alive in year 0.
PARAMETERS
DASSET(G) Initial endowment of domestic assets,
FASSET(G) Initial endowment of foreign assets;
DASSET(G) = SUM(MAPG(G,A,"0"), ASSETH(A,"DOMESTIC") - DEBT(A,"DOMESTIC"));
FASSET(G) = SUM(MAPG(G,A,"0"), - DEBT(A,"FOREIGN"));
*=====================================================================
* Model in GAMS/MCP. This model solves for the equilibrium transition
* path subject to terminal conditions that assume the presence of a
* steady state. If there are no exogenous changes the model
* replicates the calibrated consumption profiles. We use this feature
* to check the calibration and then solve for the results of en
* exogenous change in the endowment profile
*=====================================================================
POSITIVE VARIABLES
* Production activities. These determine how inputs are converted
* into outputs according to the technology implied by the benchmark
* data. The variables here are activity levels and an equilibrium
* requires that each active sector earns zero profit.
U(G) Utility,
X(T) Export,
M(T) Import,
* Prices. The variables here are the prices that are associated with
* each commodity. An equilibrium requires that prices are such that
* supply equals demand.
PC(T) Price of private consumption,
PCT(G,A) Price of post-terminal consumption of goods,
PU(G) Price of intertemporal utility,
PFX Price of foreign exchange,
* Consumer income levels. These are agents that receive income from
* endowments or taxes and spend it to maximize utility. The variables
* here are income levels and an equilibrium requires that total
* income equals total expenditure.
RA(G) Representative agents by generation
* These are endogenous variables associated with model constraints
* that relate the transition to the steady state.
CT(G,A) Post-terminal consumption of goods,
AT(G) Terminal assets;
* Equations asscociated with model variables. These fall into three
* classes. PRF which ensure zero profit in each activity, MKT which
* ensure no excess demand for each commodity, and DEF which ensure
* income balance for each agent.
EQUATIONS
PRF_U(G) Utility,
PRF_X(T) Export,
PRF_M(T) Import,
MKT_PC(T) Price of private consumption,
MKT_PCT(G,A) Price of post-terminal consumption of goods,
MKT_PU(G) Price of intertemporal utility,
MKT_PFX Price of foreign exchange,
DEF_RA(G) Representative agents by generation,
EQU_CT(G,A) Post-terminal consumption of goods,
EQU_AT(G) Terminal assets;
* Utility is treated of as a commodity demanded by the different
* generations which implies that the utility function is modeled as
* any other production activity. The activity level here is initialized
* at unity implying an overall output level equal to the present value
* of consumption, MREF(G).
PRF_U(G).. SUM(T, PREF(T) * CREF(G,T) * (PC(T)/PREF(T))**(1-1/THETA))
+ SUM(A, PREF_T(A) * CREF_T(G,A) *
(PCT(G,A)/PREF_T(A))**(1-1/THETA))
=E= MREF(G) * PU(G)**(1-1/THETA);
* These equations represent zero profit in import and export activities.
* The assumption of a small open economy and perfect capital mobility
* implies that the price of imports is constant in current value terms.
* We therefore do not need to distinguish between years, but only
* operate with a single present value price for foreign exchange. The
* import activity is initialized at the reference quantity path implying
* an overall output level equal to the baseline trade deficit while the
* export activity is initialized at zero.
PRF_M(T).. PFX * PREF(T) =G= PC(T);
PRF_X(T).. PC(T) =G= PFX * PREF(T);
* Supply equals demand for consumption, post-terminal consumption,
* "utility", and foreign exchange.
MKT_PC(T).. SUM(G, EREF(G,T) + DASSET(G)$TFIRST(T)) + M(T) - X(T) =E=
SUM(G, CREF(G,T)*U(G)*(PU(G)*PREF(T)/PC(T))**(1/THETA));
MKT_PCT(G,A)$CREF_T(G,A)..
CT(G,A) =E= U(G)*(PU(G)*PREF_T(A)/PCT(G,A))**(1/THETA);
MKT_PU(G).. U(G)*MREF(G)*PU(G) =E= RA(G);
MKT_PFX.. SUM(T, X(T)*PREF(T)) + SUM(G, FASSET(G))
=E= SUM(T, M(T)*PREF(T));
* Income balance for each generation. Each generation demands "utility"
* and is endowed with an amount of the consumption good in each period.
* In addition, generations alive in the initial period are endowed with
* domestic and foreign assets. To terminate the model generations alive
* in the terminal period are required to leave an amount of assets and
* are also endowed with goods for consumption in the post-terminal periods.
DEF_RA(G).. RA(G) =E= SUM(T, PC(T)*(EREF(G,T) + DASSET(G)$TFIRST(T)))
+ PFX * FASSET(G) + (PFX * AT(G))$ATGEN(G)
+ SUM(A, PCT(G,A) * CREF_T(G,A) * CT(G,A));
* Select the levels of post-terminal consumption so that the present
* value price declines with the steady state interest rate.
EQU_CT(G,A)$CREF_T(G,A)..
SUM(TLAST, PC(TLAST)) =E= PCT(G,A)*(1+RBAR)**(ORD(A)-1);
* Select terminal asset position so that all generations living past
* the terminal period achieve the same equivalent variation.
EQU_AT(G)$ATGEN(G)..
U(G) =E= U(G-1);
* Define the equations entering the model and their complementary
* slackness relationship with variables in the model:
MODEL EXCHANGE /PRF_U.U, PRF_X.X, PRF_M.M , MKT_PC.PC, MKT_PCT.PCT,
MKT_PU.PU, MKT_PFX.PFX, DEF_RA.RA ,EQU_CT.CT, EQU_AT.AT/;
* Assign initial values for those variables which are not assigned
* explicitly below:
*=====================================================================
* Assign initial values and bounds for activity levels, prices, and
* auxiliary variables
*=====================================================================
U.L(G) = 1;
PU.L(G) = 1;
PFX.L = 1;
RA.L(G) = MREF(G);
X.L(T) = 0;
M.L(T) = QREF(T)*TDEF0;
PC.L(T) = PREF(T);
PCT.L(G,A) = PREF_T(A);
CT.L(G,A) = 1$CREF_T(G,A);
AT.L(G) = SUM(T, (CREF(G,T) -EREF(G,T)) * PREF(T))$ATGEN(G);
AT.LO(G) = -INF;
* Numeraire:
PC.FX(TFIRST) = 1;
*=====================================================================
* Replicate the benchmark equilibrium
*=====================================================================
EXCHANGE.ITERLIM=0;
SOLVE EXCHANGE USING MCP;
DISPLAY "Benchmark tolerance CHK:",EXCHANGE.OBJVAL;
*=====================================================================
* Run counterfactual
*=====================================================================
* Modify the endowment profile, and scale it to maintain an economy-wide
* level of unity in the base year.
PARAMETER OMEGA(A) Counterfactual endowment profile;
OMEGA(A) = EXP(4.47 + 0.02*AGE(A) - 0.0007*(AGE(A))**2);
OMEGA(A) = OMEGA(A) / SUM(AA, (1+GAMMA)**(1-ORD(AA)) * OMEGA(AA));
LOOP(A,EREF(G,T)$MAPG(G,A,T) = QREF(G) * OMEGA(A); );
* Solve the model.
EXCHANGE.ITERLIM=10000;
SOLVE EXCHANGE USING MCP;
* Parameters for reporting results from the counterfactual experiment.
PARAMETERS
WCHANGE Welfare change (% equivalent variation by year of birth),
TDEF Trade deficit (change from baseline level);
* Due to production activities being homogenous of degree 1 the
* equivalent variation is the percentage change in output from sector
* U. The trade deficit in year T is the difference between aggregate
* consumption and aggregate endowment.
WCHANGE(G) = 100 * (U.L(G) - 1);
TDEF(T) = M.L(T) - X.L(T);
*=====================================================================
* Display statements
*=====================================================================
DISPLAY YEAR, AGE, PREF, PREF_T, QREF, OMEGA0, OMEGA, EREF, CREF, CREF_T,
MREF, ASSETS, MA, ASSETH, DEBT, DASSET, FASSET, WCHANGE, TDEF;