问题描述
df = get_all_securities(types=['stock'], date='2019-07-15')
结果:
600078.XSHG 它的display_name 中有‘ST’ 标识,此股当天10%涨停,不是ST股啊。
是数据有问题吗?
display_name name start_date end_date type
600078.XSHG ST澄星 STCX 1997-06-27 2200-01-01 stock
解决方案
这不是数据问题,而是 get_all_securities 函数的设计机制导致的。
根据 JoinQuant API 文档说明,get_all_securities 返回的 display_name(中文名称)和 name(缩写简称)只返回该标的在系统中的最新名称。也就是说,无论您传入的 date 参数是哪一天,返回的股票名称都是它现在的名字。如果该股票目前是 ST 股,那么即使您查询的是它尚未被 ST 的历史日期(如 2019-07-15),返回的名称依然会带有 'ST' 标识。
如何正确判断历史某一天是否为 ST 股?
如果您需要判断股票在历史特定日期是否为 ST 股,不能依赖 display_name,而应该使用专门的 API:
方法一:在回测/模拟交易中使用 get_current_data()
在 handle_data 或其他定时运行函数中,可以使用 get_current_data() 获取当天的 ST 状态:
def handle_data(context, data):
current_data = get_current_data()
is_st = current_data['600078.XSHG'].is_st
print("是否为ST股:", is_st)
方法二:在研究环境或策略中使用 get_extras()
可以使用 get_extras 函数查询一段时间内的 ST 状态:
from jqdata import *
# 查询 600078.XSHG 在 2019-07-15 的 ST 状态
st_data = get_extras('is_st', ['600078.XSHG'], start_date='2019-07-15', end_date='2019-07-15')
print(st_data)
get_extras 返回的 DataFrame 中,值为 True 表示当天是 ST 股,False 表示不是。
总结:get_all_securities 适合用来获取股票列表和上市/退市日期,判断 ST 状态请务必使用 get_extras 或 get_current_data。