🚀 AI 一键生成 qmt 策略代码
立即体验
👉 AI 生成代码 👈

QMT 平台 get_market_data_ex() 函数获取到周六收盘价是怎么回事?

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

问题描述

C.get_market_data_ex()取到周六收盘价,咋回事?

用C.get_market_data_ex()取ETF和中证全指的日收盘价数据,竟然多出两个周六来,大受震撼,客服看看怎么回事?5月16日和4月25日是周六。附图是代码和输出日志。

解决方案

在使用 QMT 平台的 ContextInfo.get_market_data_ex() 函数获取日线数据时,如果发现返回的数据中包含了周六(如 5 月 16 日和 4 月 25 日)等非交易日的数据,这通常是由以下几个原因引起的:

1. 本地数据未更新或存在脏数据

QMT 的 get_market_data_ex() 函数在默认情况下(subscribe=True)会结合本地数据和订阅数据。如果本地历史数据中存在脏数据(例如由于某些测试或异常情况写入了非交易日的数据),函数就会将其读取出来。

解决方法:

  • 清理并重新下载数据: 在 QMT 客户端的【数据管理】中,清除相关品种(ETF 和中证全指)的本地历史数据,然后重新下载完整的日线数据。
  • 检查数据源: 确保下载的数据源是官方提供的标准行情数据。

2. 停牌填充(fill_data)参数的影响

虽然文档中提到 fill_data 参数暂不可用,但在某些版本中,如果该参数被激活或底层逻辑有变,可能会尝试对缺失的日期进行填充。如果逻辑判断有误,可能会将非交易日也进行了填充。

解决方法:

  • 尝试在调用函数时显式设置 fill_data=False,观察是否还能获取到周六的数据。
    data = ContextInfo.get_market_data_ex(
        ['close'], 
        ['510300.SH', '000985.SH'], 
        period='1d', 
        fill_data=False
    )
    

3. 周期(period)参数设置不当

如果 period 参数设置的不是标准的 '1d',而是某些自定义的多日线(如 'md')或者跟随主图周期('follow'),而主图周期设置有误,可能会导致时间戳解析出现偏差。

解决方法:

  • 确保明确指定 period='1d'

4. 平台版本 Bug

如果以上排查都无法解决问题,这极有可能是 QMT 平台特定版本中的一个 Bug,导致在处理某些特定品种(如指数或 ETF)的日线数据时,未能正确过滤非交易日。

建议:

  • 联系客服/技术支持: 将您的 QMT 版本号、完整的复现代码以及日志截图提供给国信/QMT 的技术支持人员,以便他们进行底层排查。
  • 代码层面过滤: 作为临时解决方案,您可以在获取到数据后,使用 Python 的 datetime 模块或 pandas 过滤掉非交易日的数据。

临时过滤代码示例:

import pandas as pd

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
    
    data = ContextInfo.get_market_data_ex(
        ['close'], ['510300.SH'], period='1d'
    )
    
    if '510300.SH' in data:
        df = data['510300.SH']
        # 将 index 转换为 datetime 对象
        df.index = pd.to_datetime(df.index)
        # 过滤掉周六 (5) 和周日 (6)
        df = df[df.index.dayofweek < 5]
        print(df)

总结来说,首先尝试清理并重新下载本地数据,如果问题依旧,建议在代码中加入日期过滤逻辑,并及时向官方反馈该异常。