sas金融计算清华朱世武数据集char14

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

14.4.3 组合构建

/*挑选1997年以前发行的A股股票,用到数据集:行情数据集compufin.quot和股本数据集compufin.shares*/

/*选择行情数据*/

Data quot;

length hexcd $6.;

Set compufin.quot;

Keep date clpr hexcd; /*选择保留变量, date为日期,clpr为收盘价*/

if substr(hstocd,3,1)=6 or substr(hstocd,1,5)=21000;

hexcd=substr(hstocd,3,6); /*将行情数据集中的股票代码转换为交易所最新代码*/ label hexcd='最新交易所代码';

proc sort data=quot;

by hexcd date;

run;

/*选择流通股本数据*/

data shares;

length hexcd $6.;

set compufin.shares;

keep date pubflt hexcd; /*选择变量,date为日期,pubflt为观测到的流通股本数*/ hexcd =substr(hstocd,3,6); /*转换股本观测数据集中的股票代码*/

proc sort data=shares;

by hexcd date;

run;

/*合并行情与股本数据*/

data biao;

merge quot shares;

by hexcd date;

run;

/*对每个交易日都填上流通股本数据*/

data a;

set biao;

if pubflt^=. then y=1;

sumy+y; /*创建新变量sumy, 为变量y的累加变量,即对每支股票,每一次股本变动变量sumy都加上1, 后面要用到(实际上sumy还是起到了加标识的作用,它是站在整个数据集的角度上加的)*/

data b;

set a;

keep sumy pubflt;

if pubflt^=.; /*if保证了只保留数据集A中pubflt不等于.时的变量sumy和pubflt */

run;

data c;

set a;

drop pubflt; /*删除数据集A中的变量pubflt, 方便下面数据集c和b合并时,将股本填全,这是个很重要的技巧*/

data biao2 (drop=y sumy);

merge c b;

by sumy;

run;

/*上面这里,在数据并不一一对应的情况下(同时c中没有pubflt这一变量),在新生成的biao2中,pubflt的值是对应于b中sumy相同的那个pubflt值。这一过程实际上是为了用个别的pubflt填全整个数据集,这一实现方法需要注意。同样的目的也可以通过retain等语句加以实现*/

/*生成最终表zongbiao*/

data zongbiao;

set biao2;

where year(date)=1996; /*日期可以灵活控制,但最好用where语句*/

proc sort data=zongbiao;

by hexcd date;

run;

/*计算1996年每支股票的平均流通市值*/

data mv(keep=clpr pubflt date hexcd mv);

set zongbiao;

mv=clpr*pubflt;

proc means data=mv noprint;

var mv;

by hexcd;

output out=mv mean=m_mv;

run;

/*由此得到的数据集mv, 其中有我们随机抽股票和按1996年平均流通市值抽股票需要的变量:股票代码hexcd和1996年各股票平均流通市值m_mv */

/*选取股票方法一:随机抽取20支股票*/

data mv;

set mv;

if substr(hexcd,1,1)^=0 and substr(hexcd,4,1)=6; /*只对复权价逻辑库stoindif中的股票抽取*/

proc sql;

create view _tmp_ as

select *, ranuni(1055) as _ran_ from mv

order by calculated _ran_;

quit;

data stocks;

set _tmp_(obs = 20);

drop _ran_;

a='%a(';

c=");";

file " d:\genstock.txt";

put a $ hexcd $ c $;

run;

/*选取股票方法二:按1996年股票平均流通市值m_mv均匀选取20只股票*/

proc sort data= mv out=a;

by m_mv;

data b;

set a nobs=nobs;

n=round(nobs/20);

t=_n_ - int( _n_ / n)*n;

a='%a(';

c=");";

file " d:\genstock1.txt";

put a $ hexcd $ c $;

run;

/* 将随机抽取的20支股票合并到一个数据集中*/

data price;

set stoindif.a1a0001;

keep date;

where 1997<=year(date)<=2000;

%macro a(x);

data a;

set stoindif.a&x;

where 1997<=year(date)<=2000;

keep date clpr_r;

data price;

merge price a(rename=(clpr_r=p&x));

by date;

%mend a;

%include "d:\genstock.txt";

run;

/*对抽取的20支股票随机赋权重:选择2000年最后一个交易日作为购买股票组合的日期,实际上是2000年12月29日*/

相关文档
最新文档