Description
SelectiveHedging.gms: Indexation model with selective hedging Consiglio, Nielsen and Zenios. PRACTICAL FINANCIAL OPTIMIZATION: A Library of GAMS Models, Section 7.2.3 Last modified: Apr 2008.
Category : GAMS FIN library
Mainfile : SelectiveHedging.gms includes : InputData.gdx
$title Indexation model with selective hedging
* SelectiveHedging.gms: Indexation model with selective hedging
* Consiglio, Nielsen and Zenios.
* PRACTICAL FINANCIAL OPTIMIZATION: A Library of GAMS Models, Section 7.2.3
* Last modified: Apr 2008.
$if NOT set out $set out selectivehedging
$call rm -f %out%.gdx
$if NOT %system.errorlevel% == 0 $abort %out%.gdx cannot be removed - close
SCALARS
mu Target expected value
USDDEMForwardRate USD-DEM forward rate
USDCHFForwardRate USD-CHF forward rate;
USDDEMForwardRate = -0.005;
USDCHFForwardRate = 0.001;
SCALAR
EpsTolerance;
SETS BB Available bonds
EE Available currencies
BxE(BB,EE) Bonds by Currencies
SS Scenarios set
PARAMETERS
BondPrices0(BB) Bond prices at the beginning of the stage
BondPrices1(SS,BB) Bond prices at the end of the stage
BondReturns(SS,BB) Bond returns
UnhedgedBondReturns(SS,BB) Unhedged bond returns
HedgedBondReturns(SS,BB) Hedged bond returns
ExchangeRates0(EE)
ExchangeRates1(SS,EE)
ExchangeRatesReturns(SS,EE)
IndexReturns(SS);
$gdxIn InputData
$load BB=BB2 EE BxE=BxE2 SS BondPrices1=data2
$load BondPrices0=data3 ExchangeRates0 ExchangeRates1
$load IndexReturns
$gdxIn
ALIAS(BB,i)
ALIAS(SS,l,s)
ALIAS(EE,e);
BondReturns(l,i) = ( BondPrices1(l,i) - BondPrices0(i) ) / BondPrices0(i);
ExchangeRatesReturns(l,e) = ( ExchangeRates1(l,e) - ExchangeRates0(e) ) / ExchangeRates0(e);
* Unhedged bond returns in USD currency
UnhedgedBondReturns(l,i)$BxE(i,'USD') = BondReturns(l,i)$BxE(i,'USD');
UnhedgedBondReturns(l,i)$BxE(i,'DEM') = BondReturns(l,i)$BxE(i,'DEM') + ExchangeRatesReturns(l,'DEM');
UnhedgedBondReturns(l,i)$BxE(i,'CHF') = BondReturns(l,i)$BxE(i,'CHF') + ExchangeRatesReturns(l,'CHF');
* Hedged bond returns
HedgedBondReturns(l,i)$BxE(i,'DEM') = BondReturns(l,i)$BxE(i,'DEM') + USDDEMForwardRate;
HedgedBondReturns(l,i)$BxE(i,'CHF') = BondReturns(l,i)$BxE(i,'CHF') + USDCHFForwardRate;
DISPLAY BondPrices0,BondReturns,ExchangeRatesReturns,UnhedgedBondReturns,HedgedBondReturns,IndexReturns;
PARAMETERS
pr(l) Scenario probability;
pr(l) = 1.0 / CARD(l);
VARIABLE
z;
POSITIVE VARIABLES
h(i)
u(i)
x(i)
y(l);
VARIABLES
r(l,i);
EQUATIONS
ObjDef
ReturnCon
NormalCon
yPosDef(l)
yNegDef(l);
ObjDef .. z =E= SUM(l, pr(l) * y(l));
yPosDef(l) .. y(l) =G= SUM(i, UnhedgedBondReturns(l,i) * u(i) + HedgedBondReturns(l,i) * h(i) ) -
SUM(s, pr(s) * SUM(i, UnhedgedBondReturns(s,i) * u(i) + HedgedBondReturns(s,i) * h(i) ));
ReturnCon.. SUM(l, pr(l) * SUM(i, UnhedgedBondReturns(l,i) * u(i) + HedgedBondReturns(l,i) * h(i))) =G= mu;
yNegDef(l) .. y(l) =G= SUM(s, pr(s) * SUM(i, UnhedgedBondReturns(s,i) * u(i) + HedgedBondReturns(s,i) * h(i) )) -
SUM(i, UnhedgedBondReturns(l,i) * u(i) + HedgedBondReturns(l,i) * h(i) );
NormalCon .. SUM(i, h(i) + u(i)) =E= 1.0;
MODEL IndexFund 'Model PFO 10.5.1' /ALL/;
SET FrontierPoints /P_1 * P_50/;
ALIAS(FrontierPoints,p);
PARAMETER
Frontiers(p,*) Frontiers;
* We assign to each point a return level mu
Frontiers('P_1','mu') = 0.0;
LOOP (p$(ORD(p) > 1),
Frontiers(p,'mu') = Frontiers(p-1,'mu') + (0.0005)$(ORD(p) <= 20) + (0.001)$(ORD(p) > 20);
);
IndexFund.MODELSTAT = 1;
LOOP(p$(IndexFund.MODELSTAT <= 2),
mu = Frontiers(p,'mu');
SOLVE IndexFund MINIMIZING z USING LP;
IF ( IndexFund.MODELSTAT <= 2,
Frontiers(p,'Partial Hedge') = z.l;
);
);
* Fully hedged model
u.FX(i) = 0.0;
IndexFund.MODELSTAT = 1;
LOOP(p$(IndexFund.MODELSTAT <= 2),
mu = Frontiers(p,'mu');
SOLVE IndexFund MINIMIZING z USING LP;
IF ( IndexFund.MODELSTAT <= 2,
Frontiers(p,'Fully Hedged') = z.l;
);
);
* Unhedged model
u.LO(i) = 0.0;
u.UP(i) = 1.0;
h.FX(i) = 0.0;
IndexFund.MODELSTAT = 1;
LOOP(p$(IndexFund.MODELSTAT <= 2),
mu = Frontiers(p,'mu');
SOLVE IndexFund MINIMIZING z USING LP;
IF ( IndexFund.MODELSTAT <= 2,
Frontiers(p,'Unhedged') = z.l;
);
);
DISPLAY Frontiers;
embeddedCode Connect:
- GAMSReader:
symbols: [ { name: Frontiers } ]
- ExcelWriter:
file: %out%.xlsx
symbols: [ { name: Frontiers, range: Sheet1!A1 } ]
endEmbeddedCode