在连玉君老师的公众号找到的stata的命令,我也正在做这个,还在数据清洗阶段,
先分享给您,希望对您有帮助,如有新进展可以一起交流!谢谢 !
*For number of trading days:
sort company_id date
by company_id: gen datenum=_n /*定义新的日期变量,取值为 1,2,3,...*/
by company_id: gen target=datenum if date==event_date /*标定事件日*/
egen td=min(target), by(company_id) /*扩充target的观察值*/
gen dif=datenum-td /*以事件日0为基准定义日期*/
list date event_date datenum target td dif in 1/20
*For calendar days:
gen difc=date-event_date
*Construct the event window
* 定义事件窗口
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)
* 0 和 1 区分事件窗口和非事件窗口
replace event_window=0 if event_window==.
replace estimation_window=0 if estimation_window==.
* Companies do not have a sufficient number of observations.
tab company_id if count_event_obs<5
drop if count_event_obs < 5
tab company_id if count_est_obs<30
drop if count_est_obs < 30
* 估计正常回报率
cap drop predicted_return
gen predicted_return=. /*用于存放正常回报率的变量*/
cap drop id
egen id=group(company_id) /*重新定义公司代码为 1,2,3...,便于执行循环程序*/
qui tab id
local N = r(r) /*记录公司数目*/
forvalues i=1(1)`N' {
*list id company_id if id==`i' & dif==0
* 在估计窗口内估计市场模型
qui reg ret market_return if (id==`i' & estimation_window==1)
* 得到全样本范围内的正常回报率,即 market_return 的全样本拟合值
predict p if id==`i'
* 在事件窗口内计算正常回报率
replace predicted_return = p if (id==`i' & event_window==1)
drop p
}
* Abnormal and Cumulative Abnormal Returns
* Abnormal Returns
gen abnormal_return = ret - predicted_return if event_window==1
* CAR_1: sum of each firm (时序加总)
sort id date
by id: egen CAR_id = sum(abnormal_return)
list id date dif abnormal_return CAR_id if (event_window==1 & id==1)
* CAR_2: sum according distance from event day
cap drop CAR_date
gen CAR_date = .
qui tab id
local N = r(r)
sort id date
forvalues id = 1(1)`N'{
replace CAR_date = sum(abnormal_return) if (id==`id'&event_window==1)
}
list id date dif abnormal_return CAR_date if (event_window==1 & id ==1)
* 检验个别公司的累积超常收益率是否显著
cap drop ar_sd
cap drop test_id
cap drop sig
cap drop pvalue
* 计算 t 值
sort id date
by id: egen ar_sd = sd(abnormal_return)
gen test_id =(1/sqrt(5))*(CAR_id /ar_sd)
* 计算 p 值
gen pvalue = normal(test_id)
replace pvalue = 1 - pvalue if test_id>0
replace pvalue = pvalue*2 /*双尾检定*/
* 标明显著水平
gen sig = "*" if pvalue <= 0.1
replace sig = "**" if pvalue <= 0.05
replace sig = "***" if pvalue <= 0.01
* 列示结果
gsort -sig
list company_id CAR_id test_id pvalue sig if dif==0&sig!=""
gsort -sig
list company_id CAR_id test_id sig if dif==-1 & sig!=""
list company_id CAR_id test_id sig if dif==-2 & sig!=""
list company_id CAR_id test_id sig if dif==0 & sig!=""
list company_id CAR_id test_id sig if dif==1 & sig!=""
list company_id CAR_id test_id sig if dif==2 & sig!=""
*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.
* 样本总体的累积超常回报率是否显著?
* All sample firms, full event window
reg CAR_id if dif==0, robust
* 逐日累加累积超常回报率是否显著?
* 方法 1
preserve
keep if abs(dif)<3
bysort dif: reg CAR_date, robust noheader
restore
* 方法 2
forvalues i = -2(1)2{
dis in g "date = " in y `i'
reg CAR_date if dif==`i', robust noheader
}
* 方法 2a
mat A = J(5,4,0)
forvalues i = -2(1)2{
qui reg CAR_date if dif==`i', robust
local b = _b[_cons]
mat V = e(V)
local se= sqrt(V[1,1])
local t = `b'/`se'
mat A[`=`i'+3',1] = (`i',`b',`se',`t')
}
mat colnames A = date coef se t
mat list A
* 绘图显示逐日累加 累积超常回报率
preserve
keep id date dif event_window CAR_date
keep if event_window == 1
cap drop CAR_t
keep if event_window == 1
sort dif
by dif: egen CAR_t = mean(CAR_date)
keep dif CAR_t
duplicates drop
twoway connect CAR_t dif
restore
* 符号检定法
* J3 = [N^+/N - 0.5]*(2*sqrt{N}) -- N(0,1)
* 整体检验
preserve
keep if event_window == 1
qui count if abnormal_return > 0
local Np = r(N)
local N = _N
local J3 = (`Np'/`N' - 0.5)*2*sqrt(`N')
local pvalue = normal(`J3')
if `J3' > 0{
local pvalue = 1- `pvalue'
}
local pvalue = `pvalue'*2
dis in g " J3" _col(8) " = " in y %6.4f `J3' _n ///
in g "p-value = " in y %6.4f `pvalue'
restore
* 逐日检验
mat A = J(5,4,0)
forvalues i = -2(1)2{
qui count if (dif==`i' & abnormal_return>0 & event_window==1)
local Np = r(N) /*超常回报率为正的公司数目*/
qui count if (dif==`i' & abnormal_return!=. & event_window==1)
local N = r(N) /*公司总数*/
local J3 = (`Np'/`N' - 0.5)*2*sqrt(`N')
local pvalue = normal(`J3')
if `J3' > 0{
local pvalue = 1- `pvalue'
}
local pvalue = `pvalue'*2
mat A[`=`i'+3',1] = (`J3', `pvalue', `Np', `N')
}
mat colnames A = J3 p-value N+ N
mat list A
|