根据穷举法 (选择3只股票,做穷举法)和二次规划(7只股票)两种方式求给定收益情况下的最优投资组合,并做出最优投资组合均值和方差的有效前沿边界.
/*根据穷举法 (选择3只股票,做穷举法)和二次规划(7只股票)两种方式求给定收益情况下的最优投资组合,
并做出最优投资组合均值和方差的有效前沿边界*/
proc import out=tsj
Datafile='D:\mySASDATA\第10-11周作业\股票数据.xlsx'
DbmS=xlsx replace;
getnames=yes;
run;
data tsj1;
set tsj;
rename var1=code var2=name var3=date var4=close;
drop e;
year=year(var3);
month=month(var3);
run;
proc sort data=tsj1;
by code year month;
run;
data tsj2;
set tsj1;
by code year month;
bh=substr(code,5,2);
bh1=input(bh,best.);
if last.month=1;
run;
%macro a(x);
data sj&x.(keep=year month r_pct&x);
set tsj2;
where bh1=&x.;
r_pct&x.=dif(close)/lag(close);
%mend a;
%a(0);
%a(6);
%a(7);
%a(8);
%a(9);
%a(11);
%a(12);
data hzsj;
merge sj0 sj6 sj7 sj8 sj9 sj11 sj12;
by year month;
run;
/*r_pct12为缺失值最多的数据,若其不存在缺失值,其他也不会存在缺失值*/
data hzsj;
modify hzsj;
if r_pct12=. then remove;
run;
/*选择浦发银行、东风汽车、中国国贸三支股票做穷举法*/
proc means data=hzsj;
var r_pct0 r_pct6 r_pct7;
run;
proc corr data=hzsj outp=jz1 cov;
var r_pct0 r_pct6 r_pct7;
run;
/*给定月收益率为0.0128*/
data qju1;
sgm0=0.1013880;
sgm6=0.1289426;
sgm7=0.1041245;
p06=0.29924;
p07=0.44887;
p67=0.48452;
do rmd0=0 to 1 by 0.001;
x=((0.0128-0.00889)-(0.01402-0.00885)*rmd0)/(0.00885-0.00889 );
if x>=0 and 1-rmd0-x>=0 then do;
rmd6=x;
rmd7=1-rmd0-rmd6;
sgmf=(rmd0**2)*(sgm0**2)+(rmd6**2)*(sgm6**2)+(rmd7**2)*(sgm7**2)+2*rmd0*rmd6*p06*sgm0*sgm6+
2*rmd0*rmd7*p07*sgm0*sgm7+2*rmd6*rmd7*p67*sgm6*sgm7;
sgm=sqrt(sgmf);
output;
end;
end;
run;
proc sort data=qju1(keep=rmd0 rmd6 rmd7 sgm);
by sgm;
run;
/*能够实现该收益率的股票组合只有两个,且其中方差较小组合的股票权重为浦发银行0.757,中国国贸0.15075,东风汽车0.09225*/
/*用穷举法实现有效前沿边界*/
data qju;
/*三支股票收益率标准差*/
sgm0=0.1013880;
sgm6=0.1289426;
sgm7=0.1041245;
/*三支股票收益率的相关系数*/
p06=0.29924;
p07=0.44887;
p67=0.48452;
do u=0.00885 to 0.01402 by 0.00001; /*以单支股票期望收益率的最大值和最小值为限制;
浦发银行的期望收益率为0.01402;东风汽车的期望收益率为0.00885;中国国贸的期望收益率为0.00889 */
do rmd0=0 to 1 by 0.001;
x=((u-0.00889)-(0.01402-0.00885)*rmd0)/(0.00885-0.00889 );
if x>=0 and 1-rmd0-x>=0 then do;
rmd6=x;
rmd7=1-rmd0-rmd6;
sgmf=(rmd0**2)*(sgm0**2)+(rmd6**2)*(sgm6**2)+(rmd7**2)*(sgm7**2)+2*rmd0*rmd6*p06*sgm0*sgm6+
2*rmd0*rmd7*p07*sgm0*sgm7+2*rmd6*rmd7*p67*sgm6*sgm7;
sgm=sqrt(sgmf);
output;
end;
end;
end;
run;
proc sort data=qju(keep=sgm u);
by u sgm;
run;
data a;
set qju;
by u;
if first.u=1;
run;
proc means data=a;
var sgm;
run;
/*为实现取到方差边界的上半部分*/
proc sort data=a;
by sgm;
run;
data a;
modify a;
if u<0.01124 then remove;
run;
proc gplot data=a;
plot u*sgm/vaxis=axis1 haxis=axis2;
symbol v=. i=joint l=1 h=1 font=swissb;
axis1 label=('u') order=(0.003 to 0.014 by 0.001);
axis2 label=('sgm') order=(0.07to 0.13by 0.01);
run;
quit;
/*二次规划法*/
proc means data=hzsj;
var r_pct0 r_pct6 r_pct7 r_pct8 r_pct9 r_pct11 r_pct12;
run;
proc corr data=hzsj outp=jz cov;
var r_pct0 r_pct6 r_pct7 r_pct8 r_pct9 r_pct11 r_pct12;
run;
/*给定月收益率为0.0128*/
proc nlp outest=res;
minquad H;
array H[7,7]/*七支股票的方差斜方差矩阵*/
0.010279517 0.003911987 0.004738705 0.005061913 0.004697406 0.003911546 0.003544451
0.003911987 0.01662619 0.006505223 0.007125265 0.004944345 0.005943739 0.006443034
0.004738705 0.006505223 0.010841921 0.00643555 0.004874296 0.004630695 0.003977063
0.005061913 0.007125265 0.00643555 0.016569929 0.006128552 0.008161452 0.005194841
0.004697406 0.004944345 0.004874296 0.006128552 0.009398918 0.005402018 .004422935
0.003911546 0.005943739 0.004630695 0.008161452 0.005402018 0.011383444 0.004511077
0.003544451 0.006443034 0.003977063 0.005194841 0.004422935 0.004511077 0.010691314
;
/*七支股票中预期收益率最小为0.0066495,最大为0.0152749*/
parms x1-x7;
bounds 0<=x1-x7;
lincon x1+x2+x3+x4+x5+x6+x7=1,
0.01402*x1+0.00885*x2+0.00889*x3+0.01011*x4+0.01527*x5 +0.00665*x6+0.00933*x7>=0.0128;
run;
/*得到的最优投资组合的股票权重为浦发银行0.3076506378,东风汽车0.0137734095,
中国国贸0.0980633997,首创股份0,上海机场0.3618916495,华能国际0.02714879,皖通高速0.1914721135*/
/*用二次规划法实现有效前沿边界*/
%macro ecgh;
data b;
_RHS_=0;
sy=0;
%do u=66 %to 153;
proc nlp outest=res;
minquad H;
array H[7,7]/*七支股票的方差斜方差矩阵*/
0.010279517 0.003911987 0.004738705 0.005061913 0.004697406 0.003911546 0.003544451
0.003911987 0.01662619 0.006505223 0.007125265 0.004944345 0.005943739 0.006443034
0.004738705 0.006505223 0.010841921 0.00643555 0.004874296 0.004630695 0.003977063
0.005061913 0.007125265 0.00643555 0.016569929 0.006128552 0.008161452 0.005194841
0.004697406 0.004944345 0.004874296 0.006128552 0.009398918 0.005402018 .004422935
0.003911546 0.005943739 0.004630695 0.008161452 0.005402018 0.011383444 0.004511077
0.003544451 0.006443034 0.003977063 0.005194841 0.004422935 0.004511077 0.010691314
;
/*七支股票中预期收益率最小为0.0066495,最大为0.0152749*/
parms x1-x7;
bounds 0<=x1-x7;
lincon x1+x2+x3+x4+x5+x6+x7=1,
140.2*x1+88.5*x2+88.9*x3+101.1*x4+152.7*x5+66.5*x6+93.3*x7>=&u.;/*不等式两边同时乘10000,宏程序中对数据计算太为困难*/
run;
data b1;
set res;
if _TYPE_="GE" then sy=_RHS_ ;
where _TYPE_="GE" ;
keep sy;
data b2;
set res;
where _TYPE_="PARMS";
keep _RHS_ ;
_RHS_=_RHS_*2;
data b3;
merge b1 b2;
run;
proc append base=b data=b3;
run;
%end;
%mend ecgh;
quit;
%ecgh;
data b;
set b;
sy=sy/10000;/*再把10000除掉,得到真正的收益率*/
_RHS_=sqrt(_RHS_);
run;
proc sort data=b;
by _RHS_ sy;
run;
/*发现前45个观测值中方差为同一个,但收益不同,,取其中收益最大的,其他删掉*/
data b;
modify b;
if sy<=0.0108 then remove;
run;
proc means data=b;
var _RHS_ sy;
run;
proc gplot data=b;
plot sy*_RHS_/vaxis=axis1 haxis=axis2;
symbol v=. i=join l=1 h=1 font=swissb;
axis1 label=('收益率') order=(0.005 to 0.016by 0.001);
axis2 label=('标准差') order=(0.07 to 0.1 by 0.01);
run;
quit;
穷举法得到的有效边界
二次规划得到的有效边界
文章中数据链接可参考,或进入本人资源中查找
https://download.youkuaiyun.com/download/shushujiuhui123/21910938