【研究模型】事件研究法
(1)在事件研究窗口内,只有所研究的事件,没有其他事件,即使有也不会对价格产生显著影响;
(2)事件影响可以由异常回报率来度量。
所以该方法的关键在于计算异常回报率和累积异常回报率。
事件研究通常包括以下几步:
(1)净化数据(提出无关和无法研究以及其他原因)和计算事件窗口
(2)估计正常表现
(3)计算异常表现和累积超额回报
(4)显著性检验
(5)全部事件交叉检验(相当于稳健性检验)
本篇旨在帮助你用stata来开展事件研究,并附上Stata的详细代码供参考。假设你已经拥有一个时间变量(date)和公司标识(company_id)。
净化数据并计算事件窗口和估计窗口
你很可能获取了超出你需要的每个公司的观察值,也有可能有一些公司的观察值不充分。在你开展下一步前,你必须确保你的分析是建立在正确的观察值之上。为了实现这一点,你需要设立一个变量 dif ,它将会计算从观察(相当于估计期)到事件期的天数,这即有可能是节假日,也有可能是交易日。
就交易日天数:
sort company_id date
by company_id: gen datenum=_n
by company_id: gen target=datenum if date==event_date
egen td=min(target), by(company_id)
drop target
gen dif=datenum-td
就节假日:
gen dif=date-event_date
由上可以看出,计算交易日天数比计算节假日天数稍微复杂一点。对于交易日,我们首先需要设立一个变量,这个变量是用来计算每一个公司标识范围内的天数,然后我们再确定哪些观测值发生在事件期内。
我们设立一个和事件天数有关的变量。这个事件天数建立在company_id范围内的所有观察值的基础上。最后,我们选取二者之间的差异来设立一个变量dif,以计算每一个个体观测值和事件期之间的天数。下一步,我们需要确定我们事件期前后的最小观察期天数以及事件窗口之前的估计窗口的最小观察期天数。比如我们想要一个事件期前后两天的窗口(总共5天的事件期)以及一个30天的估计窗口(你可以改变这些数字以适应你的分析)。
by company_id: gen event_window=1 if dif>=-2 & dif<=2
egen count_event_obs=count(event_window), by(company_id)
by company_id: gen estimation_window=1 if dif<-30 & dif>=-60
egen count_est_obs=count(estimation_window), by(company_id)
replace event_window=0 if event_window==.
replace estimation_window=0 if estimation_window==.
确定事件窗口和估计窗口的程序是相同的。首先,我们设立一个变量,当观测值在特定的日期内等于1;其次,我们设立另一个变量来计算,在每一个公司标识范围内,有多少观测值的变量值等于1;最后,我们用0代替所有的缺省值,设立一个哑变量。此时,你就可以确定哪个公司没有充分的观测值。
tab company_id if count_event_obs<5
tab company_id if count_est_obs<30
Tab命令将会产生一个公司标识符的列表,这个列表中包含的就是没有足够的事件窗口及估计窗口观察值窗口的公司,同时还会报告这些公司的总的观测值的数量,为了排除这些公司使用如下命令:
drop if count_event_obs < 5
drop if count_est_obs < 30
你必须确保在删除任何观察值之前,样本已经用另一个名字保存。
此时,你也可以剔除一些你不需要的变量。
估计正常表现
首先,我们需要一种途径和方法来估计正常表现。为了实现这一点,我们将会利用估计窗口中的数据来对每个公司进行单变量回归,并保存(常数项)和(解释变量的系数),随后我们会使用这个保存的回归系数来预测事件窗口的正常表现。
就回报这个回归中的被解释变量来讲,它仅仅是针对既定股票回报的CRSR变量,而我们用来预测ret的解释变量,使一个对于任何股票的指数加权回报。对你的样本集使用等价变量。
set more off /* this command just keeps stata from pausing after each screen of output */
gen predicted_return=.
egen id=group(company_id)
/* for multiple event dates, use: egen id = group(group_id) */
forvalues i=1(1)N { /*note: replace N with the highest value of id */
l id company_id if id==`i' & dif==0
reg ret market_return if id==`i' & estimation_window==1
predict p if id==`i'
replace predicted_return = p if id==`i' & event_window==1
drop p}
这里我们设立了一个变量id,以计算公司数量(从1到实际数)。N代表的是包含完整数据的公司——事件联合体数目(即事件有关的有完整数据的公司的数目)。这个过程通过在公司间重复,并对每一个公司在估计窗口开展回归,然后用回归结果来预测事件窗口的正常回报。
异常表现和累积超额回报
现在我们可以用我们的数据计算异常表现和累积超额回报。日异常回报等于事件窗口中的每天的实际回报减预期回报。整个事件窗口的超额回报的总额就是累积超额回报。
sort id date
gen abnormal_return=ret-predicted_return if event_window==1
by id: egen cumulative_abnormal_return = sum(abnormal_return)
此处我们仅仅计算了事件窗口中每个样本观测值的超额回报,随后我们将CAR等于所有公司的超额回报之和。
显著性检验
我们将计算一个检验统计量(t值)来确定每支股票平均的超额回报是否显著不等于0。AR即超额回报,AR_SD是超额回报的标准差。如果t统计量的绝对值大于1.96,那么平均的超额回报在5%的水平显著不等于0.1.96这个值来自于均值为0,标准差为1的标准正态分布,其中正态分布95%的部分分布在±1.96之间。
sort id date
by id: egen ar_sd = sd(abnormal_return)
gen test =(1/sqrt(number of days in event window)) * ( cumulative_abnormal_return /ar_sd)
list company_id cumulative_abnormal_return test if dif==0
Note: this test uses the sample standard deviation. A less conservative alternative is to use the population standard deviation. To derive this from the sample standard deviation produced by Stata, multiply ar_sd by the square root of n-1/n; in our example, by the square root of 4/5.
这会将你的事件研究的结果生成一项Excel文件。
outsheet company_id event_date cumulative_abnormal_return test using stats.csv if dif==0, comma name
全部事件交叉检验
除了观察每个公司的平均超额回报,你可能还想计算将所有公司视为一个整体的累积超额回报,代码如下:
reg cumulative_abnormal_return if dif==0, robust
从回归中得到的系数的P值可以告诉你,所有公司的累积超额回报的显著性。此时,P检验比T检验更可靠,因为它更允许你使用一个强的标准误差。