问题描述
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)环境下,它们默认都是从本地硬盘读取数据的。如果你的本地客户端没有提前下载或缓存过该股票在指定时间段(如 20241227 到 20241231)的日线数据,接口就会直接返回空的 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)
补充说明
- 数据订阅机制:在 qmt 平台内的策略编辑器中运行策略时,
ContextInfo.get_market_data_ex有一个subscribe=True的参数,可以在获取数据的同时订阅实时行情。但在独立运行的 miniQMT(xtdata)脚本中,获取历史数据必须依赖download_history_data。 - 全量下载:如果你需要回测大量的股票,建议在盘后使用批量下载脚本,将所需股票池的历史数据一次性下载到本地,这样在运行策略或获取数据时速度会非常快,也不会出现取不到数据的情况。
- 时间格式:确保
start_time和end_time的格式正确,日线通常为YYYYMMDD(如20241227),分钟线通常为YYYYMMDDHHMMSS。