|
大家好,麻烦大家帮忙解决一下下面这个问题。就是前半部分是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; */
|