问题描述
版本:xtquant==241014.1.2
如'601028.SH' 玉龙股份已经退市,返回的值依然为 '99999999'
解决方案
针对您在使用 xtquant (QMT API) 时遇到的 get_instrument_detail 返回 ExpireDate 不准确的问题,以下是详细的原因分析与解决方案:
一、 问题原因分析
- 字段适用性差异:
ExpireDate字段在底层设计上主要针对期货、期权等有明确到期日的衍生品合约。对于股票而言,除非已经走完完整的退市流程并被交易所正式摘牌,否则系统通常会默认填充为'99999999'(代表无限期)。 - 本地数据未同步:QMT 平台高度依赖本地数据。如果您的客户端没有及时补充最新的“基础信息”或“财务数据”,退市状态可能无法及时更新到本地数据库中。
- 关于举例的说明:需要特别指出的是,'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 终端执行以下操作:
- 打开 QMT 客户端。
- 进入 数据管理 -> 补充数据。
- 勾选并下载最新的 基础数据、日线行情 以及 财务数据。
如果补充数据后,真正退市的股票依然返回异常,这可能是特定版本 xtquant 的数据映射遗漏,建议向官方客服反馈该特定退市股票的代码以供底层修复。