Description
Utility.gms: Utility models. Consiglio, Nielsen and Zenios. PRACTICAL FINANCIAL OPTIMIZATION: A Library of GAMS Models, Section 5.6 Last modified: Apr 2008.
Category : GAMS FIN library
Mainfile : Utility.gms includes : Corporate.inc WorldIndices.inc
$title Utility models
* Utility.gms: Utility models.
* Consiglio, Nielsen and Zenios.
* PRACTICAL FINANCIAL OPTIMIZATION: A Library of GAMS Models, Section 5.6
* Last modified: Apr 2008.
* Uncomment one of the following lines to include a data file
* $include "Corporate.inc"
$include "WorldIndices.inc"
SCALARS
CeROE Certainty equivalent ROE
Equity Equity avaiable for investment
gamma Risk aversion parameter (the lower, the most risk averse);
Equity = 100.0;
PARAMETERS
pr(l) Scenario probability
P(i,l) Final values
EP(i) Expected final values;
pr(l) = 1.0 / CARD(l);
P(i,l) = 1 + AssetReturns ( i, l );
EP(i) = SUM(l, pr(l) * P(i,l));
POSITIVE VARIABLES
x(i) Holdings of assets in monetary units (not proportions)
ROE(l) Return on Equity ;
* Since ROE will be exponentiated, and ROE**gamma is computed
* as EXP(gamma * ln(ROE)), the default lower bound is too small
* and some solvers could report an EXEC Error. To avoid that,
* we set the lower bound this new value.
ROE.LO(l) = 0.1;
VARIABLES
z Objective function value;
EQUATIONS
EquityCon Equation defining the equity contraint
ROEDef(l) Equations defining the ROEs
ObjDef Objective function definition for Expected Utility;
EquityCon .. SUM(i, x(i)) =E= Equity;
ROEDef(l).. ROE(l) =E= SUM(i, P(i,l) * x(i)) / Equity;
ObjDef .. z =E= SUM(l, pr(l) * (
(1.0/gamma * ROE(l)**gamma) $(gamma <> 0) +
log(ROE(l)) $(gamma = 0)
)
);
* Start from a feasible solution for LOG utility function
MODEL ExpectedUtility 'PFO Model 5.6.1' /EquityCon, ROEDef, ObjDef/;
FILE FrontierHandle /"ExpectedUtility.csv"/;
FrontierHandle.pc = 5;
FrontierHandle.pw = 1048;
PUT FrontierHandle;
PUT "Gamma","CeROE"/;
FOR ( gamma = -10 TO 1 BY 0.5,
SOLVE ExpectedUtility MAXIMIZING z USING NLP;
CeROE = ((gamma * z.L)**(1.0/gamma))$(gamma <> 0) + (exp(z.L))$(gamma = 0);
PUT gamma:6:2,(CeROE-1):8:6;
LOOP (i, PUT x.L(i):6:2);
PUT /;
);