大家好,麻烦大家帮忙解决一下下面这个问题。就是前半部分是stata的程序语句,前面都还好,就是最后一个forv循环,需要用到d3和d2_1这两个文件,但数据里面并没有给出来,只能是从后面的SAS程序生成。但我不懂SAS软件,各位大侠能不能帮忙读一下后面的SAS程序,具体是什么意思?怎么生成d3和d2_1这两个文件?谢谢!
第一次弄这个悬赏,并不知道多少合适,先谢谢大家了。
STATA 程式語法
/* 假設在電腦中已經有儲存資料集的 STATA 格式 */
. cd h:\ch3
. use mkt_ret
. sort date
. use ret_m, clear
. merge m:1 date using mkt_ret
Result #of obs.
-----------------------------------------
not matched 0
matched 71,873 (_merge==3)
-----------------------------------------
/* 合併iclink 與 CRSP */
. drop _merge
. merge m:1 permno using iclink
Result #of obs.
-----------------------------------------
not matched 50,425
from master 50,425 (_merge==1)
from using 0 (_merge==2)
matched 21,448 (_merge==3)
-----------------------------------------
/* 保留非缺失資料 */
. keep if _merge==3
(50425 observations deleted)
.drop _merge
/* 先將前述合併完檔案暫存為d2 */
save d2
. use ibes_sp, clear
. sort ticker
. by ticker: gen eventcount=_n
/* 以 forv 方式產生 anndates1~anndates11 */
. forv k=1(1)11 {
2.use d3, clear
3.keep if eventcount==`k'
4.save eventcount, replace
5.use d2_1, clear
6.sort ticker
7.merge m:1 ticker using eventcount
8.rename anndats anndates`k'
9.drop _merge
10.save d2_1, replace
11.}
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
SAS程序语句:
**設定永久資料集路徑 Ch 3;
libname Ch3 'd:\Ch3_Rev\Data\';
/*----------------實例演練--------------------------*/
**合併個股與市場月報酬率資料集;
proc sql;
create table d1 as select distinct
a.*,b.vwretd as ret_mkt
fromch3.ret_m as a left join ch3.mkt_ret as b ona.date=b.date
orderby a.permno, a.date;
quit;
* 合併iclink 與 CRSP;
proc sql;
create table d2 as select
*, year(a.date) as cyear
from d1 as a, ch3.iclink as b
where a.permno=b.permno
order by a.permno, a.date;
quit;
proc sort data=d2 nodupkey; by ticker date;run;
**輸出個股盈餘宣告日前估計期月報酬率資料;
**(1) 產生 ticker*cyear 的資料集序號;
proc sort data=ch3.ibes_sp nodupkey; byticker cyear; run;(proc sort 排序)
data d4; set d3;
group=_n_;(
run;
(2) 將資料集序號與d3 資料集合併;
proc sql;
create table d5 as select distinct
a.*,b.group, b.anndats
fromd2 as a left join d4 as b
ona.ticker=b.ticker and a.cyear=b.cyear
orderby a.ticker, b.anndats;
quit;
(3)執行巨集程式, 產生估計期 (盈餘宣告日前1個月至60個)所需的個股及大盤月報酬率資料;
%macro subdata(finish, z=);
%Let gg=&z;
%Do %while (&gg<&finish);
data a≫ set d4;
if group=&gg then output;
run;
proc sql;
create table d6_g&gg as select
a.permno,a.ret, a.date, a.ret_mkt, a.ticker, b.group, b.anndats
fromd2 as a, a&gg as b
wherea.ticker=b.ticker and intnx('month', b.anndats, -61, 'E') <= intnx('month',a.date, 0, 'E') < intnx('month', b.anndats, -1, 'E')
orderby a.date;
quit;
data d6_g≫ set d6_g≫
ifret=. then delete;
ifret='.C' then delete;
run;
%Let gg=%eval(&gg+1);
%end;
%mend subdata;
***因為節省運算時間, 本例自此開始只選擇前100個成分股;
%subdata(858, z=1);
***CAPM巨集程式***;
%macro CAPM(finish, z=);
%Let group=&z;
%Do %while (&group<&finish);
proc reg data= d6_g&groupoutest=est_d&group edf noprint;
model ret=ret_mkt;
run;
quit;
data est_d&group; set est_d&group;
g=&group;
run;
%Let group=%eval(&group+1);
%end;
%mend CAPM;
%CAPM(858, z=1);
**資料集合併巨集;
%macro combine;
data d7;
set
%do i=1 %to 857;
est_d&i
%end;
;
run;
%mend;
%combine;
***合併以盈餘宣告日為事件日之 (-5, 5)期間的個股與市場日報酬率資料;
proc sql;
create table d8 as select
a.*, b.ret_mkt as dret_mkt, year(a.anndats) as year
from ch3.ret_d as a left join ch3.retmkt_d as b
on (a.permno = b.permno) and a.date=b.date
orderby a.permno, a.date;
quit;
**合併 ICLINK 與日報酬資料檔, 產生 ticker 識別碼;
proc sql;
create table d9 as select
a.*,b.ticker
fromd8 as a, ch3.iclink as b
wherea.permno=b.permno
orderby b.ticker, a.date;
quit;
proc sql;
create table d10 as select distinct
a.ret_mktas beta, a.intercept as alpha, b.group, b.cyear, b.ticker
fromd7 as a left join d4 as b
ona.g=b.group
orderby b.ticker, b.cyear;
quit;
**計算 (-5, 5) 期間的未預期報酬;
proc sql;
create table d11 as select distinct
a.*, (b.alpha+b.beta*a.dret_mkt) as expret,
(a.ret-b.alpha-b.beta*a.dret_mkt)as ar
fromd9 as a left join d10 as b
ona.ticker=b.ticker and a.year=b.cyear
orderby a.ticker, a.anndats, a.date;
quit;
data d12; set d11;
if ar=. then delete;
run;
**計算好消息與壞消息兩子樣本的 (-5, 5) 期間平均未預期報酬;
data d13; set d12;
diff=date-anndats;
run;
**計算未預期盈餘=(實際盈餘-分析師預測盈餘);
proc sql;
create table d14 as select distinct
a.ar, a.permno, a.year, a.anndats, a.date, a.diff, b.fpedats,
b.feps_med, b.feps_mean, b.eps, (b.eps-b.feps_med) as ue1,
(b.eps-b.feps_mean) as ue2, b.ticker
from d13 as a left join ch3.ibes_sp as b
ona.ticker=b.ticker and a.anndats=b.anndats
order by a.ticker, a.anndats, a.diff;
quit;
**未預期盈餘>=0 為好消息樣本組, 否則為壞消息樣本組;
data d15; set d14;
if ue1 >=0 then d_ue1=1;
elsed_ue1=0;
if ue2 >=0 then d_ue2=1;
elsed_ue2=0;
ifar>=0 then d_ar=1;
elsed_ar=0;
run;
**分別計算好壞消息樣本公司之平均未預期報酬;
proc sql;
create table d16 as select
diff,d_ue2, mean(ar) as mar_mean
fromd15
groupby d_ue2, diff;
quit;
proc sql;
create table d17 as select
diff, mean(ar) as mar_mean
fromd15
groupby diff;
quit;
/*
ods rtf file='d:\Sas Example\Sas Output\Ch3\AR.rtf';
proc print data=d16; run;
proc print data=d17; run;
ods rtf close;
*/