任務描述
對每個減持事件分別統計該股票在減持前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()