返回列表 发布新帖

完整QMT内置Python:行情缺失与证券信息字段异常,有没有老哥能帮忙瞅瞅的

22 0

运行环境

  • 环境:Windows 64位,Python 3.6.8,完整QMT内置Python,非回测运行。
  • 客户端文件版本:2,1,26,0;完整产品发布版本未核实。
  • 观测日期:2026-10-27。不是MiniQMT或外部xtquant。

以下代码为问题调用的脱敏摘录,各段独立阅读,不是完整策略。 ContextInfo为QMT传入的上下文对象;start_time/end_time格式为YYYYMMDDHHMMSS。 证券代码仅为公开故障样本,不代表候选或持仓。策略规则、金额、持仓、交易时点和本机信息已删除。

1. 部分证券的同日分钟数据为空

现象:110个相关样本中,一轮104个未取得分钟帧,另一轮109个未取得分钟帧;其余分别出现tick时间异常或状态不正常。银行对照样本能读到数据。 “未取得分钟帧”包括None、无columns属性或空帧,原日志未保存逐码原始结构。 尚无subscribe=False/True的有效对照结果,不能认定True已经解决。

对应代码:

def read_minutes(ContextInfo, codes, start_time, end_time):
    return ContextInfo.get_market_data_ex(
        ['time', 'close', 'amount', 'volume', 'suspendFlag'],
        codes, period='1m', start_time=start_time, end_time=end_time,
        count=-1, dividend_type='none',
        fill_data=False, subscribe=False)

需要确认: subscribe=False是否只读本地缓存?是否必须预先订阅或补充分钟数据?如何区分未准备、无权限、无交易和证券状态异常?

2. 001246.SZ日线触发字段校验错误

报错: DATA_UNAVAILABLE: missing/duplicate fields 001246.SZ daily

该错误同时覆盖空帧、缺字段和重复列;原始帧未保留,目前不能确定具体缺哪一列。

对应代码:

def read_daily(ContextInfo, start_time, end_time):
    code = '001246.SZ'
    data = ContextInfo.get_market_data_ex(
        ['time', 'close', 'amount', 'volume', 'suspendFlag'],
        [code], period='1d', start_time=start_time, end_time=end_time,
        count=-1, dividend_type='none',
        fill_data=False, subscribe=True)
    frame = data.get(code)
    required = {'close', 'amount', 'volume', 'suspendFlag'}
    if (frame is None or not hasattr(frame, 'columns') or frame.empty
            or not required.issubset(frame.columns)
            or len(set(frame.columns)) != len(frame.columns)):
        raise RuntimeError(
            'DATA_UNAVAILABLE: missing/duplicate fields ' + code + ' daily')
    return frame

需要确认: 该证券是否需要额外准备日线?此版本是否保证返回suspendFlag?time是否可能仅存在于索引中?

3. ExpireDate返回非法日期10000991

实际样本605001.SH:OpenDate=20200522,ExpireDate=10000991(int),TradingDay=20261027。 同轮112个605开头样本出现相同ExpireDate;不能推广到全部证券。 未将其当成0、99999999或正常上市标志。

代码(日期解析为等价缩减):

from datetime import datetime

def read_expiry(ContextInfo):
    detail = ContextInfo.get_instrument_detail('605001.SH')
    raw = detail.get('ExpireDate')
    return datetime.strptime(str(raw).strip(), '%Y%m%d')

需要确认: 10000991是否有官方特殊值含义,还是版本/字段映射问题?当前上市、退市状态应使用什么可靠接口?

4. OpenDate和get_open_date同时缺少有效上市日期

001381.SZ实际返回: CreateDate=20261019,OpenDate=19700101,get_open_date=19700101, TotalVolume=0,IsTrading=None,InstrumentStatus=None。 历史查询也未取得有效成交证明。这些缺项不能直接证明“未上市”。

对应代码:

def read_listing_dates(ContextInfo):
    code = '001381.SZ'
    detail = ContextInfo.get_instrument_detail(code)
    return {
        'CreateDate': detail.get('CreateDate'),
        'OpenDate': detail.get('OpenDate'),
        'get_open_date': ContextInfo.get_open_date(code),
        'TotalVolume': detail.get('TotalVolume'),
        'InstrumentStatus': detail.get('InstrumentStatus')
    }

需要确认: 19700101的准确含义、CreateDate与OpenDate的区别,以及两个来源都不可用时的替代接口或刷新方法。

5. 名称与历史ST区间不一致

实际样本:

  • 600363.SH:名称“ST联光”,get_his_st_data返回{}。
  • 603517.SH:名称“绝味食品”,ST区间20250923至20380119。
  • 603838.SH:名称“四通股份”,*ST区间20250430至20380119。
  • 002731.SZ:名称“萃华退”,*ST区间20260707至20380119;名称已是退市风险语义,不能因不含ST就判正常。

应用侧已保守处理明显风险,未解决的是接口更新和区间口径。

对应代码:

def read_st_sources(ContextInfo, code):
    detail = ContextInfo.get_instrument_detail(code)
    return {
        'InstrumentName': detail.get('InstrumentName'),
        'history': ContextInfo.get_his_st_data(code)
    }

需要确认: {}表示确认非ST还是可能未准备数据?区间结束日是否包含当天?20380119是否为持续状态的特殊结束值?有无当前ST状态接口?

6. IsTrading为空,InstrumentStatus有数值

多个正常交易样本返回IsTrading=None、InstrumentStatus=0;001381.SZ两者均为空。 不能仅凭None或一个状态数字确认可交易。

对应代码:

def read_status(ContextInfo, code):
    detail = ContextInfo.get_instrument_detail(code)
    return {
        'IsTrading': detail.get('IsTrading'),
        'InstrumentStatus': detail.get('InstrumentStatus'),
        'TradingDay': detail.get('TradingDay')
    }

需要确认: 此版本是否保证填充IsTrading?InstrumentStatus准确枚举和更新时间在哪里查询?

7. 批量同步读取耗时波动较大

两次实际批量检查分别约56.6秒、258.6秒;后一轮最终报问题2的日线错误。 历史存在性证明已提前准备并复用709份,但后续行情仍未就绪。 原日志没有逐API耗时,不能将整轮耗时归因于某一个接口。 应用侧过时后继续追加请求的缺口已修;原生同步调用耗时及数据准备问题仍未解决。

对应调用,补充计时用于排查:

import time

def timed_read(ContextInfo, codes, query):
    started = time.monotonic()
    data = ContextInfo.get_market_data_ex(
        ['time', 'close', 'amount', 'volume', 'suspendFlag'],
        codes, **query)
    print('elapsed_seconds:', time.monotonic() - started)
    return data

需要确认: 推荐的批大小、订阅/本地缓存准备流程、数据就绪检查方式,以及同步接口是否支持超时或取消。

补充:已确认的参数兼容限制

ContextInfo.get_instrument_detail(code)可用。 以下额外参数调用在目标终端报错,119次尝试均失败,已停止批量重试:

def detail_optional_argument(ContextInfo, code):
    return ContextInfo.get_instrument_detail(code, True)

TypeError: get_instrument_detail() takes 2 positional arguments but 3 were given

需要确认: 文档中的iscomplete是否属于其他实现;当前完整QMT版本有无等价的完整详情入口?

回复

您需要登录后才可以回帖 登录 | 立即注册

客服专线

400-080-8112

用思考的速度交易,用真诚的态度合作,我们是认真的!
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2026 迅投QMT社区 版权所有 All Rights Reserved. 京ICP备2025122616号-3
关灯 快速发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表