作者:许梦洁 (中山大学)
Email: [email protected]
Stata连享会 计量专题 || 公众号合集
4天直播-连享会-文本分析与爬虫专题
语言:Python方法:拆分文件目的:提高运行速度
一、任务描述
对 2010 年后 49083 条上市公司股权变更数据(Firm-Event 观测)分别统计每个事件发生前后 15 天公司:
- 发布的临时公告数
- 累计超额收益 (CAR)
二、数据描述
数据集 | 总样本数 | 2010年后的样本数 |
---|---|---|
上市公司股权变更记录 | 57584 | 49083 |
上市公司公告记录 | 2787026 | 2758934 |
上市公司日超额收益 | 9749464 | 5534947 |
三、解决思路
在
Python
构造一个类似于
Excel
中的 countif 函数即可。具体见我上一篇博文 [百万级大样本中的 countif 实现]。
特别说明: 文中包含的链接在微信中无法生效。请点击本文底部左下角的【阅读原文】。
四、潜在问题
虽然按照上一篇文章的思路也能基本完成任务,但是程序运行非常慢,光跑一次统计窗口期公告数据的程序就要27个小时,所以必须优化程序以提高运行速度。
五、优化思路
由于全样本非常大,上篇博文的程序相当于是对每一个公司股东股权变动事件在全部的公告池(2758934条记录)中进行搜索,显然这样做是无效率的。
因此,此次程序优化的主要思路是分别拆分 49083 条公司股东股权变动事件和 2758934 条上市公司公告记录,并将两类拆分的文件对应起来。举个例子:
- 第一步: 将股票代码在 000001 到 000049 的公司股权变动事件拆出来
- 第二步: 将股票代码在000001 到 000049 的公司公告拆出来形成一个小的公告搜索池,然后对这部分公司的股权事件在这个小搜索池里统计公告记录。
通过拆分文件得到的精确匹配大大减小了每一个事件的搜索范围,可以大幅提高程序运行效率。优化后跑一次同样的统计窗口期公告数据程序仅需 12 分钟,是原来运行速度的 135 倍。
六、核心代码(以统计窗口期 CAR 为例)
1. 初步拆分
为了保证运行效率最高,首先平均分拆 CAR 序列,遍历股票日超额收益序列数据,设定阈值为 50000,每 50000 条数据拆出一个文件,以 "CAR+编号" 为文件名 (eg:
CAR109.txt
)。最后共拆出了 110 个文件,Python 代码如下:
2. 根据分拆文件记录拆分股票节点
遍历拆出来的 110 个 CAR 文件,分别记录每个文件最后一个观测的股票代码,并逐条写入 “拆分节点.txt” 中。Python 代码如下:
3. 根据拆分节点拆分事件列表并再拆分 CAR 列表
由于初步拆分是根据样本数拆分,因此出现了同一只股票不同日期的 CAR 会被拆到两个不同文件的情况,十分不利于后面股权变更文件与 CAR 文件拆分后实现完美匹配。
因此,需要根据第二步得到拆分节点处的股票代码对 CAR 列表再拆分,并同时拆分股权变更列表。经过这一步后拆分后的两种文件就可以实现精确匹配。
此外,由于事先已经对股权变更文件以及 CAR 文件根据股票代码以及日期进行排过序,因此接下来的拆分只需逐行遍历,判断遍历到的观测股票代码与拆分节点处的股票代码的关系,如果遍历处股票代码大于当前拆分节点,则保存一个分拆文件,清空相关变量并开启下一个分拆文件。Python 代码如下:
4. 基于拆分后的事件列表和日期序列统计数据
一一对应地拆完大文件之后就可以在缩小的搜索范围里 countif 啦,这部分思路见上一篇博文百万级大样本中的countif实现 (点击底部【阅读原文】查看链接)。跑完49083 条数据的结果只需要 12 分钟,简直是飞一般的感觉(`・ω・´)。
七、统计结果样例
股票代码 | 事件日期 | 事件前15天CAR | 事件后15天CAR | 事件前15天公告数 | 事件后15天公告数 |
---|---|---|---|---|---|
2 | 2014-03-21 | 0.192826 | 0.06398 | 18 | 6 |
2 | 2014-08-29 | -0.057021 | -0.033097 | 19 | 6 |
2 | 2014-09-16 | -0.031721 | -0.031635 | 6 | 16 |
2 | 2015-01-24 | -0.010155 | -0.107722 | 3 | 13 |
2 | 2015-01-28 | -0.069575 | -0.045201 | 6 | 10 |
2 | 2015-07-11 | 0.356788 | -0.126676 | 15 | 16 |
2 | 2015-07-25 | -0.192525 | 0.0095 | 17 | 12 |
2 | 2015-08-04 | 0.019329 | -0.120508 | 7 | 29 |
2 | 2015-08-27 | 0.142061 | -0.048584 | 22 | 11 |
2 | 2015-12-07 | 0.242967 | 0.221147 | 11 | 16 |
2 | 2015-12-09 | 0.353391 | 0.276527 | 12 | 15 |
2 | 2015-12-16 | 0.268726 | 0.124451 | 17 | 26 |
2 | 2016-07-07 | -0.27522 | -0.133624 | 46 | 18 |
2 | 2016-08-05 | 0.294057 | 0.190569 | 9 | 8 |
2 | 2016-08-09 | 0.295028 | 0.076121 | 7 | 15 |
更多精彩课程
- I. 直播-空间计量系列课程,主讲:范巧。
- H. 视频-我的甲壳虫-经典论文精讲,主讲:连玉君。
- G. 视频-R语言初识,主讲:游万海,随时在线观看。
- F. 直播视频-直击面板数据模型,主讲:连玉君,公开课-Free。
- E. 视频-经济学中的大数据应用,主讲:李兵,随时在线观看。
- D. 视频-空间计量全局模型及MATLAB实现,主讲:范巧,随时在线观看。
- C. 视频-动态面板数据模型,主讲:连玉君,随时在线观看。
- B. 视频-实证研究设计,主讲:连玉君,,随时在线观看。
- A. 直播-文本分析与爬虫专题,2020.3.28-29、4.4-5,主讲:司继春、游万海。
直播:动态空间面板 | 空间双差分 SDID