问题描述
xtdata.get_instrument_detail 获取个股信息时发现部分个股的 ExpireDate 为 10000991 但都是正常在市的股票,也没有什么异常状态,在迅投的官方文档中只找到 0 和 99999999 两个特殊值,有大佬知道 10000991 的状态码的具体含义么?
解决方案
在 QMT(迅投)量化平台中,调用 ContextInfo.get_instrumentdetail() 或 xtdata.get_instrument_detail() 获取合约详细信息时,ExpireDate 字段代表的是退市日或者到期日。
针对您遇到的 ExpireDate 返回 10000991 的情况,以下是详细的解析与处理建议:
1. 特殊值 10000991 的含义
在 QMT 的底层 C++ 架构以及许多金融数据源中,对于尚未退市、正常在市交易的股票,其“退市日”实际上是一个未知或无限远的未来日期。为了在数据库和内存中统一数据类型(通常为整型 int),系统会使用一些特殊的极大值作为占位符(Placeholder)。
99999999:最常见的“无限远”日期占位符,表示永不退市或当前正常交易。0:有时用于表示数据缺失或未初始化。10000991:这同样是一个默认的占位符/极值。它通常来源于上游交易所数据接口的默认填充值,或者底层数据在某次结构变更时赋予的默认有效日期。它的实际业务含义与99999999相同,即该股票目前正常在市,没有明确的退市日期。
2. 如何在策略中安全地处理 ExpireDate
由于不同板块或不同时期上市的股票可能被赋予了不同的默认极大值(如 99999999 或 10000991),在编写量化策略时,不建议直接使用等于(==)某个特定值来判断股票是否退市。
正确的处理逻辑应该是:将 ExpireDate 与当前日期(或回测的当前 Bar 日期)进行大小比较。
Python 代码示例:
import datetime
def handlebar(ContextInfo):
stock_code = '600000.SH'
# 获取合约详细信息
detail = ContextInfo.get_instrumentdetail(stock_code)
if detail:
expire_date = detail.get('ExpireDate', 0)
# 获取当前时间(格式如 20231025)
current_date = int(datetime.datetime.now().strftime('%Y%M%d'))
# 判断逻辑:如果 ExpireDate 大于当前日期,说明未退市
if expire_date > current_date:
print(f"{stock_code} 正常在市,退市日字段值: {expire_date}")
else:
print(f"{stock_code} 已退市或即将退市,退市日: {expire_date}")
3. 总结
遇到 ExpireDate 为 10000991 时无需担心,这并非股票状态异常,而是系统表示“正常在市”的另一种极大值占位符。在策略逻辑中,统一采用 ExpireDate > 当前日期 的方式进行过滤,即可完美兼容 99999999、10000991 等各种特殊占位符。