sas金融计算清华朱世武数据集char14
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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日*/