问题描述
xtdata.get_instrument_detail 获取个股信息时发现部分个股的 ExpireDate 为 10000991 但都是正常在市的股票,也没有什么异常状态,在迅投的官方文档中只找到 0 和 99999999 两个特殊值,有大佬知道 10000991 的状态码的具体含义么?
解决方案
在 QMT (迅投) 平台中,使用 get_instrument_detail 获取合约详细信息时,ExpireDate 字段代表的是退市日或者到期日。
对于正常在市交易的股票,它们并没有确定的退市日期。因此,底层数据库在处理这些尚未退市的股票时,会赋予一个特殊的**占位符(无效日期)**来表示“无退市日”。
为什么会出现 10000991?
- 无效日期标记:仔细观察
10000991这个数字,如果按照YYYYMMDD的日期格式解析,它代表的是1000年09月91日。显然,一个月不可能有 91 天。这种不合法的日期格式是底层 C++ 系统或数据源用来标记**“空值”或“未设置”**的一种特殊魔数(Magic Number)。 - 等同于正常在市:与官方文档中提到的
0或99999999一样,10000991同样代表该股票目前正常在市,没有退市计划。 - 数据源差异:不同的交易所或不同的数据同步批次,可能会使用不同的默认值来填充空缺的退市日期字段,这就导致了你可能会同时看到
0、99999999以及10000991。
代码处理建议
在编写量化策略时,为了避免这种特殊值对日期计算(如计算距离退市还有多少天)造成干扰,建议在代码中统一对 ExpireDate 进行清洗和过滤。
你可以编写一个辅助函数来判断股票是否正常在市:
def is_stock_active(expire_date):
# 将常见的无效日期占位符统一视为正常在市
invalid_dates = [0, 99999999, 10000991]
if expire_date in invalid_dates:
return True
# 如果有具体的退市日期,可以进一步与当前日期比较
# 这里假设 expire_date 是 int 类型的 YYYYMMDD
import datetime
current_date = int(datetime.datetime.now().strftime('%Y%M%d'))
if expire_date > current_date:
return True
return False
# 使用示例
detail = ContextInfo.get_instrumentdetail('600000.SH')
expire_date = detail.get('ExpireDate', 0)
if is_stock_active(expire_date):
print("该股票正常在市")
else:
print("该股票已退市或即将退市")
总结:10000991 只是一个表示“无退市日期”的底层无效值占位符,无需担心股票状态异常,在代码中将其与 0 和 99999999 同等对待,视为正常在市即可。