This is SAS optmodel implementation of Portfolio optimization with CVaR. The sim block is a simple simulation of returns of financial instruments. You may replace it with real data observed from stock exchanges or with other joint distributions
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;