SAS在金融中的应用五

根据穷举法 (选择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.csdn.net/download/shushujiuhui123/21910938

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值