前言:
因为一些原因,国庆节期间学的。学习过程很酸爽,自己并没有很多统计学及其相关软件的经验,网上相关资料也不是很多。我在微信公众号、知网、经管之家、B站、百度文库等很多平台找了各式的资料来学(花了70大洋去买代码,本学生穷得叮当响),最终有了一个简单的成果(当然,在数据的处理上还比较粗糙,没有剔除ST,事件窗口也只有一个)。进一步的成果涉及到一些东西,就无法发出了。
希望能给像我一样的小白一些帮助(本来想写一个教程,但原谅我太懒了)。另外,请大佬们多多指导!
正文:
事件分析法:见百度 https://baike.baidu.com/item/事件分析法/2871756
1. 定义事件:上海自贸区成立
2. 样本选取范围:2013年8月22日前位于上海的上市公司的所有A股
3. 考察:2013年8月22日上海自贸区成立当日,位于上海上市公司的短期市场反应
4. 数据来源:CSMAR
5. 事件窗口:以2013年8月22日为事件日,(-5,+5)为研究期间
6. 估计窗口:(-155,-6)
7. 估计模型:市场模型
8. 估计正常表现
9. 异常表现和累计超额回报
10. 显著性检验
11. 全部事件交叉检验
12. 结论:上海自贸区成立对位于上海的上市公司的所有A股有显著的市场效应
1.导入数据
/*首先在CSMAR下载(2013.03.20-2013.8.22)(上海市)(所有A股)的股票代码、交易日期、考虑了现金分红的日收益率,和(2013.03.20-2013.8.22)(沪深300指数)的交易日期、考虑了现金分红的日收益率,下载数据类型为excel类型;
然后,用vlookup函数处理两个excel表格,根据交易日期,把沪深300指数的日收益率对应到上海市A股日收益率后;
接着,增加event_date这一列;
接着,把股票代码由文本类型转换成常规类型。*/
/*将处理好的excel复制到Data Editor里,保存到路径里(查看路径用pwd),保存为event_study.dta。*/
//调用时:
use event_study.dta
2.数据处理
//将日期从字符串型转换为数值型:
set matsize 500
cap gen event_date1=date(event_date,"YMD")
drop event_date
rename event_date1 event_date
format event_date %dCY-N-D
set matsize 500
cap gen trade_date1=date(trade_date,"YMD")
drop trade_date
rename trade_date1 trade_date
format trade_date %dCY-N-D
//关闭more选项,使一次全部输出:
set more off
3.估计正常收益
sort stk_id trade_date //按股票代码、交易日进行排序
by stk_id:gen datenum=_n //对每一股票按交易日从1开始计数:1、2、3、4……用来计算每一个股票有多少行数据
by stk_id:gen target=datenum if trade_date==event_date //针对每只股票,生成target变量,并且如果交易日=事件日,对target变量赋值上datenum变量的数值
by stk_id: replace target=datenum if trade_date-event_date<=1 & trade_date-event_date>=-1 //针对每只股票,对发行公告日前后1天有交易的行数据,用datenum变量的数值覆盖target变量的数值
egen td1=mean(target),by(stk_id) //针对每只股票生成变量td1,并赋值target的均值
gen td2=round(td1) //生成td2变量并赋值td1的四舍五入数值
gen dif=datenum-td2 //生成dif变量,并赋值datenum-td2,该数值代表以事件日为起点,向前/后开始计数的天数
by stk_id: gen event_window=1 if dif>=-5 & dif<=5 //针对每只股票,生成事件窗口变量并赋值“1”,dif变量大于-5小于5表示事件窗口为(-5,5)
egen count_event_obs=count(event_window), by(stk_id) //针对每只股票生成计算事件窗口天数的变量
by stk_id:gen estimation_window=1 if dif>=-155 & dif<-6 //针对每只股票,生成估计窗口变量并赋值“1”,dif变量大于-155小于-6表示估计窗口为(-155,-6)
egen count_est_obs=count(estimation_window), by(stk_id) //针对每只股票生成计算估计窗口天数的变量
replace event_window=0 if event_window==. //如果事件窗口为空值,则赋值“0”
replace estimation_window=0 if estimation_window==. //如果估计窗口为空值,则赋值“0”
gen predicted_return=. //生成估计收益变量并赋值空值
egen id=group(stk_id) //重新定义公司代码为1,2,3...,便于执行循环
forvalues id=1(1)194 {
reg stk_chg zs_chg if id==i & estimation_window==1 //得到全样本范围内的正常回报率
predict p if id==i //在事件窗口内计算正常回报率
replace predicted_return = p if id==i & event_window==1
drop p
}
/*通过上述id,可知共194个样本股票,对1-194个股票的估计窗口内的数据进行回归,股票涨跌幅为因变量,指数涨跌幅为自变量,并对每只股票用回归方程结果计算其预期收益。
对每只股票的事件窗口(-5,5),用预期收益覆盖predicted_return变量的空值。该方法为用市场模型计算事件窗口期内的预期收益。*/
4.超额收益和累计超额收益
sort id trade_date //按id、交易日排序
gen AR=stk_chg-predicted_return if event_window==1 //计算每个公司在事件期内的日非正常报酬率
by id:egen car=sum(AR) //计算每个公司在事件窗口内的累计非正常报酬率(固定值)
gen car_date=.
forvalues id=1(1)194 {
replace car_date=sum(AR) if (id==i & event_window==1)
} //每个公司在事件窗口内逐日累加得到的累积回报率
5.显著性检验
/*其中AR是超额收益,ar_sd是超额收益的标准差。如果test的绝对值大于1.96,则每只股票的平均超额收益在5%的显著性水平上异于0。*/
sort id trade_date //按id、交易日排序
by id:egen ar_sd=sd(AR) //对每个公司求超额收益的标准差
gen test=(1/sqrt(11))*(car/ar_sd) //生成test统计量
list stk_id car test if dif==0 //列出发生事件的公司代码,累计超额收益,test统计量
//输出excel表格:
outsheet stk_id trade_date car test using car_test.csv if dif==0,comma names
6.在整个事件期内进行稳健性检验
reg car if dif==0, robust
/*由p值可知,我们可以在1%水平上拒绝这194家公司的累积超常回报率为0的原假设(在1%的显著性水平下显著,car在整个事件期内稳健)。*/
7.事件期内car的走势图(看两点之差)
//注:这一步是我乱加的。
preserve
keep if event_window==1
bysort dif:egen car_t=mean(car_date)
keep dif car_t //计算每天的平均累积超常回报率
duplicates drop //仅保留事件期的观察值
twoway connect car_t dif //绘制时序图
restore