$title Standard QP Model - conic formulation (QP7,SEQ=271)
$onText
Illustrates the use of conic formulation for quadratic
programs by implementing rotated quadratic cones.
For the original model in quadratic programming format
http://www.gams.com/modlib/adddocs/qp1doc.htm
The quadratic component x^T*CoVar(s,t)*x is modeled as:
(|d|-1)*x^T*CoVar(s,t)*x = x^Tdev(s,d)^T*dev(t,d)*x = ||Dx||^2
= sum(d, w_i^2) with w = Dx
:= 2*p*q
which leads to the formulation in this model whose last constraint is
a rotated quadratic cone.
Optional inputs:
--numdays investment period in number of days (default: 31).
Days: 1-100
--numstocks number of stocks invested (default: 51)
Stocks: 1-170
Andersen, E, MOSEK Optimization Tools Manual
Kalvelagen, E, Model Building with GAMS. forthcoming
Keywords: quadratic constraint programming, conic optimization, finance
$offText
* Set default number of days and number of stocks
$if not set numdays $set numdays 31
$if not set numstocks $set numstocks 51
$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) < %numdays%;
s(stocks) = ord(stocks) < %numstocks%;
Parameter
mean(stocks) 'mean of daily return'
dev(stocks,days) 'deviations'
totmean 'total mean return';
mean(s) = sum(d, return(s,d))/card(d);
dev(s,d) = return(s,d) - mean(s);
totmean = sum(s, mean(s))/(card(s));
Variable
z 'objective variable'
x(stocks) 'investments'
w(days) 'intermediate variable for rotated cone'
p 'intermediate variable for rotated cone'
q 'intermediate variable for rotated cone';
Positive Variable x, p, q;
Equation
obj 'objective'
budget
retcon 'return constraint'
wcone(days)
qone 'conic constraint'
rcone 'rotated quadratic cone constraint';
obj.. z =e= 2/(card(d) - 1)*p;
wcone(d).. w(d) =e= sum(s, x(s)*dev(s,d));
* This is really awful:
qone.. q =e= 1;
* Explicit cone syntax for MOSEK
* rcone.. p + q =c= sum(d, w(d));
rcone.. 2*p*q =g= sum(d, sqr(w(d)));
budget.. sum(s, x(s)) =e= 1.0;
retcon.. sum(s, mean(s)*x(s)) =g= totmean*1.25;
Model qp7 / all /;
solve qp7 using qcp minimizing z;
display x.l;