大数跨境
0
0

用Stata删除停复牌期间的事件

用Stata删除停复牌期间的事件 Stata and Python数据分析
2018-11-27
2
导读:好好学习~

本文作者:田志凡

本文编辑:张    宇

技术总编:刘洪儒

爬虫俱乐部将于2019年1月19日至25日在武汉举行两期Stata编程技术定制培训,此次采取初级班和高级班分批次培训模式,采用理论与案例相结合的方式,旨在帮助大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。详细培训大纲及报名方式,请见往期推文《2019寒假Stata编程技术定制培训班》。报名表下载请点击文末阅读原文呦~

在进行事件研究时,上市公司停复牌期间可能会发生一些事件,为排除噪音影响,研究者往往将停复牌期间的事件剔除。下面,我们介绍两种方法剔除发生在停复牌期间的事件。

首先,我们使用input命令输入两组示例数据,分别是事件列表、停复牌日期表。

事件列表数据如下:stkcd表示股票代码,date表示事件发生日期。

clear
cap mkdir E:\停复牌
cd E:\停复牌
input str6 stkcd str15 date 
000007  2014-09-27
000007  2014-09-05
000008  2014-09-19
000008  2014-08-23
000009  2014-10-17
000009  2014-08-15
000009  2014-01-29
000010  2014-12-10
000010  2014-10-16
000010  2014-08-15
end gen date1 = date(date,"YMD")  //使用date函数,将字符型的日期数据转换成Stata识别的日期数据(可参阅HRF-to-SIFconversion functions) format date1 %dCY-N-D  //调整日期显示格式(同%tdCCYY-NN-DD) drop date rename date1 date save 事件列表,replace

停复牌日期数据如下:suspdate表示停牌日期,resmdate表示复牌日期。

clear
input str6 stkcd  str15 suspdate     str15 resmdate    
000007  2014-05-26      2014-09-05
000008  2014-12-18      2014-12-29
000008  2014-06-25      2014-09-19
000008  2014-05-06      2014-05-15
000009  2014-12-29      2015-01-07
000009  2014-05-28      2014-08-15
000010  2014-12-26      2015-05-19
end gen date1=date(suspdate,"YMD") gen date2=date(resmdate,"YMD") format date* %dCY-N-D drop suspdate resmdate rename date1 suspdate rename date2 resmdate save 停复牌日期表,replace

如上两个列表,在我们的研究时间范围内,同一公司可能发生多次事件,也可能发生多次停牌。

为了删除停复牌期间的事件,首先,我们将同一公司下的每一事件均与该公司下的所有停复牌期间进行合并,即组内交叉合并;找出发生日期位于停复牌期间的事件。

第一步:组内交叉合并

使用joinby命令,以股票代码为合并依据,将同一公司的每一事件发生日期与该公司所有停复牌日期数据行进行配对组合。

joinby的合并原理:以000008股票为例。

在股票代码为000008的公司中,表1中的每一事件日期均与表2中的停复牌日期进行了合并,即组内交叉合并。

joinby命令对原始数据进行组内交叉合并的stata实现:

use 事件列表.dta,clear
joinby stkcd using 停复牌日期表.dta

合并结果如下图:

执行joinby操作后,在同一公司下,每一事件发生日期date与该公司的停复牌的期间数合并。因此,我们无法直接删除位于停复牌期间的行,因为这并未把需要剔除的date删除完。如第6行,股票代码为000008,事件发生日期为2014-08-23,处于2014-06-25至2014-09-19这一停复牌期间,说明需要剔除这一事件,但是仅仅剔除第6行是不够的,因为2014-08-23与该公司的每一停复牌期间都进行了合并,共合并了3次。

爬虫俱乐部是您身边的科研助手,能够为您在数据处理实证研究中提供帮助。承蒙30000+粉丝的支持与厚爱,我们在腾讯课堂推出了网络视频课程,专注于数据整理、网络爬虫、循环命令编制和结果输出…李老师及团队精彩地讲解,深入浅出,注重案例与实战,让您更加快速高效地掌握Stata技巧及数据处理的精髓,而且可以无限次重复观看,百分百好评,简单易学,一个月让您从入门到精通。绝对物超所值!观看学习网址:https://ke.qq.com/course/286526?tuin=1b60b462,敬请关注!



第二步:删除停复牌期间的事件

针对上述问题,我们采取两种解决思路。

方法一:“保留需要剔除的事件”,stata实现方法如下:

keep if date>= suspdate & date <= resmdate
keep stkcd date
save 位于停复牌期间的事件,replace

这样,我们就得到了位于停复牌期间的事件列表。

再将位于停复牌期间的事件列表与原事件列表进行一对一合并,然后删除匹配上的行,就得到了剔除后的事件列表。

merge 1:1 stkcd date using 事件列表

matched(3)表示两个表中的数据一一匹配上,可以看出,原事件列表中,共有4件位于停复牌期间的事件。

drop if _merge==3   //删除两两匹配上的行
drop _merge
save 剔除停复牌期间事件后的列表,replace

结果如下图:

可以看到,与原事件列表中的10行事件相比,删除了4条位于停复牌期间的事件。

方法二:“删除需要剔除的事件”,stata实现方法如下:

use 事件列表.dta,clear
joinby stkcd using 停复牌日期表.dta
bysort stkcd date: gen num1=_N   //以stkcd、date相同的为一组,计算每组观测值个数。目的为计算,组内交叉合并造成的date重复的次数。
drop if date>= suspdate & date <= resmdate  //删除date位于停复牌期间的行
bysort stkcd date: gen num2=_N   //删除之后,再次算出stkcd、date相同组的观测值个数

两次分组计算组内观测值数量的结果如下:

由上图可以看出,当num2与num1不相等时,说明stkcd、date相同的组,在进行drop  if的时候,被删除掉一行,说明该组的事件为处于停复牌期间的事件。因此,该组代表的事件均需要被删除。

drop if num1 != num2
keep stkcd date
duplicates drop
save 剔除停复牌期间事件后的列表,replace

最终结果同方法一。

以上就是两种删除停复牌期间事件的方法,读者可根据喜好进行选择。

完整程序如下:

clear
cap mkdir E:\停复牌
cd E:\停复牌
input str6 stkcd str15 date  
000007     2014-09-27
000007     2014-09-05
000008     2014-09-19
000008     2014-08-23
000009     2014-10-17
000009     2014-08-15
000009     2014-01-29
000010     2014-12-10
000010     2014-10-16
000010     2014-08-15
end gen date1=date(date,"YMD") format date1 %dCY-N-D   drop date rename date1 date save 事件列表,replace clear input str6 stkcd   str15 suspdate     str15 resmdate
000007     2014-05-26      2014-09-05
000008     2014-12-18      2014-12-29
000008     2014-06-25      2014-09-19
000008     2014-05-06      2014-05-15
000009     2014-12-29      2015-01-07
000009     2014-05-28      2014-08-15
000010     2014-12-26      2015-05-19
end gen date1=date(suspdate,"YMD") gen date2=date(resmdate,"YMD") format date* %dCY-N-D drop suspdate resmdate rename date1 suspdate rename date2 resmdate save 停复牌日期表,replace

*方法一:“保留需要剔除的事件”
use 事件列表.dta,clear joinby stkcd using 停复牌日期表.dta keep if date >= suspdate & date <= resmdate keep stkcd date save 位于停复牌期间的事件,replace merge 1:1 stkcd date using 事件列表 drop if _merge==3
drop _merge save 剔除停复牌期间事件后的列表,replace

*方法二:“删除需要剔除的事件”
use 事件列表.dta,clear joinby stkcd using 停复牌日期表.dta bysort stkcd date: gen num1=_N   drop if date >= suspdate & date <= resmdate   bysort stkcd date: gen num2=_N   drop if num1 != num2 keep stkcd date duplicates drop save 剔除停复牌期间事件后的列表,replace

有问题,不要怕!访问 

http://www.wuhanstring.com/uploads/5_aboutus/爬虫俱乐部-用户问题登记表.docx (复制到浏览器中)下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~

爬虫俱乐部隆重推出数据定制及处理业务,您有任何网页数据获取及处理方面的难题,请发邮件至我们邮箱statatraining@163.com,届时会有俱乐部高级会员为您排忧解难!

对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐

关于我们

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


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

投稿邮箱:statatraining@163.com

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


【声明】内容源于网络
0
0
Stata and Python数据分析
爬虫俱乐部,新的启航
内容 1337
粉丝 0
Stata and Python数据分析 爬虫俱乐部,新的启航
总阅读396
粉丝0
内容1.3k