proc sort data=srmr;by stkcd trddt;run; /*srmr为日股票收益数据集*/
proc sql;
create table a as
Select srmr.*, pceventchoose.annday, pceventchoose.eventnumber
From srmr inner join pceventchoose ON (pceventchoose.stkcd = srmr.Stkcd);
quit;/*pceventchoose为定义数据数据集*/
proc sort data=a;by stkcd trddt;run;
data a;set a; diff=trddt-annday;run;/*trddt:股票交易日;annday:事件宣告日*/
data b;set a; if diff>=0;run; /*宣告日停牌时事件日的定位*/
data c;set b;by Stkcd;if first.Stkcd then count=-1;count+1;run;
data d;set a; if diff<0;diff=diff*(-1);run;
proc sort data=d; by stkcd diff;run;
data d;set d;
by Stkcd;if first.Stkcd then count=0;
count+(-1);run;
data window; set c d;run;
proc sort data=window; by Stkcd trddt;run;
data window;set window; close=trddt-lag(trddt);run;
data window;set window;by stkcd;if first.stkcd then delete;run;
/*市场调整法计算car*/
data window; set window; ar=r-mr1;if close>30/*剔除两个交易日之间间隔30天的样本;时间间隔可自己定义*/ then delete;run;
data pc;set pceventchoose;drop trddt;run;
proc sql;
create table arf as
Select stkcd, sum(ar) as car, count(ar) as n
From window where count<=30 and count>=-30
group by stkcd;
quit;
data arf; set arf; if n^=61 then delete; run;
proc sql;
create table pc1 as
Select pc.*
From arf inner join pc on (arf.stkcd=pc.stkcd);
quit;
proc sql;
create table car3 as
Select window.stkcd, sum(ar) as car, count(ar) as n
From window where count<=1 and count>=-1
group by stkcd;
quit;
data car3; set car3; if n^=3 then delete; run;/*剔除三个交易日不完整的样本*/
/后面为网上下载stata/产生估计窗口和事件窗口,为了保证观察值数目,要count,果然有,所以删除
use y1.dta,clear
gen es_period=1 if dif>=-100&dif<=-30
gen ev_period=1 if dif>=-5&dif<=5
bysort code:egen obs=count(es_period)
bysort code:egen eobs=count(ev_period)
*先用市场调整法计算ar
gen ar1=ret-mret if ev_period==1
bysort code:gen car1=sum(ar1) if ev_period==1
bysort code:egen car1_11=sum(ar1) if ev_period==1
*用市场模型法计算ar
sort code
egen code1=group(code)
tabstat ret mret if es_period==1,s(n mean sd min max) c(s)
set more off
gen pret=.
forvalues i=1/381{
list code if code1==`i'&dif==0
reg ret mret if code1==`i'&es_period==1
predict p if code1==`i'
replace pret=p if code1==`i'&ev_period==1
drop p
}
gen ar2=ret-pret if ev_period==1
bysort code:egen car2_11=sum(ar2) if ev_period==1