qp1.gms : Standard QP Model

Description

The first in a series of variations on the standard
QP formulation. The subsequent models exploit data
and problem structures to arrive at formulations that
have sensational computational advantages. Additional
information can be found at:

http://www.gams.com/modlib/adddocs/qp1doc.htm


Small Model of Type : NLP


Category : GAMS Model library


Main file : qp1.gms   includes :  qpdata.inc

$title Standard QP Model (QP1,SEQ=171)

$onText
The first in a series of variations on the standard
QP formulation. The subsequent models exploit data
and problem structures to arrive at formulations that
have sensational computational advantages. Additional
information can be found at:

http://www.gams.com/modlib/adddocs/qp1doc.htm


Kalvelagen, E, Model Building with GAMS. forthcoming

de Wetering, A V, private communication.

Keywords: nonlinear programming, quadratic programming, finance
$offText

$include qpdata.inc

Set
   d(days)   'selected days'
   s(stocks) 'selected stocks';

Alias (s,t);

* select subset of stocks and periods
d(days)   = ord(days) > 1 and ord(days) < 31;
s(stocks) = ord(stocks) < 51;

Parameter
   mean(stocks)          'mean of daily return'
   dev(stocks,days)      'deviations'
   covar(stocks,sstocks) 'covariance matrix of returns (upper)'
   totmean               'total mean return';

mean(s)  = sum(d, return(s,d))/card(d);
dev(s,d) = return(s,d) - mean(s);

* calculate covariance
* to save memory and time we only compute the uppertriangular
* part as the covariance matrix is symmetric
covar(upper(s,t)) = sum(d, dev(s,d)*dev(t,d))/(card(d) - 1);
totmean           = sum(s, mean(s))/(card(s));

Variable
   z         'objective variable'
   x(stocks) 'investments';

Positive Variable x;

Equation
   obj    'objective'
   budget
   retcon 'return constraint';

obj..    z =e= sum(upper(s,t), x(s)*covar(s,t)*x(t))
            +  sum(lower(s,t), x(s)*covar(t,s)*x(t));

budget.. sum(s, x(s)) =e= 1.0;

retcon.. sum(s, mean(s)*x(s)) =g= totmean*1.25;

Model qp1 / all /;

* Some solvers need more memory
qp1.workFactor = 10;

solve qp1 using nlp minimizing z;

display x.l;