本文主要讲的是事件研究法的sas代码的编程实现过程,所以关于事件研究法的定义,理论框架,应用范围等等均不在文章范围内。根据下面的过程即可完成相应的结果,
1,首先你要准备好2-3个数据集:
1,事件数据集a:包含股票名称,事件日日期,具体事件等几个变量;
2,股票数据集b,包含股票代码,日期,收益率或收盘价,
3,市场指数数据集c,包含股票代码,日期,收益率或收盘价,对应的无风险收益率;如果你使用因子模型估计,那就要包含对应的因子数据
2,具体实现思路:
其实最难的就是如何找到对应公告日前后10个交易日或前220到前10个交易日的数据。
1,首先你要有对应的全时期内的交易日:这个你直接根据市场指数数据集来,然后找到对应的所有交易日对应的前220个交易日的日期,前10个交易日的日期,前7个交易日的日期,后7个交易日的日期(这里假设你计算时间窗口期为-7,7)。代码如下:
首先生成所有交易日-220,-10的日期:
data rq1;
set c;
do i = -220 to -10;
date1 = date + i;output;
end;
run;
再生成所有交易日-7,7的日期:
data rq2;
set c;
do i = -7 to 7;
date1 = date + i;output;
end;
run;
然后找到对应的前置日期:
proc expand data = c out = c1;
convert date = lag_220 / transformout = (lag 221);
convert date = lag_10 / transformout = (lag 11);
convert date = lag_7 / transformout = (lag 8);
convert date = lea_7 / transformout = (lead 8);
run;
然后将c1数据集和事件数据集合并,也就是说将报告日期对应的前置日期找出来了。
然后将合并数据集d与总的股票数据集b合并,根据筛选条件得到相应的窗口期数据集和事件期数据集,代码如下:
data ck;
merge b d;
by code;
if lag_7 < time < lea_7;
run;
data sj;
merge b d;
by code;
if lag_220 < time < lag_10;
run;
后续的工作就比较简单了,将ck,sj与c再合并,生产c1,c2,先在c1中分组求beta,与c2合并后求异常收益率AR即可:分组代码如下:
proc reg data = hg outest=beta noprint;
by code;
model r = rm;
quit;
run;
异常收益率:
data all;
merge c2 beta;
by code;
ar = r - ( beta*rm + Intercept) ;
run;
注:上述公告期需要为交易日,如果公告期不是交易日,你可以先将期转化为最近的一个交易日。如果你需要求的是自然日而非交易日的异常收益率则更为简单,求日期窗口的思路如下:
data 窗口期;
set a;
do i = -220 to -10;date1=date+i;
output;end;
run;
data 事件期;
set a;
do i = -7 to 7;date1=date+i;
output;end;
run;
————————————————