🚀 AI 一键生成 qmt 策略代码

为什么 QMT 中使用 get_market_data_ex 获取历史行情返回空 DataFrame?

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

问题描述

为什么我用get_market_data_ex取的历史行情数据是空的

就是很简单的用法,想先尝试一下看看效果,结果输出是空的 dataframe

print(ContextInfo.get_market_data_ex(
['time', 'close'],
['000797.sz'],
'1d',
'20241027',
'20241028',
-1,
'front_ratio',
True,
False
)['000797.sz'].tail()
)

print(ContextInfo.get_market_data_ex(
['time', 'close'],
['000797.sz'],
'1d',
'20241027',
'20241028',
-1,
'front_ratio',
True,
False
)['000797.sz'].tail()
)

解决方案

在使用 QMT 的 get_market_data_ex 函数获取历史行情时,返回空 DataFrame 通常是由以下几个常见原因导致的。针对您提供的代码,主要有以下几个问题需要修正:

1. 股票代码后缀必须大写

QMT 平台对股票代码的格式要求非常严格,市场后缀必须大写。您代码中使用的 '000797.sz' 无法被系统识别,应该改为 '000797.SZ'

2. subscribe 参数设置为 False 导致未读取到数据

您在代码的最后一个参数(subscribe)传入了 False。这意味着只读取本地已有的数据,不向服务器发起订阅或下载请求。如果您之前没有在 QMT 客户端的“数据管理”中手动下载过该时间段的日线数据,本地数据库为空,自然就会返回空的 DataFrame。建议将其改为 True,或者提前在客户端补充好历史数据。

3. fields 参数中的 time 字段

get_market_data_ex 返回的 DataFrame 中,时间(时间戳字符串)默认是作为 DataFrame 的 index(索引)存在的,不需要在 fields 列表中显式请求 'time'。直接请求 ['close'] 即可。

修正后的代码示例

def handlebar(ContextInfo):
    # 确保在最后一根K线执行,避免盘中频繁调用
    if not ContextInfo.is_last_bar():
        return
        
    data = ContextInfo.get_market_data_ex(
        fields=['close'],           # 不需要写 'time',时间默认是 index
        stock_code=['000797.SZ'],   # 后缀必须大写 SZ
        period='1d',
        start_time='20241027',
        end_time='20241028',
        count=-1,
        dividend_type='front_ratio',
        fill_data=True,
        subscribe=True              # 改为 True,确保没有本地数据时向服务器请求
    )
    
    if '000797.SZ' in data and not data['000797.SZ'].empty:
        print(data['000797.SZ'].tail())
    else:
        print("未获取到数据,请检查网络或数据下载情况。")

总结排查步骤:

  1. 检查代码格式:确保 stock_code 格式为 代码.大写市场(如 000001.SZ, 600000.SH)。
  2. 检查数据源:如果 subscribe=False,请前往 QMT 客户端的【数据管理】->【补充数据】,手动下载对应品种和周期的历史数据。
  3. 检查时间范围:确保 start_timeend_time 之间有实际的交易日(例如 20241027 是周日,实际只有 1028 一天的数据)。