sas金融计算清华朱世武数据集char04.docx
《sas金融计算清华朱世武数据集char04.docx》由会员分享,可在线阅读,更多相关《sas金融计算清华朱世武数据集char04.docx(21页珍藏版)》请在冰豆网上搜索。
sas金融计算清华朱世武数据集char04
4.1.2通用计算程序
数据集准备:
(程序时点设为2000年12月31日)
dataa;
setcompufin.header_genius(keep=f0001f0002f0003f0004);
procsortdata=a;
byf0001;
run;
datab(keep=f0001gb002gb004gb008gb009gb016gb017gb018);
setcompufin.shares_genius;
procsortdata=b;
byf0001gb002;
datac;
mergeab;
byF0001;
iff0002=.thendelete;
iff0003=’A’;/*只算A股*/
run;
datac;
setc;
date=datepart(gb002);
ifdate>'31dec2000'dthendelete;/*2000年12月31日,其它时点可修改此处*/
run;
datac;
setc;
byf0001;
iflast.f0001;
run;
datac;
setc;
a_state=gb008+gb009;
a_all=gb004-gb017-gb018;/*全部a股股本,求全市场股票比率修改此处*/
run;
datac_1(keep=suma_statesuma_allsuma_pubratio_stateratio_pub);
setcend=aaa;
suma_all+a_all;
suma_state+a_state;
suma_pub+gb016;
ratio_state=100*suma_state/suma_all;
ratio_pub=100*Suma_pub/suma_all;
Ifaaa=1;
putsuma_state/Suma_pub/suma_all/Ratio_state/ratio_pub=;
Run;
A股计算结果:
2000年12月31日:
Suma_State=215044425739
Suma_Pub=103400844064
Suma_All=346763200649
Ratio_State=62.01477704
Ratio_Pub=29.818863095
20001年8月31日:
Suma_State=287393936240
Suma_Pub=121828508426
Suma_All=438426705492
Ratio_State=65.551193082
Ratio_Pub=27.787656842
Suma_State=287393936240
Suma_All=438426705492
Ratio=65.551193082
4.1.3指数300成份股股本比例计算
创建数据集STALL_GENIUS:
dataa;
setcompufin.header_genius(keep=f0001f0002f0003f0004);
procsortdata=a;
byf0001;
run;
datab(keep=f0001gb002gb004gb008gb009gb016gb017gb018);
setcompufin.shares_genius;
procsortdata=b;
byf0001gb002;
datastall_genius;
mergeab;
byf0001;
iff0002=.thendelete;
iff0003='A';/*只算A股*/
run;
datacompufin.stall_genius;
setstall_genius;
date=datepart(gb002);
ifdate>='18jan2001'dthendelete;/*2001年1月18日前全部A股*/
run;
datacompufin.stall_genius;
setcompufin.stall_genius;
byf0001;
iflast.f0001;
run;
求数据集C_1,股本数据集,包括2001年1月18日前全部A股股票并标识INX300_GENIUS中的股票。
datacode300;
setcompufin.inx300_genius;
lengthf0002$6.;
ifsubstr(hstocd,1,1)='1'thenf0002=substr(hstocd,3,6);
ifsubstr(hstocd,1,1)='2'thenf0002=substr(hstocd,5,4);
formatf0002$6.;
run;
procsortdata=code300;
byf0002;
run;
procsortdata=compufin.stall_genius;
byf0002;
datac_1;
mergecompufin.stall_geniuscode300;
byf0002;
run;
全部1127支A股股票的股本计算结果:
datac_2;
setc_1;
a_state=gb008+gb009;
a_all=gb004-gb017-gb018;/*全部a股股本,求全市场股票比率修改此处*/
run;
datac_2(keep=suma_statesuma_allsuma_pubratio_stateratio_pub);
setc_2end=aaa;
suma_all+a_all;
suma_state+a_state;
suma_pub+gb016;
ratio_state=100*suma_state/suma_all;
ratio_pub=100*suma_pub/suma_all;
ifaaa=1;
putsuma_state=/suma_pub=/suma_all=/ratio_state=/ratio_pub=;
run;
计算结果:
suma_state=215416057679
suma_pub=104347783661
suma_all=347518799628
ratio_state=61.986878957
ratio_pub=30.026514759
300支成份股的股本计算结果:
datac_3;
setc_1;
ifhstocd=.thendelete;
a_state300=gb008+gb009;
a_all300=gb004-gb017-gb018;
run;
datac_3(keep=suma_state300suma_all300suma_pub300ratio_state300ratio_pub300);
setc_3end=aaa;
suma_all300+a_all300;
suma_state300+a_state300;
suma_pub300+gb016;
ratio_state300=100*suma_state300/suma_all300;
ratio_pub300=100*suma_pub300/suma_all300;
ifaaa=1;
putsuma_state300=;
putSuma_pub300=;
putsuma_all300=;
putRatio_state300=;
putratio_pub300=;
Run;
300成份股中股本占全部A股票(1127支)股本的相关比例计算:
datac_4;
mergec_2c_3;
ratio_all=100*Suma_all300/Suma_all;
ratio_state=100*Suma_state300/Suma_state;
ratio_pub=100*Suma_pub300/Suma_pub;
putratio_all=;
putratio_state=;
putratio_pub=;
run;
4.2.1成指300市值比例计算
创建数据集STALL_GENIUS:
dataa;
setcompufin.header_genius(keep=f0001f0002f0003f0004);
procsortdata=a;
byf0001;
run;
datab(keep=f0001gb002gb004gb008gb009gb016gb017gb018);
setcompufin.shares_genius;
procsortdata=b;
byf0001gb002;
datastall_genius;
mergeab;
byF0001;
iff0002=.thendelete;
iff0003='A';/*只算A股*/
run;
datacompufin.stall_genius;
setstall_genius;
date=datepart(gb002);/*返回日期时间值的日期部分*/
ifdate>='31dec2000'dthendelete;/*2000年12月31日,其它时点可修改此处*/
run;
datacompufin.stall_genius;
setcompufin.stall_genius;
byf0001;
iflast.f0001;
run;
求数据集C_1,股本数据集,包括2000年12月31日前全部A股股票并标识INX300_GENIUS中的股票。
datacode300;
setcompufin.inx300_genius;
lengthf0002$6.;
ifsubstr(hstocd,1,3)='116'thenf0002=substr(hstocd,3,6);
ifsubstr(hstocd,1,5)='21000'thenf0002=substr(hstocd,3,6);
formatf0002$6.;
run;
procsortdata=code300;
byf0002;
run;
dataa;
setcompufin.stall_genius;
lengthf0002$6.;
ifsubstr(f0002,1,1)='0'thenf0002a='00'||f0002;/*||起连接作用*/
elsef0002a=f0002;
f0002=f0002a;
run;
procsortdata=compufin.stall_genius;
byf0002;
datac_1;
mergeacode300;
byf0002;
run;
求2000年12月31日的个股票收盘价,个股以当天收盘价为准,如果停盘则用最近有交易日收盘价。
从行情数据集COMPUFIN.QUOT中求得有效A股数为1060支。
dataquot;
setcompufin.quot(keep=dateclprhstocd);
ifyear(date)=2000;
run;
procsortdata=quot;
byhstocddate;
run;
dataquot;
setquot;
byhstocd;
iflast.hstocd;
run;
dataquot;
setquot;
ifsubstr(hstocd,1,3)='116'thenf0002=substr(hstocd,3,6);
ifsubstr(hstocd,1,5)='21000'thenf0002=substr(hstocd,3,6);
iff0002=.thendelete;/*结果显示,行情数据中1060支A股有数据*/
run;
计算2000年12月31日1060支A股的市值:
procsortdata=quot;
byf0002;
dataquot_c;
mergequotc_1;
byf0002;
a_state=gb008+gb009;
a_all=gb004-gb017-gb018;
a_pub=gb016;
cap_state=clpr*a_state;
cap_pub=clpr*a_pub;
cap_all=clpr*a_all;
run;
dataquot_c(keep=sumcap_allsumcap_statesumcap_pubratio_stateratio_pub);
setquot_cend=aaa;
sumcap_all+cap_all;
sumcap_state+cap_state;
sumcap_pub+cap_pub;
ratio_state=100*sumcap_state/sumcap_all;
ratio_pub=100*sumcap_pub/sumcap_all;
ifaaa=1;
putsumcap_all=;
putsumcap_state=;
putsumcap_pub=;
putratio_state=;
putratio_pub=;
run;
/*300支A股的市值数据*/
datac_2;
setc_1;
ifhstocd=.thendelete;
id=1;
run;
datacap300;
mergequotc_2(drop=date);
byf0002;
ifid=.thendelete;
run;
datacap300;
setcap300end=aaa;
state300=gb008+gb009;
pub300=gb016;
all300=gb004-gb017-gb018;
cap_state300=clpr*state300;
cap_pub300=clpr*pub300;
cap_all300=clpr*all300;
sumcap_state300+cap_state300;
sumcap_pub300+cap_pub300;
sumcap_all300+cap_all300;
ratio_state300=100*sumcap_state300/sumcap_all300;
ratio_pub300=100*sumcap_pub300/sumcap_all300;
ifaaa=1;
putsumcap_state300=;
putsumcap_pub300=;
putsumcap_all300=;
putratio_state300=;
putratio_pub300=;
run;
300支A股的市值占相应总市值比例计算:
dataa;
mergequot_ccap300;
r300all_all=100*sumCap_all300/SumCap_all;
r300state_all=100*sumCap_State300/SumCap_all;
r300state_state=100*sumCap_State300/SumCap_state;
r300pub_all=100*sumCap_pub300/SumCap_pub;
putr300all_all=;
putr300state_all=;
putr300state_state=;
putr300pub_all=;
run;
4.2.2行业市值比例计算
dataquot;
setcompufin.quot(keep=dateclprhstocd);
ifyear(date)=1999;
run;
procsortdata=quot;
byhstocddate;
run;
dataquot;
setquot;
byhstocd;
iflast.hstocd;
run;
dataquot;
setquot;
ifsubstr(hstocd,1,3)='116'thenf0002=substr(hstocd,3,6);
ifsubstr(hstocd,1,5)='21000'thenf0002=substr(hstocd,3,6);
iff0002=.thendelete;/*结果显示,行情数据中923支A股有数据*/
run;
创建数据集STALL_GENIUS,股本数据集,包括1999年12月31日前全部A股股票。
(计算结果一共有1045支股票)
dataa;
setcompufin.header_genius(keep=f0001f0002f0003f0004);
procsortdata=a;
byf0001;
run;
datab(keep=f0001gb002gb004gb008gb009gb016gb017gb018);
setcompufin.shares_genius;
procsortdata=b;
byf0001gb002;
datastall_genius;
mergeab;
byf0001;
iff0002=.thendelete;
iff0003='A';/*只算A股*/
run;
datastall_genius;
setstall_genius;
date=datepart(gb002);
ifdate>='31dec1999'dthendelete;/*1999年12月31日,其它时点可修改此处*/
run;
datastall_genius;
setstall_genius;
byf0001;
iflast.f0001;
run;
datastall_genius;
setstall_genius;
lengthf0002$6.;
ifsubstr(f0002,1,1)='0'thenf0002a='00'||f0002;
elsef0002a=f0002;
f0002=f0002a;
dropf0002a;/*结果显示,有1045支股票的股本数据*/
run;
计算A股市值,即计算1999年12月31日923支A股的市值,结果数据集为QUOT_C:
procsortdata=quot;
byf0002;
procsortdata=stall_genius;
byf0002;
dataquot_c;
mergequotstall_genius;
byf0002;
a_state=gb008+gb009;
a_all=gb004-gb017-gb018;
a_pub=gb016;
cap_state=clpr*a_state;
cap_pub=clpr*a_pub;
cap_all=clpr*a_all;
run;
A股总市值,即,923支A股的市值(注:
这并不是我们要的结果)
datasums(keep=sumcap_allsumcap_statesumcap_pub);
setquot_cend=aaa;
sumcap_all+cap_all;
sumcap_state+cap_state;
sumcap_pub+cap_pub;
ifaaa=1;
putsumcap_all=;
putsumcap_state=;
putsumcap_pub=;
run;
A股行业分类数据集INDCLS:
Dataindcls;
Setcompufin.indcls;
Lengthf0002$6.;
Ifsubstr(scode,1,1)='0'orsubstr(scode,1,1)='6';
ifsubstr(scode,1,1)='0'thenf0002='00'||scode;
elsef0002=scode;
Run;/*结果显示,有1110支A股股票,但有一些没有进行分类*/
将市值数据集QUOT_C和行业分类数据集INDCLS全并,形成数据集MARKCAP:
procsortdata=quot_c;
byf0002;
procsortdata=indcls;
byf0002;
datamarkcap;
mergequot_cindcls;
byf0002;
run;/*1110个数据*/
删除数据集MARKCAP中的缺失值:
datamarkcap;
setmarkcap;
ifcap_all=.thendelete;
run;/*923个数据*/
按沪深两市将数据集MARKCAP分为MARKCAP_SH和MARKCAP_SZ:
datamarkcap_sh;
setmarkcap;
ifsubstr(f0002,1,1)='6';
run;
datamarkcap_sz;
setmarkcap;
ifsubstr(f0002,1,1)='0';
run;
直接输出EXCEL结果表:
%macrob(y);
procsortdata=markcap;
by&y;
dataweights_&y(keep=&y);
setmarkcap;
by&y;
iflast_&y=1;
%macroa(x);
procsortdata=&x;
by&y;
procmeansdata=&x;
varcap_all;
by&y;
outputout=bsum=sum;
run;
procmeansdata=b;
varsum;
outputout=csum=all;
run;
datab;
mergebc;
sumall+all;
run;
dataa(keep=&yweights_&x);
setb;
weights_&x=100*sum/sumall;
dataweights_&y;
mergeweights_&ya;
by&y;
ifweights_&x=.thenweights_&x=0;
%menda;
%a(markcap);
%a(markcap_sh);
%a(markcap_sz);
procexportdata=weights_&y
outfile="d:
\基于sas系统的金融计算光盘\compufin\%str(&y)weightsresults.xls"
dbms=excel5replace;
procexportdata=weights_&y
outfile="d:
\基于sas系统的金融计