sas金融计算清华朱世武数据集char02.docx
- 文档编号:3835713
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:18
- 大小:18.44KB
sas金融计算清华朱世武数据集char02.docx
《sas金融计算清华朱世武数据集char02.docx》由会员分享,可在线阅读,更多相关《sas金融计算清华朱世武数据集char02.docx(18页珍藏版)》请在冰豆网上搜索。
sas金融计算清华朱世武数据集char02
2.2.1创建单期收益计算环境
dataa;
setstoindif.a1a0001;
year=year(date);
qtr=qtr(date);
month=month(date);
procsortdata=a;
byyearqtrmonth;
run;
datab;
seta;
last_y=last.year;/*标出某年的最后一个交易日*/
last_q=last.qtr;/*标出某季的最后一个交易日*/
last_m=last.month;/*标出某月的最后一个交易日*/
byyearqtrmonth;
run;
2.2.2年收益计算
datar_year(keep=dater_pctr_loglabel="年收益");
setb;
iflast_y=1;/*取各年最后一个交易日的数据*/
r_pct=dif(clpr)/lag(clpr_r);/*计算百分比收益*/
r_log=log(clpr_r)-log(lag(clpr_r));/*计算对数收益*/
/*函数log(x)是以e为底的自然对数,其它对数函数还有log2(x),log10(x)*/
run;
2.2.3季收益计算
datar_qtr(keep=dater_pctr_loglabel="季收益");
setb;
iflast_q=1;/*取各季最后一个交易日的数据*/
r_pct=dif(clpr_r)/lag(clpr_r);
r_log=log(clpr_r)-log(lag(clpr_r));
run;
2.2.4月收益计算
datar_month(keep=dater_pctr_loglabel="月收益");
setb;
iflast_m=1;/*取各月最后一个交易日的数据*/
r_pct=dif(clpr_r)/lag(clpr_r);
r_log=log(clpr_r)-log(lag(clpr_r));
run;
2.2.5周收益计算
程序一:
dataa;
setstoindif.a1a0001;
wd=weekday(date);
dif=dif(wd);
dif2=dif(date);
if(dif<0anddif^=.)ordif2>=7then
index=1;elseindex=0;
dataa(keep=dateclpr_rindex);
seta;
date=lag(date);
clpr_r=lag(clpr_r);
ifindex=1;
datar_week(keep=dater_pctr_log);
seta;
r_pct=dif(clpr_r)/lag(clpr_r);
r_log=log(clpr_r)-log(lag(clpr_r));
ifr_log=.thendelete;
run;
程序二:
datab;
setstoindif.a1a0001;
wk=int((date-3)/7+2);
/*wk为周的标号,设定1960年1月1日为第一周。
由于1960年1月1日为周五,所以第一周共有三天。
注意该周(1960年1月1日到3日)对应日期按SAS的标准分别为0,1和2(于是(date-3)/7都等于-1)。
由此可以理解为什么这样设定表达式*/
procsort;
bydate;
run;
datab;
setb;
last_wk=last.wk;
bywk;
run;
datab(keep=dater_pct1r_log1);
setb;
iflast_wk=1;
r_pct1=dif(clpr)/lag(clpr);
r_log1=log(clpr)-log(lag(clpr));
run;
datac;/*检测程序一和程序二的一致性*/
merger_weekb;
bydate;
ifr_pct=r_pct1thenaa=1;
elseaa=0;/*最后一个不一样*/
run;
2.2.6日收益计算
datar_day(keep=dater_pctr_loglabel="日收益");
setstoindif.a1a0001;
r_pct=dif(clpr_r)/lag(clpr_r);
r_log=log(clpr_r)-log(lag(clpr_r));
run;
2.2.7日复权收益直接计算
datareturn(keep=date);
setstoindif.a1a0001;
where1997<=year(date)<=2000;
dataa(keep=dater_1);
setstoindif.a600601;
where1997<=year(date)<=2000;
r_1=log(clpr)-log(lag(clpr));
clpr_1=clpr*(1+divrat+rigrat+reisvol/lag(shrout))-rigpr*rigrat–reispr*reisvol/lag(shrout)+divamt;/*clpr_1为复权价格*/
ifclpr_1=.thenclpr_1=clpr;
r_2=log(clpr_1)-log(lag(clpr_1));
ifexdt=.thenr_2=0;
ifexdt^=.thenr_1=0;
r_1=r_1+r_2;
ifr_1=.thenr_1=0;
elser_1=r_1;
datareturn(rename=(r_1=r600601));
mergereturna;
bydate;
datareturn;
setreturn;
ifr600601=.thenr600601=0;
elser600601=r600601;
run;
2.2.8绘制收益图
procgplotdata=r_day;
plotr_pct*date/vref=0;
plotr_log*date/vref=0;
run;
2.2.9多期平均收益率计算
/*建立满足条件的数据集*/
dataa1;
setr_year;
where1995<=year(date)<=2000;
procprint;
run;
/*对数据集转置*/
proctransposedata=a1out=a2;
varr_pct;
procprint;
run;
/*计算年平均收益*/
dataa3(keep=amgm);
seta2;
c1=col1+1;
c2=col2+1;
c3=col3+1;
c4=col4+1;
c5=col5+1;
c6=col6+1;
gm=(c1*c2*c3*c4*c5*c6)**(1/6)-1;
am=mean(ofcol1-col6);
procprint;
run;
/*变量太多时,用数组的方法处理简单些*/
dataa4(keep=amgm);
seta2;
t=6;
arraycol(6)col1-col6;
arrayc(6)c1-c6;
doi=1to6;
c(i)=col(i)+1;
end;
gm=((c1*c2*c3*c4*c5*c6)**(1/t))-1;
am=mean(ofcol1-col6);
procprint;
run;
dataa5;
setb;
iflast_y=1and1995<=year(date)<=2000;
run;
dataa6;
retainbeginend;
seta5end=lastobs;
if_n_=1thenbegin=clpr_r;/*将数据集第一个观测值的复权价赋给变量begin*/
iflastobsthendo;
end=clpr_r;/*将数据集最后一个观测值的复权价赋给变量end*/
output;
end;
dataa6(keep=gm);
seta6;
gm=(end/begin)**(1/6)-1;
procprint;
run;/*该方法主要优点是精确*/
2.3.1由最新股票标识数据集创建宏文本
创建全部A股股票宏文本:
全部A股票.TXT
dataa(drop=hexcd);
setcompufin.header;
ifsubstr(hstocd,3,1)=6orsubstr(hstocd,1,5)=21000;/*substr()为取子串函数*/
run;
dataa;
lengthhexcd$6.;
seta;
hexcd=substr(hstocd,3,6);
labelhexcd='最新交易所代码';
run;
dataa;
seta;
a='%a(';
b=',';
c=');';
file"d:
\基于sas系统的金融计算光盘\compufin\宏文本\全部A股.txt";
puta$hexcd$b$hcomnam$c$;
run;
创建宏文本:
沪市全部A股.txt
data;
seta;
ifsubstr(hexcd,1,1)=6;
a='%a(';
b=',';
c=');';
file"d:
\基于sas系统的金融计算光盘\compufin\宏文本\沪市全部A股.txt";
puta$hexcd$b$hcomnam$c$;
run;
创建宏文本:
深市全部A股.txt";
data;
seta;
ifsubstr(hexcd,1,1)=0;
a='%a(';
b=',';
c=');';
file"d:
\基于sas系统的金融计算光盘\compufin\宏文本\深市全部A股.txt";
puta$hexcd$b$hcomnam$c$;
run;
2.3.2由个股数据集目录文件创建宏文本
形成文件名数据集:
dataa;
inputfiles$20.;
cards;
/*上面选择文件名一列构成数据行*/
;
run;
全部A股代码.TXT的形成:
data;
seta;
hexcd=substr(files,2,6);
a='%A(';
b=',';
c=');';
file"D:
\基于SAS系统的金融计算光盘\Compufin\宏文本\全部A股代码.txt";
puta$hexcd$c$;
run;
2.3.3多股票收益计算程序
沪市A股日对数收益计算程序:
optionsnodatenonotesnosource;/*不输出时间、注释和源程序到日志LOG上*/
datastoindiv.lg_shanghai(keep=date);
setstoindiv.a1a0001;
where1995<=year(date)<=2000;
%macroa(x,y);
dataa(keep=dater_1);
setstoindiv.a&x;
where1995<=year(date)<=2000;
r_1=log(clpr)-log(lag(clpr));
clpr_1=clpr*(1+divrat+Rigrat+reisvol/lag(Shrout))-rigpr*Rigrat–reispr*reisvol/lag(Shrout)+Divamt;
ifclpr_1=.thenclpr_1=clpr;
r_2=log(clpr_1)-log(lag(clpr_1));
ifexdt=.thenr_2=0;
ifexdt^=.Thenr_1=0;
r_1=r_1+r_2;
ifr_1=.Thenr_1=0;
elser_1=r_1;
datastoindiv.lg_shanghai(rename=(r_1=r&x));
mergestoindiv.lg_shanghaia;
bydate;
datastoindiv.lg_shanghai;
setstoindiv.lg_shanghai;
ifr&x=.thenr&x=0;
elser&x=r&x;
%menda;
%include"D:
\基于SAS系统的金融计算光盘\Compufin\宏文本\沪市全部A股.txt";
run;
沪市A股日百分比收益计算程序:
optionsnodatenonotesnosource;
datastoindiv.r_shanghai(keep=date);
setstoindiv.a1a0001;
where1995<=year(date)<=2000;
%macroa(x,y);
dataa(keep=dater_1);
setstoindiv.a&x;
where1995<=year(date)<=2000;
r_1=(clpr-lag(clpr))/lag(clpr);
clpr_1=clpr*(1+divrat+rigrat+reisvol/lag(shrout))-rigpr*rigrat–reispr*reisvol/lag(shrout)+divamt;
ifclpr_1=.thenclpr_1=clpr;
r_2=(clpr_1-lag(clpr_1))/lag(clpr_1);
ifexdt=.thenr_2=0;
ifexdt^=.Thenr_1=0;
r_1=r_1+r_2;
ifr_1=.Thenr_1=0;
elser_1=r_1;
datastoindiv.r_shanghai(rename=(r_1=r&x));
mergestoindiv.r_shanghaia;
bydate;
datastoindiv.r_shanghai;
setstoindiv.r_shanghai;
ifr&x=.thenr&x=0;
elser&x=r&x;
%menda;
%include"D:
\基于SAS系统的金融计算光盘\Compufin\宏文本\沪市全部A股.txt";
run;
深市A股日对数收益计算程序:
optionsnodatenonotesnosource;
datastoindiv.lg_shenzhen(keep=date);
setstoindiv.szcz;
where1995<=year(date)<=2000;
%macroa(x,y);
dataa(keep=dater_1);
setstoindiv.a&x;
where1995<=year(date)<=2000;
r_1=log(clpr)-log(lag(clpr));
clpr_1=clpr*(1+divrat+rigrat+reisvol/lag(shrout))-rigpr*rigrat–reispr*reisvol/lag(shrout)+divamt;
ifclpr_1=.thenclpr_1=clpr;
r_2=log(clpr_1)-log(lag(clpr_1));
ifexdt=.thenr_2=0;
ifexdt^=.thenr_1=0;
r_1=r_1+r_2;
ifr_1=.thenr_1=0;
elser_1=r_1;
datastoindiv.lg_shenzhen(rename=(r_1=r&x));
mergestoindiv.lg_shenzhena;
bydate;
datastoindiv.lg_shenzhen;
setstoindiv.lg_shenzhen;
ifr&x=.thenr&x=0;
elser&x=r&x;
%menda;
%include"D:
\基于SAS系统的金融计算光盘\Compufin\宏文本\深市全部A股.txt";
run;
深市A股日百分比收益计算程序:
datastoindiv.r_shenzhen(keep=date);
setstoindiv.szcz;
where1995<=year(date)<=2000;
%macroa(x,y);
dataa(keep=dater_1);
setstoindiv.a&x;
where1995<=year(date)<=2000;
r_1=(clpr-lag(clpr))/lag(clpr);
clpr_1=clpr*(1+divrat+rigrat+reisvol/lag(shrout))-rigpr*rigrat–reispr*reisvol/lag(shrout)+divamt;
ifclpr_1=.thenclpr_1=clpr;
r_2=(clpr_1-lag(clpr_1))/lag(clpr_1);
ifexdt=.thenr_2=0;
ifexdt^=.thenr_1=0;
r_1=r_1+r_2;
ifr_1=.Thenr_1=0;
elser_1=r_1;
datastoindiv.r_shenzhen(rename=(r_1=r&x));
mergestoindiv.r_shenzhena;
bydate;
datastoindiv.r_shenzhen;
setstoindiv.r_shenzhen;
ifr&x=.thenr&x=0;
elser&x=r&x;
%menda;
%include"D:
\基于SAS系统的金融计算光盘\Compufin\宏文本\深市全部A股.txt";
run;
2.3.4收益SAS数据集转换为EXCEL数据表
proctransposedata=stoindiv.lg_shanghaiout=stoindiv.lg_shanghai_tr;
run;
datastoindiv.lg_shanghai_tr_1;
setstoindiv.lg_shanghai_tr;
if_n_<200;
run;
proctransposedata=stoindiv.lg_shanghai_tr_1out=stoindiv.lg_shanghai_1;
datastoindiv.lg_shanghai_1;
setstoindiv.lg_shanghai_1;
formatdateyymmdd10.;
run;
datastoindiv.lg_shanghai_tr_2;
setstoindiv.lg_shanghai_tr;
if201<=_n_<400;
run;
proctransposedata=stoindiv.lg_shanghai_tr_2out=stoindiv.lg_shanghai_2;
datastoindiv.lg_shanghai_2;
setstoindiv.lg_shanghai_2;
formatdateyymmdd10.;
run;
datastoindiv.lg_shanghai_tr_3;
setstoindiv.lg_shanghai_tr;
if401<=_n_;
run;
proctransposedata=stoindiv.lg_shanghai_tr_3out=stoindiv.lg_shanghai_3;
datastoindiv.lg_shanghai_3;
setstoindiv.lg_shanghai_3;
formatdateyymmdd10.;
run;
procexportdata=stoindiv.lg_shanghai_1
outfile="d:
\基于sas系统的金融计算光盘\compufin\lg_shanghai_1.xls"
dbms=excel2000replace;
run;
procexportdata=stoindiv.lg_shanghai_2
outfile="d:
\基于sas系统的金融计算光盘\compufin\lg_shanghai_2.xls"
dbms=excel2000replace;
run;
procexportdata=stoindiv.lg_shanghai_3
outfile="d:
\基于sas系统的金融计算光盘\compufin\lg_shanghai_3.xls"
dbms=excel2000replace;
run;
同样,可以转换其他收益SAS数据集为相应的EXCEL表。
2.4.1由股本变动历史数据集创建宏文本
挑选出1998年前上市的全部A股股票程序:
%macroA(x);
dataa;
lengthhexcd$6.;
setcompufin.shares;
ifyear(date)<&x;
ifsubstr(hstocd,3,1)=6orsubstr(hstocd,1,5)=21000;
hexcd=substr(hstocd,3,6);
labelhexcd='最新交易所代码';
procsortdata=a;
byhexcd;
dataa;
seta;
byhexcd;
iffirst.hexcd=1;/*以hexcd分组,取每组的第一个观测值*/
run;
datacompufin.y%eval(&x)_list;
seta;
a='%a(';
c=");";
file"d:
\基于sas系统的金融计算光盘\compufin\宏文本\AlistedBefore%str(&x).txt";
puta$hexcd$c$;
%mendA;
%A(1998);
run;
2.4.2随机抽股票
%macroa(x);
procsql;/*sql过程创建视图*/
createview_tmp_as
select*,ranuni(5)as_ran_fromcompufin.y%eval(&x)_list
orderbycalculated_ran_;
quit;
datarandom;
set_tmp_(obs=20);
drop_ran_;
a='%a(';
c=");";
file"d:
\基于sas系统的金融计算光盘\compufin\宏文本\random%str(&x).txt";
puta$hexcd$c$;
%menda;
%a(1998);
run;
2.4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- sas 金融 计算 清华 朱世武 数据 char02