文章目录
- 一、任务描述
- 二、数据集描述
- 三、核心思路
- 四、完整代码
- 主要参考链接
一、任务描述
对每个减持事件分别统计该股票在减持前30天和减持后30天发布的公告数。由于数据集过于庞大,用stata
和excel
都不好操作,所以选用轻便灵活的python
语言。
二、数据集描述
主要有两个数据集:
- 公告列表
爬取的巨潮资讯网所有公告记录,共2787026条。sample 如下:
announcementid | stkcd | stkname | announcementdate | announcementtitle |
---|---|---|---|---|
18427242 | 1 | S 深发展A | 2006/10/10 | S深发展A自2006年10月10日开市起临时停牌 |
23152692 | 1 | S 深发展A | 2007/4/27 | S深发展A 自2007年4月27日开市起临时停牌 |
23384397 | 1 | S 深发展A | 2007/5/11 | S深发展A自2007年5月11日下午开市起临时停牌公告 |
29189716 | 1 | 深发展A | 2007/6/20 | 关于“深发展A”交易的风险提示 |
49443130 | 1 | 深发展A | 2009/2/23 | 深发展A自2009年2月23日13:00起临时停牌 |
57139544 | 1 | 深发展A | 2009/10/14 | 深发展A:限售股份解除限售提示性公告 |
57221662 | 1 | 深发展A | 2009/10/29 | 深发展A:独立董事对公司衍生品交易业务及风险控制情况的专项意见 |
57221661 | 1 | 深发展A | 2009/10/29 | 深发展A:2009年第三季度报告 |
57221659 | 1 | 深发展A | 2009/10/29 | 深发展A:董事会决议公告 |
57435411 | 1 | 深发展A | 2009/12/25 | 深发展A:监事会公告 |
57438019 | 1 | 深发展A | 2009/12/25 | 深发展A自2009年12月25日开市起临时停牌 |
- 股东减持事件
来自 CSMAR 的所有股东减持记录,共15287条。sample 如下:
证券代码 | 股份减持方 | 变动方式 | 成功与否 | 第一次公告日期 | 过户登记日期 | 本次变动数量 | 本次变动数量占总股本的比例(%) |
---|---|---|---|---|---|---|---|
55 | 深圳市邦林科技发展有限公司 | 10 | 1 | 2007/5/17 | 2007/5/17 | 4755800 | 1.23 |
55 | 深圳市时利和投资有限公司 | 10 | 1 | 2007/5/19 | 2007/5/19 | 5728800 | 1.48 |
55 | 深圳市邦林科技发展有限公司 | 10 | 1 | 2007/5/26 | 2007/5/26 | 5350000 | 1.38 |
55 | 深圳市时利和投资有限公司 | 10 | 1 | 2007/5/29 | 2007/5/29 | 5690000 | 1.47 |
55 | 深圳市邦林科技发展有限公司 | 10 | 1 | 2008/5/6 | 2008/5/6 | 19360180 | 5.05 |
55 | 深圳市时利和投资有限公司 | 10 | 1 | 2008/5/17 | 2008/5/17 | 19308180 | 5.05 |
55 | 深圳市邦林科技发展有限公司 | 10 | 1 | 2008/9/20 | 2008/9/20 | 4876180 | 1.14 |
55 | 深圳市时利和投资有限公司 | 10 | 1 | 2008/12/6 | 2008/12/6 | 5490000 | 1.29 |
56 | 深圳经济特区发展(集团)公司 | 6 | 2 | 1999/12/2 | 23834756 | 10.79 | |
56 | 泰天实业发展有限公司 | 10 | 1 | 2007/2/28 | 2007/2/28 | 1713000 | 0.78 |
56 | 深圳市特发集团有限公司 | 10 | 1 | 2007/4/12 | 2007/4/12 | 3923164 | 1.776 |
三、核心思路
在python
中实现excel
的 countif 功能:
clist = data.loc[(data['stkcd'] == 股票代码) & (data['日期序列'] <= 结束日期) & (data['日期序列'] >= 开始日期), '日期序列']
核心代码受Little_Rokie博客的启发。
四、完整代码
import pandas as pd
from datetime import *
data = pd.read_table('公告列表.txt',header=0,encoding='utf-8',delim_whitespace=True)
data.columns=['stkcd','日期序列']
def 区间计数(股票代码,减持日期,前置窗口长度,后置窗口长度):
减持时间戳 = datetime.strptime(减持日期,"%Y-%m-%d")
开始日期 = (减持时间戳-timespan*前置窗口长度).strftime("%Y-%m-%d")
print(开始日期)
结束日期 = (减持时间戳+timespan*后置窗口长度).strftime("%Y-%m-%d")
print(结束日期)
clist = data.loc[(data['stkcd'] == 股票代码) & (data['日期序列'] <= 结束日期) & (data['日期序列'] >= 开始日期), '日期序列']
区间公告数 = len(clist)
return(区间公告数)
if __name__ == "__main__":
timespan = timedelta(days=1)
f = open("股东减持事件.txt")
g = open("区间公告统计结果.txt",'a')
g.write('股票代码,减持日期,事件前30天区间公告数,事件后30天区间公告数\n')
lines = f.readlines()
for line in lines:
stkcd = int(line.split(',')[0].split("\n")[0])
print(stkcd)
eventdate = line.split(',')[1].split("\n")[0]
事件前区间公告数 = 区间计数(stkcd, eventdate, 30, 0)
事件后区间公告数 = 区间计数(stkcd, eventdate, 0, 30)
print([stkcd, eventdate, 事件前区间公告数, 事件后区间公告数])
g.write(','.join([repr(stkcd), eventdate, repr(事件前区间公告数), repr(事件后区间公告数)])+'\n')
f.close()
g.close()
主要参考链接
- https://wwwblogs/nxld/p/6756492.html
更多推荐
百万级大样本中的countif实现
发布评论