怎样剔除将要退市的股票?


(aLIEz) #1

如题,股票退市之前很多天就会发公告,怎样在所有股票历史数据中剔除已经退市或者已发公告将要退市的股票呢?如300372.SZA,它在16年7月份就发公告可能要退市了,之后股价就一直跌了,我想剔除发退市公告之后的这段数据,要怎样做呢?


(aLIEz) #2

@iQuant


(iQuant) #3

你好,问题问得很好。目前还没有一行代码来实现剔除将要退市的股票,但可以如下处理:
以300372欣泰这只股票举例。

可以看出,欣泰在2016年8月23日的st_status为2。根据历史数据文档(见下图):链接 ,我们发现欣泰的ST状态为2:*ST,表明欣泰连续3年亏损,即将面临退市风险。因此,欣泰就应该从股票列表中剔除。

代码部分:

克隆策略
In [2]:
start_date = '2016-01-01' # 开始时间
end_date = '2017-01-01'  # 结束时间

df = D.history_data(D.instruments(start_date=start_date, end_date=end_date), start_date=start_date, end_date=end_date,
fields=['close','price_limit_status','suspend_type','st_status','suspend_reason']) # 字段解释请参考文档

all_ins = D.instruments(start_date=start_date, end_date=end_date)  # 期间全部股票列表
st_ins =  list(set(df[df['st_status'] == 2].instrument))  # 期间ST状态出现为*ST的股票列表
ins = [i for i in all_ins if i not in st_ins]  # 全部列表中去除出现*ST的股票列表

ins[:20] # 查看列表前20
Out[2]:
['000001.SZA',
 '000002.SZA',
 '000004.SZA',
 '000005.SZA',
 '000006.SZA',
 '000007.SZA',
 '000008.SZA',
 '000009.SZA',
 '000010.SZA',
 '000011.SZA',
 '000012.SZA',
 '000014.SZA',
 '000016.SZA',
 '000017.SZA',
 '000018.SZA',
 '000019.SZA',
 '000020.SZA',
 '000021.SZA',
 '000022.SZA',
 '000023.SZA']

不过需要提醒一点的是,其实在当时的时间点上,并不能判断该股票是否会停牌,只是出于*ST状态说明很有可能停牌,具有极高的退市风险。


(aLIEz) #4

了解了,多谢!


(小Q) #5

如果需要在AI模型中去除ST股票。可以参考下面文章:
在AI模型中去掉ST股票


(aLIEz) #6

已参考,多谢!