🚀 AI 一键生成 qmt 策略代码

解决 qmt xtdata.get_market_data() 提取不到数据返回 Empty DataFrame 的问题

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

问题描述

xtdata.get_market_data()无法提取download_history_data()下载的价格数据?

迅投知识库-完整实例里的复权计算方式里给出的代码:

# 指定要处理的股票代码
s = '002594.SZ'

# 注释掉的代码,可用于下载指定股票的历史数据,从 2010 年 1 月 1 日到现在,周期为 1 天
xtdata.download_history_data(s, '1d', '20100101', '')

# 获取指定股票的分红因子数据
dd = xtdata.get_divid_factors(s)
# 打印分红因子数据
print('分红因子',dd)

# 定义需要处理的价格字段列表
field_list = ['open', 'high', 'low', 'close']
# 获取指定股票的行情数据,不考虑分红调整,提取收盘价并转置
datas_ori = xtdata.get_market_data(field_list, [s], '1d', dividend_type = 'none')['close'].T
# 注释掉的代码,可用于打印原始行情数据
print('提取的收盘价',datas_ori)

xtdata.get_market_data 提取不到数据,打印 datas_ori 的结果是“Empty DataFra“,请问是哪个函数的功能改了吗?

解决方案

在 qmt 平台中使用 xtdata.get_market_data() 提取数据时返回 Empty DataFrame,通常不是因为函数功能被修改,而是由于数据下载、参数设置或数据读取方式存在问题。以下是排查和解决该问题的几个关键步骤:

1. 确认数据是否已成功下载

xtdata.get_market_data() 默认从本地读取数据。如果本地没有数据,它将返回空。请确保 xtdata.download_history_data() 已经成功执行并下载了数据。

注意: download_history_data 是一个异步或耗时的操作。如果在下载完成前立即调用 get_market_data(),可能会因为数据尚未落盘而读取不到。

解决方法:
取消注释下载代码,并确保下载完成。可以通过在下载后添加适当的延时,或者在 qmt 客户端的“数据管理”中手动补充数据来确认。

import time
# 下载数据
xtdata.download_history_data(s, '1d', '20100101', '')
# 等待数据下载完成(简单延时,实际应用中建议使用回调或检查数据状态)
time.sleep(5)

2. 检查 get_market_data 的参数设置

在您的代码中,get_market_data 的调用方式如下:

datas_ori = xtdata.get_market_data(field_list, [s], '1d', dividend_type = 'none')['close'].T

根据 qmt API 文档,get_market_data 的参数顺序和默认值可能需要严格匹配。特别是时间范围参数(start_timeend_time)以及 count 参数。

如果未指定 start_timeend_timecount 默认为 -1,它可能只取当前最新 bar 的值。如果您需要获取历史序列,建议明确指定时间范围或 count

修改建议:
明确指定 start_timeend_time,或者使用 count 参数获取指定数量的 K 线。

# 明确指定时间范围
datas_ori = xtdata.get_market_data(field_list, [s], period='1d', start_time='20100101', end_time='', dividend_type='none')

# 如果返回的是 dict,需要正确提取 DataFrame
if datas_ori:
    # 假设返回结构为 {field: DataFrame}
    # 提取收盘价并转置
    close_data = datas_ori.get('close')
    if close_data is not None and not close_data.empty:
        print('提取的收盘价\n', close_data.T)
    else:
        print("未获取到收盘价数据")
else:
    print("get_market_data 返回为空")

3. 推荐使用 get_market_data_exget_local_data

在较新的 qmt 版本中,推荐使用 get_market_data_exget_local_data 来获取本地数据,这些接口通常更稳定且支持更灵活的参数。

使用 get_local_data 示例:

# 获取本地数据
local_data = xtdata.get_local_data(stock_code=s, start_time='20100101', end_time='', period='1d', divid_type='none')
if local_data:
    print("成功获取本地数据")
    # 处理 local_data 字典
else:
    print("本地无数据,请检查下载")

总结排查步骤:

  1. 确保数据已下载:在 qmt 客户端“数据管理”中查看 002594.SZ 的日线数据是否存在。
  2. 检查参数传递:确保 get_market_data 的参数(特别是时间范围)正确传递。
  3. 检查返回值结构get_market_data 返回的可能是多维结构(如 Panel 或 Dict),确保提取 ['close'] 的方式与当前 API 版本返回的数据结构一致。

如果问题依然存在,建议在 qmt 策略编辑器中直接运行简单的 get_market_data 测试,逐步打印返回值以确认数据结构。