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

Description

Portfolio selection model solved for alternative risk aversion parameters


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
$offtext

sets stocks  potential investments / buystock1*buystock4 /
     events  equally likely return states of nature / event1*event10 / ;
alias (stocks,s,sp), (events,e,ep);

parameters
     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;

parameters
     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 /

variables
     invest(stocks)  money invested in each stock
     obj             number to be maximized ;
positive variables invest;
equations
     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;