🚀 AI 一键生成 qmt 策略代码

QMT 平台 get_market_data_ex 函数的返回值格式到底是什么?

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

问题描述

指数数据的返回值请教

数据字典_指数数据.md 中关于 get_market_data_ex 的返回值描述是:

{field1: DataFrame, index=stock_list, columns=time_list}

这与 xtdata.md 原文描述的 _ex 版本({stock_code: DataFrame},每股一个 DataFrame)明显矛盾。前者是 get_market_data(v2)的格式,后者才是 _ex(v3)的格式。

解决方案

您好!您的理解是非常准确的。在 QMT 平台中,get_market_data_ex 的返回值格式确实是 {stock_code: DataFrame},即以股票代码为键,以包含该股票历史数据的 DataFrame 为值的字典。

文档中出现的 {field1: DataFrame, index=stock_list, columns=time_list} 描述,实际上是旧版 get_market_data 函数在获取多股多期数据时的一种数据结构表现形式(或者说是早期版本文档的遗留错误)。

为了让您在编写策略时更加清晰,以下是这两个接口在返回值上的核心区别与详细解析:

1. get_market_data_ex 的真实返回值结构(推荐使用)

根据 QMT 官方 API 文档,ContextInfo.get_market_data_ex 的返回值为:

  • 数据类型dict (字典)
  • 字典结构{code1: data1, code2: data2, ...}
  • Key (键)str 类型,合约代码(如 '000300.SH')。
  • Value (值)pandas.DataFrame 类型,该合约的数据集。
    • Index (行索引):字符串格式的时间序列(如 '20231010''20231010093000')。
    • Columns (列索引):数据字段(如 'open', 'high', 'low', 'close')。

代码示例:

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
    
    # 获取沪深300和平安银行的日线数据
    data_dict = ContextInfo.get_market_data_ex(
        fields=['open', 'high', 'low', 'close'], 
        stock_code=['000300.SH', '000001.SZ'], 
        period='1d',
        count=5
    )
    
    # 解析返回值
    for stock_code, df in data_dict.items():
        print(f"股票代码: {stock_code}")
        print(df) # 打印出该股票的 DataFrame,行是时间,列是 OHLC
        # 获取最新收盘价
        if not df.empty:
            latest_close = df['close'].iloc[-1]
            print(f"最新收盘价: {latest_close}")

2. 旧版 get_market_data 的返回值结构(不建议使用)

旧版的 get_market_data 接口设计较为复杂,其返回值类型会根据传入参数(股票数量、时间范围)的不同而发生变化:

  • 1只股票,1个时间点:返回单个数值。
  • 1只股票,1个时间点,多个字段:返回 pandas.Series
  • 1只股票,多个时间点:返回 pandas.DataFrame(Index 为时间,Columns 为字段)。
  • 多只股票,1个时间点:返回 pandas.DataFrame(Index 为股票代码,Columns 为字段)。
  • 多只股票,多个时间点:返回 pandas.Panel(三维数组,Items 为股票代码,Major_axis 为时间,Minor_axis 为字段)。由于 Pandas 较新版本已废弃 Panel,这会导致兼容性问题。

总结与建议

  1. 文档勘误:您指出的矛盾确实存在,部分第三方整理的文档或旧版文档可能混淆了这两个接口的返回值。请以 {stock_code: DataFrame} 为准来处理 get_market_data_ex 的数据。
  2. 全面拥抱 _ex 版本:由于旧版 get_market_data 返回值类型不固定且依赖已废弃的 Panel 结构,强烈建议在所有新策略中统一使用 get_market_data_ex。它的返回值结构稳定(永远是字典嵌套 DataFrame),非常利于 Pandas 的向量化处理和数据清洗。