分组回归计算预期收入:这一步比较简单,仅需按照对应的组别与估计期进行回归 (利用
if
进行条件限制) ,随后于窗口期所在日期进行交叉合并 (利用
if
进行条件限制);
/*分组回归预测对应组别窗口期的预期收入*/ egen id = group(code) egen max_id = max(id)
//这一步是为了看最大的组数 gen predict_return = . forvalues i = 1/11 { reg market_earn share_earn if id == `i' /// & event_estimation == 1 predict p if id == `i' replace predict_return = p if id == `i' /// & event_window == 1 drop p }
CAR 的批量导出:回归分析预测 AR 之后,很多小伙伴会发现在计算 CAR 的时候,数据会很多且不容易看,这时就需要对最终的 CAR 值进行如下的处理以批量导出;
/*导出整个窗口期的 CAR */ by code: gen CAR = CAR_initial[_N] //保留最后的 CAR preserve keep code CAR duplicates drop code CAR, force save CAR.dta, replace restore /*使用 preserve 与 restore 便可以在不破坏原始数据的情况下导出所有公司的 CAR, 避免原始数据的破坏有助于后续 T 检验的进行*/
T 检验:在完成分组计算 CAR 值的任务后,还需要对 CAR 值进行 T 检验,T 检验的目的是检验 CAR 值是否会显著异于 0,即特定事件所造成的影响到底是否显著。
/*分别对不同组别进行 T 检验后合并所有数据*/ forvalues i = 1/11{ gen CAR_`i' = CAR_initial if id == `i' }
//这里的操作是为了后续切片分组 T 检验 forvalues i = 1/11{ preserve keep if id == `i' drop if event_window == 0 keep id code CAR_`i' ttest CAR_`i' == 0 gen mean = r(mu_1) //返回均值 gen ttest = r(p) //返回 T 检验显著水平 save `i'.dta, replace restore }
//在不破坏原始数据的情况下分组进行 T 检验,并保存在不同的 dta 文件当中 use 1.dta, clear forvalues i = 2/11{ append using `i'.dta } forvalues i = 1/11{ drop CAR_`i' } duplicates drop id, force save Ttest.dta, replace
上述五点内容便是实现 Stata 事件研究法编程的重难点内容,下面不妨对上述内容进行组合,从而完成一份完整的事件研究法的计算操作。
. des Contains data obs: 341 vars: 5 --------------------------------------------------------------- storage display value variable name type format label variable label --------------------------------------------------------------- code str6 %9s code date int %td.. date share_earn double %10.0g share_earn event_date int %td.. event_date market_earn double %10.0g market_earn --------------------------------------------------------------- Sorted by: Note: Dataset has changed since last saved.
在导入数据之后,我们便需要首先对数据日期进行清洗,清洗数据之前请务必保证变量
date
中的数据为日期型
%td
。下面开始对数据日期进行清洗:
. /*日期清洗*/ . sort code date . by code: gen date_p1 = _n . by code: gen date_p2 = date_p1 if date == event_date . by code: replace date_p2 = date_p1 if date-event_date<=1 /// > & date-event_date>=-1 . egen date_p3 = mean(date_p2) . gen date_p4 = round(date_p3) . gen date_new = date_p1 - date_p4 . drop date_p1 - date_p4 //执行完上述操作之后,本例中产生的新变量 data_new 会排列为 (-12, 18) 的数字
完成对数据日期的初步清洗之后,就需要设置事件估计期与事件窗口期,如前文述所提及内容,应当设置两个变量:
event_estimation
在事件估计期内取 1,在其余时间内取 0;
event_window
在事件窗口期内取 1,在其余时间内取 0。这样做的好处首先是方便后续对个股进行带有
if
限制的回归,再就是方便取交集陈列 AR 。
. gen event_estimation = 1 . replace event_estimation = 0 if date_new >= (-1) & date_new <= 1 . gen event_window = 0 . replace event_window = 1 if date_new >= (-1) & date_new <= 1
. egen id = group(code) //对 code 进行分组,用虚拟变量 id 作为股票的标识代码 . egen max_id = max(id) //查看分组的最大值,并记录下来用以循环 . gen predict_return = . . forvalues i = 1/ 11 { 2. reg market_earn share_earn if id == `i' & event_estimation == 1 3. predict p if id == `i' 4. replace predict_return = p if id == `i' & event_window == 1 5. drop p 6. }
. gen AR= share_earn - predict_return . bysort code(date): gen CAR_initial = sum(AR) . by code: gen CAR = CAR_initial[_N] . preserve . keep code CAR . duplicates drop code CAR, force . save CAR.dta, replace . list in 1/5, noobs +--------------------+ | code CAR | |--------------------| | 000158 .6552294 | | 000726 -3.471135 | | 000850 2.343248 | | 002042 -2.396834 | | 002083 -2.122637 | +--------------------+ . restore
经过上述操作我们便完成了对 CAR 的批量导出,如果后续仍需要利用 CAR 的数字,仅需对 CAR.dta 使用
merge
命令进行合并即可。
下面将会对各个股票的 CAR 值进行 T 检验以判断特定事件是否具有显著影响:
. //利用上文提到的命令进行 . forvalues i = 1/11{ 2. gen CAR_`i' = CAR_initial if id == `i' 3. }
. forvalues i = 1/11{ 2. preserve 3. keep if id == `i' 4. drop if event_window == 0 5. keep id code CAR_`i' 6. ttest CAR_`i' == 0 7. gen mean = r(mu_1) //返回均值 8. gen ttest = r(p) //返回 T 检验显著水平 9. save `i'.dta, replace 10. restore 11. }
. use 1.dta, clear . forvalues i = 2/11{ 2. append using `i'.dta 3. }
. forvalues i = 1/11{ 2. drop CAR_`i' 3. }
. duplicates drop id, force . save Ttest.dta, replace