🚀 AI 一键生成 qmt 策略代码

QMT API 获取股票退市日期 (ExpireDate) 不准确怎么办?

qmt | 发布时间: 2026/5/22
以下内容由 EasyQuant 生成。

问题描述

get_instrument_detail返回的 ExpireDate (退市日或者到期日) 不准确

版本:xtquant==241014.1.2
如'601028.SH' 玉龙股份已经退市,返回的值依然为 '99999999'

解决方案

针对您在使用 xtquant (QMT API) 时遇到的 get_instrument_detail 返回 ExpireDate 不准确的问题,以下是详细的原因分析与解决方案:

一、 问题原因分析

  1. 字段适用性差异ExpireDate 字段在底层设计上主要针对期货、期权等有明确到期日的衍生品合约。对于股票而言,除非已经走完完整的退市流程并被交易所正式摘牌,否则系统通常会默认填充为 '99999999'(代表无限期)。
  2. 本地数据未同步:QMT 平台高度依赖本地数据。如果您的客户端没有及时补充最新的“基础信息”或“财务数据”,退市状态可能无法及时更新到本地数据库中。
  3. 关于举例的说明:需要特别指出的是,'601028.SH'(玉龙股份)目前并未退市,仍在正常交易中。因此系统返回 '99999999' 在这个特定例子中实际上是正确的。如果您测试的是真正已经退市的股票(如某些退市的 ST 股)依然返回 '99999999',则属于上述 1 或 2 的原因。

二、 解决方案与替代判断方法

如果您在策略中需要准确判断一只股票是否已经退市或不可交易,建议不要单一依赖 ExpireDate,可以结合以下几种方法进行综合判断:

1. 检查合约是否可交易 (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}")

2. 结合 ST 历史数据辅助判断

退市股票通常会经历 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}")

3. 检查最新行情数据

如果一只股票已经退市,它将不再有新的行情数据推送。您可以尝试获取该股票最近几日的 K 线数据,如果长期获取不到数据且未处于停牌状态,则大概率已退市。

def handlebar(ContextInfo):
    # 尝试获取最近3天的日线数据
    data = ContextInfo.get_market_data(['close'], ['601028.SH'], period='1d', count=3)
    if data.empty:
        print("获取不到近期行情,可能已退市或长期停牌")

三、 终极建议:保持数据更新

为了确保获取到的合约信息(包括退市信息、除权除息等)是最准确的,请务必定期在 QMT 终端执行以下操作:

  1. 打开 QMT 客户端。
  2. 进入 数据管理 -> 补充数据
  3. 勾选并下载最新的 基础数据日线行情 以及 财务数据

如果补充数据后,真正退市的股票依然返回异常,这可能是特定版本 xtquant 的数据映射遗漏,建议向官方客服反馈该特定退市股票的代码以供底层修复。