sas金融计算清华朱世武数据集char02.docx

上传人:b****3 文档编号:3835713 上传时间:2022-11-25 格式:DOCX 页数:18 大小:18.44KB
下载 相关 举报
sas金融计算清华朱世武数据集char02.docx_第1页
第1页 / 共18页
sas金融计算清华朱世武数据集char02.docx_第2页
第2页 / 共18页
sas金融计算清华朱世武数据集char02.docx_第3页
第3页 / 共18页
sas金融计算清华朱世武数据集char02.docx_第4页
第4页 / 共18页
sas金融计算清华朱世武数据集char02.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

sas金融计算清华朱世武数据集char02.docx

《sas金融计算清华朱世武数据集char02.docx》由会员分享,可在线阅读,更多相关《sas金融计算清华朱世武数据集char02.docx(18页珍藏版)》请在冰豆网上搜索。

sas金融计算清华朱世武数据集char02.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1