免费事件研究,一片片从邮局寄来——国泰安版本

2017-02-16 强宇曦 爬虫俱乐部 爬虫俱乐部

在之前推文“免费时间研究,一片片从邮局寄来”中,我们使用了cntrade获取上市公司的日收益率数据,而该数据也可以通过国泰安下载得到。假设我们有一个交易数据文件,该文件包含所有上市公司的日收益数据,那如何利用本地数据进行事件研究呢?

一、 单个事件的事件研究——以万科为例


 1 

确定事件

现在我们对一个事件E进行事件研究,假定这个事件E发生在万科身上,发生的日期是2015-10-20


我们将这个日期翻译成Stata的日期格式并存储在一个local date里:

local date = date("2015-10-20","YMD")


2

准备数据

进行事件研究,我们需要某公司事件前后的个股收益率数据和市场收益率数据,个股收益率数据我们可以下载得到,市场收益率数据则可以通过cnindex得到。我们将国泰安的数据下载整理好存为“个股交易数据13.dta”。

 

下面开始准备数据:

use "D:\事件研究\个股交易数据13.dta" if stkcd == 2     /*获得万科的数据*/

cnindex 000300     /*获得沪深300指数的数据*/ 

 

这些数据获得后我们需要根据自己的研究目的对数据进行处理,删除无用数据,并对数据进行合并,准备数据完整过程如下: 

clear

capture mkdir "D:/事件研究/"

cap which cnindex

if _rc!=0{

        ssc install cnindex

        }

                 

cnindex 000300, path("D:/事件研究/")  /*下载沪深三百指数数据*/

keep date rit

rename rit rmt

sort date

save "D:/事件研究/index.dta",replace

 

clear

use "D:\事件研究\个股交易数据13.dta" if stkcd == 2

rename (trddt dretwd) (date rit)

keep stkcd date rit

sort date

 

merge 1:1 date using "D:/事件研究/index.dta"

drop if _m==2

drop _m

order stkcd date rit rmt

此时,我们的数据包括四个变量:

stkcd date rit rmt


3

定义事件期与回归

获得数据后,我们需要构造一个相对的时间变量time,在事件日等于0,事件前为-1,-2, -3, ……-200,事件后为1,2,3,……

 

我们可以将内存中的数据截断成两个,事件前的按日期倒排序,添加时间变量time=-_N,事件日以后的正排序,添加时间变量time=_N-1。整个过程如下:

 

preserve

local date = date("2015-10-20","YMD")      

keep if date<`date'

gsort -date

gen time=-_n

keep if time>=-200

        

save "D:/事件研究/pre_event.dta", replace

restore

local date = date("2015-10-20","YMD")        

keep if date>=`date'

sort date

gen time = _n-1

keep if time<=10

append using "D:/事件研究/pre_event.dta"

 

现在我们内存中有了这个事件E前后的日数据,包括事件前200天及事件后10天,共211个交易日的日数据。

假定估计窗口是(-200,-10),事件窗口是(-3,10)


在估计窗口做回归:

qui reg rit rmt if time<=-10

在事件窗口进行预测:

predict AR if time>=-3, r

然后只保留预测范围内的数据:

keep if time>=-3

然后累加:

sort time

gen CAR = sum(AR)

现在,我们就有了这样的一个表格了:


4

邮寄信息

我们可以将上表中的信息装到信封中寄出去。在这里,我们要用到一个数据整理的法宝——post命令

 

首先,定义邮局,即信息接收地址:

capture postclose event

 

postfile event stkcd CAR1 CAR2 CAR3 CAR4 CAR5 CAR6 CAR7 CAR8 CAR9 CAR10 CAR11 CAR12 CAR13 CAR14 using "D:/事件研究/事件研究.dta",replace

 

接着,我们来看一下要邮寄那些信息:

local stkcd = stkcd[1]

forvalues m=1(1)14{

local CAR`m'=CAR[`m']

}

最后,我们就要开始邮寄信息啦!把经过事件研究后的我们所需要的信息装进信封,调用邮局寄出去吧!

 

post event (`stkcd') (`CAR1') (`CAR2') (`CAR3')  (`CAR4') (`CAR5') (`CAR6') (`CAR7') (`CAR8') (`CAR9') (`CAR10') (`CAR11') (`CAR12') (`CAR13') (`CAR14')

postclose event   ///数据寄出后,我们关闭邮件系统即可

 

use "D:/事件研究/事件研究.dta", clear


二、 多个事件的事件研究

 对于多个事件而言,我们需要将事件放入矩阵中(详见“免费事件研究,一片片从邮局寄来”),并将上述过程套用一个循环。

假设我们的事件列表为:

下面我们将整个过程封装起来,在循环中进行多个事件的事件研究,每个事件有一个id, 循环次数就是矩阵event的行数`N’。


完整程序如下:

******download index *******************

clear

capture mkdir "D:/事件研究/"

        

cap which cnindex

if _rc!=0{

        ssc install cnindex

        }

                          

cnindex 000300, path("D:/事件研究/")

keep date rit

rename rit rmt

sort date

save "D:/事件研究/index.dta",replace

        

*******Events

clear

input stkcd str10 Eventdate

2 "2014-04-14"

600900 "2015-04-14"

28 "2016-04-14"

600000 "2016-04-14"

601898 "2016-04-14"

601988 "2016-04-14"

601666 "2016-04-14"

end

 

set matsize 500

cap gen Eventdate1=date(Eventdate,"YMD")

drop Eventdate

rename Eventdate1 Eventdate

format Eventdate %dCY-N-D

      

sort stkcd Eventdate

 

*******Events Matrix

local N=_N

        

mkmat stkcd Eventdate, mat(event)

        

**save the event into a matrix called event

        

capture postclose event

postfile event id stkcd CAR1 CAR2 CAR3 CAR4 CAR5 CAR6 CAR7 CAR8 CAR9 CAR10 CAR11 CAR12 CAR13 CAR14 using "D:/事件研究/事件研究.dta",replace

 

forval i=1/`N' {

local date = scalar(event[`i',2])

local stkcd = scalar(event[`i',1])

dis `stkcd'

        

*生成rit(计算个股日收益率)

clear

use "D:\事件研究\个股交易数据13.dta" if stkcd == `stkcd'

rename (trddt dretwd) (date rit)

keep stkcd date rit

sort date

merge 1:1 date using "D:/事件研究/index.dta"

drop if _m==2

drop _m

order stkcd date rit rmt

        

preserve

keep if date<`date'

gsort -date

gen time=-_n

keep if time>=-200

        

save "D:/事件研究/pre_event.dta", replace

restore

        

keep if date>=`date'

sort date

gen time = _n-1

keep if time<=10

append using "D:/事件研究/pre_event.dta"

 

qui reg rit rmt if time<=-10

predict AR if time>=-3, r

        

keep if time>=-3

        

sort time

gen CAR = sum(AR)

        

keep stkcd time CAR

        

forvalues m=1(1)14{

local CAR`m'=CAR[`m']

}

 

post event (`i') (`stkcd') (`CAR1') (`CAR2') (`CAR3') (`CAR4') (`CAR5') (`CAR6') (`CAR7') (`CAR8') (`CAR9') (`CAR10') (`CAR11') (`CAR12') (`CAR13') (`CAR14')

 

}

 

postclose event

 

use "D:/事件研究/事件研究.dta", clear

 

结果如下:



接下来是空气质量报告

全国空气质量如下

帝都又恢复到了姹紫嫣红


以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~,点赞打赏随您心意,么么哒~

应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~

编辑by司海涛



往期推文推荐:

1.合并输出回归结果和其他检验结果——esttab和estadd

2.关于RTF你不知道的命令

3.关于RTF你不知道的命令之番外篇

4.免费事件研究,一片片从邮局寄来

5.免费的股价同步性,一片片从邮局寄来

6.Stata叫你回家听音乐了!

7.一言不合就用stata写邮件(Outlook/Foxmail)

8.玩转stata之调用浏览器

9.I have a Stata, I have a python

10.I have a Stata, I have a Python之二——pdf转word




关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:xueyuan19920310@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

欢迎关注爬虫俱乐部

微信扫一扫
关注该公众号