If interested, please refer to the paper in the following link
http://www.engineering.uiowa.edu/~krokhmal/pdf/cvar.pdf
***************************************************;
%let num_senarios=1000;
%let num_fin_instruments=5;
%let omega=0.025;
%let alpha=0.95;
data sim;
array returns(*) return1-return&num_fin_instruments;
do i=1 to &num_senarios;
do j=1 to &num_fin_instruments;
returns(j)=0.01*j+rannor(1230)*0.02*j;
end;
output;
end;
drop i j;
run;
proc optmodel noprint;
set <num> index_senario;
set <num> index_fin_instruments = 1..&num_fin_instruments;
num returns{index_senario,index_fin_instruments};
num omega =&omega ;
read data sim into index_senario =[_n_]
{r in index_fin_instruments} <returns[_n_,r]=col("return"||r)>;
var z{i in index_senario} >=0;
var x{j in index_fin_instruments} >=0 <=0.25; ***concentration contraints**;
var KI ;
min func=(KI + sum{i in index_senario} 1/(&num_senarios*(1-&alpha))*z[i]);
con cVar {i in index_senario}:
z[i] >= sum{j in index_fin_instruments} (-1)*returns[i,j] * x[j] - KI;
****linearization contraints***;
con xtot: sum{j in index_fin_instruments} x[j]=1;
****allocation total is 100%***;
con target: sum{i in index_senario,j in index_fin_instruments}
(1/&num_senarios)* returns[i,j] * x[j]>=omega;
***return targets***;
solve;
/*expand;*/
impvar ret=sum{i in index_senario,j in index_fin_instruments}
(1/&num_senarios)* returns[i,j] * x[j];
print func ki x omega ret;
num omega2=omega+0.005;
con target2: sum{i in index_senario,j in index_fin_instruments}
(1/&num_senarios)* returns[i,j] * x[j]>=omega+0.005;
solve;
print func ki x omega2 ret;
create data solution from [i]={index_fin_instruments} x=x;
quit;



雷达卡




京公网安备 11010802022788号







