🚀 AI 一键生成 qmt 策略代码

为什么 qmt 的 get_market_data_ex 接口取不到数据?

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

问题描述

为什么get_market_data_ex取不到数据?

data = xtdata.get_market_data_ex(
[], ["600973.SH"], period="1d", start_time="20241227", end_time="20241231", count=10)
print(data)

使用 miniQMT 连接,get_market_data_ex 的结果怎么是空的?结果如下,

{'600973.SH': Empty DataFrame
Columns: [time, open, high, low, close, volume, amount, settelementPrice, openInterest, preClose, suspendFlag]
Index: []}

使用 get_local_data 接口,每次都要先用 download_history_data 下载数据才可以取到数据, get_market_data_ex 取的数据也是空的?

解决方案

在 qmt 和 miniQMT(xtdata)中,调用 get_market_data_ex 接口返回空的 DataFrame,最根本的原因是本地没有缓存对应时间段的历史数据

原因分析

无论是 get_local_data 还是 get_market_data_ex,在 miniQMT(xtdata)环境下,它们默认都是从本地硬盘读取数据的。如果你的本地客户端没有提前下载或缓存过该股票在指定时间段(如 2024122720241231)的日线数据,接口就会直接返回空的 DataFrame,而不会自动去服务器拉取历史数据。

解决方法

要解决这个问题,必须遵循**“先下载,后读取”**的原则。在调用 get_market_data_ex 之前,先使用 download_history_data 将所需的数据下载到本地。

正确的代码示例

from xtquant import xtdata

stock_code = "600973.SH"
period = "1d"
start_time = "20241227"
end_time = "20241231"

# 1. 先从服务器下载历史数据到本地
print(f"正在下载 {stock_code} 的历史数据...")
xtdata.download_history_data(
    stock_code=stock_code, 
    period=period, 
    start_time=start_time, 
    end_time=end_time
)
print("数据下载完成!")

# 2. 再从本地读取数据
data = xtdata.get_market_data_ex(
    field_list=[], 
    stock_list=[stock_code], 
    period=period, 
    start_time=start_time, 
    end_time=end_time,
    count=10
)

print("获取到的数据:")
print(data)

补充说明

  1. 数据订阅机制:在 qmt 平台内的策略编辑器中运行策略时,ContextInfo.get_market_data_ex 有一个 subscribe=True 的参数,可以在获取数据的同时订阅实时行情。但在独立运行的 miniQMT(xtdata)脚本中,获取历史数据必须依赖 download_history_data
  2. 全量下载:如果你需要回测大量的股票,建议在盘后使用批量下载脚本,将所需股票池的历史数据一次性下载到本地,这样在运行策略或获取数据时速度会非常快,也不会出现取不到数据的情况。
  3. 时间格式:确保 start_timeend_time 的格式正确,日线通常为 YYYYMMDD(如 20241227),分钟线通常为 YYYYMMDDHHMMSS