portfolio.gms : Stochastic portfolio model

Description

This is a GAMS version of a LINGO model

Conditional Value at Risk model(PORTCVAR)
We specify a probability, theta, e.g., 0.1, and
then we want the model to choose a) a target return,
and b) a portfolio composition, so as to
 Max theta*target - (expected shortfall below target).
It is easy to see that if all scenarios are equally likely,
then it is worthwhile increasing the target as long as
less than theta of the scenarios fall short of the target.
So at an optimum, the probability of missing the target
is about theta.;

Key words: Conditional Value at Risk, CVAR, Value at Risk,
           Downside risk, Scenario method, Portfolio;


Small Model of Type : SP


Category : GAMS EMP library


Main file : portfolio.gms

$Title Stochastic portfolio model (PORTFOLIO,SEQ=80)

$ontext

This is a GAMS version of a LINGO model

Conditional Value at Risk model(PORTCVAR)
We specify a probability, theta, e.g., 0.1, and
then we want the model to choose a) a target return,
and b) a portfolio composition, so as to
 Max theta*target - (expected shortfall below target).
It is easy to see that if all scenarios are equally likely,
then it is worthwhile increasing the target as long as
less than theta of the scenarios fall short of the target.
So at an optimum, the probability of missing the target
is about theta.;

Key words: Conditional Value at Risk, CVAR, Value at Risk,
           Downside risk, Scenario method, Portfolio;

$offtext

Set j assets    / ATT, GMC, USX /
    s scenarios / s1*s12 /

Table vs(s,j) scenario returns from assets
     att     gmc     usx
 s1  1.300   1.225   1.149
 s2  1.103   1.290   1.260
 s3  1.216   1.216   1.419
 s4  0.954   0.728   0.922
 s5  0.929   1.144   1.169
 s6  1.056   1.107   0.965
 s7  1.038   1.321   1.133
 s8  1.089   1.305   1.732
 s9  1.090   1.195   1.021
s10  1.083   1.390   1.131
s11  1.035   0.928   1.006
s12  1.176   1.715   1.908;

Alias (j,jj);
Parameter
    mean(j)      mean return
    dev(s,j)     deviations
    covar(j,jj)  covariance matrix of returns
    totmean      total mean return;

mean(j)     = sum(s, vs(s,j))/card(s);
dev(s,j)    = vs(s,j) - mean(j);
covar(j,jj) = sum(s, dev(s,j)*dev(s,jj))/(card(s)-1);
totmean     = sum(j, mean(j))/card(j);

display mean, dev, covar, totmean;

Parameter
    p(s)   probability / #s [1/card(s)] /
    v(j)   return from assets; v(j) = mean(j);
Scalar
    theta  relative volume / [1-0.9] /
    lambda weight EV versus CVaR / 0.2 /;

Variables
    r      value of portfolio under each scenario
    w(j)   portfolio selection;

Positive variables w;

Equations
    defr     return of portfolio
    budget   budget constraint;

defr..     r =e= sum(j, v(j)*w(j));

budget..   sum(j, w(j)) =e= 1;

model portfolio / all /;

file emp / '%emp.info%' /; emp.nd=4;
put emp '* problem %gams.i%'
      / 'stage 2 r defr v'
      / "jrandvar v('att') v('gmc') v('usx')"
loop(s,
  put / p(s) vs(s,"att") vs(s,"gmc") vs(s,"usx"));
putclose emp;

Parameter
    s_v(s,j)     return from assets by scenario /s1.att 1/
    s_r(s)       return from portfolio by scenario;

Set dict / s     .scenario.''
           v     .randvar. s_v
           r     .level.   s_r /;

solve portfolio using emp max r scenario dict;

display s_r;

put emp '* problem %gams.i%'
      / 'cvarlo ' theta
      / 'stage 2 r defr v'
      / "jrandvar v('att') v('gmc') v('usx')"
loop(s,
  put / p(s) vs(s,"att") vs(s,"gmc") vs(s,"usx"));
putclose emp;

solve portfolio using emp max r scenario dict;
display s_r;

* Extended model with convex combination for EV(r) and CVaR(r)
Variables
    CVaR_r    conditional value at risk of r
    EV_r      expected value of r
    obj       objective variable;
Equations
    defobj    convex combination for both risk measures;

defobj..   obj =e= lambda*EV_r + (1-lambda)*CVaR_r;

model portfolio_ext / all /;

put emp '* problem %gams.i%'
      / 'ExpectedValue r EV_r'
      / 'cvarlo r CVaR_r ' theta
      / 'stage 2 r defr v'
      / 'stage 1 defobj obj'
      / "jrandvar v('att') v('gmc') v('usx')"
loop(s,
  put / p(s) vs(s,"att") vs(s,"gmc") vs(s,"usx"));
putclose emp;

solve portfolio_ext using emp max obj scenario dict;
display s_r;