gussrisk.gms : Simple investment example with varying weight for risk using GUSS

Description

Portfolio selection model solved for alternative risk aversion parameters

Keywords: nonlinear programming, portfolio optimization, GUSS, scenario analysis


Reference

  • GAMS Development Corporation, Formulation and Language Example.

Small Model of Type : NLP


Category : GAMS Model library


Main file : gussrisk.gms

$title Simple investment example with varying weight for risk using GUSS (GUSSRISK,SEQ=399)

$onText
Portfolio selection model solved for alternative risk aversion parameters

Keywords: nonlinear programming, portfolio optimization, GUSS, scenario analysis
$offText

Set
   stocks 'potential investments'                  / buystock1*buystock4 /
   events 'equally likely return states of nature' / event1*event10      /;

Alias (stocks,s,sp), (events,e,ep);

Parameter
   prices(stocks) 'purchase prices of the stocks' / buystock1  22
                                                    buystock2  30
                                                    buystock3  28
                                                    buystock4  26 /
   funds 'total investable funds' / 500 /;

Table returns(events,stocks) 'returns by state of nature event'
           buystock1   buystock2   buystock3   buystock4
   event1          7           6           8           5
   event2          8           4          16           6
   event3          4           8          14           6
   event4          5           9          -2           7
   event5          6           7          13           6
   event6          3          10          11           5
   event7          2          12          -2           6
   event8          5           4          18           6
   event9          4           7          12           5
   event10         3           9          -5           6;

Parameter
   mean (stocks)        'mean returns to x(stocks)'
   covar(stocks,stocks) 'variance covariance matrix';

mean(s)     = sum(e, returns(e,s))/card(e);
covar(s,sp) = sum(e,(returns(e,sp) - mean(sp))*(returns(e,s) - mean(s)))/card(e);

Scalar rap 'risk aversion parameter' / 0 /;

Variable
   invest(stocks) 'money invested in each stock'
   obj            'number to be maximized';

Positive Variable invest;

Equation
   objj     'objective function'
   investav 'investment funds available';

objj.. obj =e= sum(s, mean(s)*invest(s)) - rap*(sum((s,sp), invest(s)*covar(s,sp)*invest(sp)));

investav.. sum(s, prices(s)*invest(s)) =l= funds;

Model evportfol / all /;

solve evportfol using nlp maximizing obj;

Scalar variance;
variance = sum(s, sum(sp, invest.l(s)*covar(s,sp)*invest.l(sp)));

display variance;

Set rapscenarios 'risk aversion parameters' / r0*r25 /;

Parameter
   riskaver(rapscenarios) 'risk aversion coeficient by risk aversion parameter'
                          / r0  0.00000, r1  0.00025, r2  0.00050, r3  0.00075,
                            r4  0.00100, r5  0.00150, r6  0.00200, r7  0.00300,
                            r8  0.00500, r9  0.01000, r10 0.01100, r11 0.01250,
                            r12 0.01500, r13 0.02500, r14 0.05000, r15 0.10000,
                            r16 0.30000, r17 0.50000, r18 1.00000, r19 2.50000,
                            r20 5.00000, r21 10.0000, r22 15.    , r23 20.
                            r24 40.    , r25 80.                              /;

Parameter
   stockoutput(rapscenarios,stocks) 'results for invest based on model runs with varying rap'
   objlevel(rapscenarios)           'results for objective function from model runs with varying rap'
   investavshadow(rapscenarios)     'results for funds shadow price from model runs with varying rap';

Set dict / rapscenarios.scenario. ''
           rap         .param   .riskaver
           invest      .level   .stockoutput
           obj         .level   .objlevel
           investav    .marginal.investavshadow /;

solve evportfol using nlp maximizing obj scenario dict;

display stockoutput;

Parameter output(*,rapscenarios);

loop(rapscenarios,
   rap = riskaver(rapscenarios);
*  load in solution information
   invest.l(s) = stockoutput(rapscenarios,s);
   obj.l       = objlevel(rapscenarios);
   investav.m  = investavshadow(rapscenarios);
*  compute some items
   investav.l = sum(s,invest.l(s));
   variance   = sum((s,sp), invest.l(s)*covar(s,sp)*invest.l(sp));
   output('rap'      ,rapscenarios) = rap;
   output(stocks     ,rapscenarios) = invest.l(stocks);
   output('obj'      ,rapscenarios) = obj.l;
   output('mean'     ,rapscenarios) = sum(s, mean(s)*invest.l(s));
   output('var'      ,rapscenarios) = variance;
   output('std'      ,rapscenarios) = sqrt(variance);
   output('shadprice',rapscenarios) = investav.m;
   output('idle'     ,rapscenarios) = funds - investav.l;
);
display output;