3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
针对您在使用 xtquant (QMT API) 时遇到的 get_instrument_detail 返回 ExpireDate 不准确的问题,以下是详细的原因分析与解决方案:
ExpireDate 字段在底层设计上主要针对期货、期权等有明确到期日的衍生品合约。对于股票而言,除非已经走完完整的退市流程并被交易所正式摘牌,否则系统通常会默认填充为 '99999999'(代表无限期)。'99999999' 在这个特定例子中实际上是正确的。如果您测试的是真正已经退市的股票(如某些退市的 ST 股)依然返回 '99999999',则属于上述 1 或 2 的原因。如果您在策略中需要准确判断一只股票是否已经退市或不可交易,建议不要单一依赖 ExpireDate,可以结合以下几种方法进行综合判断:
IsTrading)get_instrument_detail 返回的字典中包含 IsTrading 字段,可以用来判断当前合约是否处于可交易状态。
def handlebar(ContextInfo):
detail = ContextInfo.get_instrumentdetail('601028.SH')
if detail:
is_trading = detail.get('IsTrading', False)
print(f"是否可交易: {is_trading}")
退市股票通常会经历 ST、*ST、退市整理期等阶段。您可以使用 ContextInfo.get_his_st_data() 获取股票的 ST 历史,辅助判断其风险状态。
def init(ContextInfo):
# 获取股票的 ST 历史
st_history = ContextInfo.get_his_st_data('000004.SZ')
print(f"ST历史状态: {st_history}")
如果一只股票已经退市,它将不再有新的行情数据推送。您可以尝试获取该股票最近几日的 K 线数据,如果长期获取不到数据且未处于停牌状态,则大概率已退市。
def handlebar(ContextInfo):
# 尝试获取最近3天的日线数据
data = ContextInfo.get_market_data(['close'], ['601028.SH'], period='1d', count=3)
if data.empty:
print("获取不到近期行情,可能已退市或长期停牌")
为了确保获取到的合约信息(包括退市信息、除权除息等)是最准确的,请务必定期在 QMT 终端执行以下操作:
如果补充数据后,真正退市的股票依然返回异常,这可能是特定版本 xtquant 的数据映射遗漏,建议向官方客服反馈该特定退市股票的代码以供底层修复。