3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 qmt 平台中使用 xtdata.get_market_data() 提取数据时返回 Empty DataFrame,通常不是因为函数功能被修改,而是由于数据下载、参数设置或数据读取方式存在问题。以下是排查和解决该问题的几个关键步骤:
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)
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_time 和 end_time)以及 count 参数。
如果未指定 start_time、end_time 且 count 默认为 -1,它可能只取当前最新 bar 的值。如果您需要获取历史序列,建议明确指定时间范围或 count。
修改建议:
明确指定 start_time 和 end_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 返回为空")
get_market_data_ex 或 get_local_data在较新的 qmt 版本中,推荐使用 get_market_data_ex 或 get_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("本地无数据,请检查下载")
002594.SZ 的日线数据是否存在。get_market_data 的参数(特别是时间范围)正确传递。get_market_data 返回的可能是多维结构(如 Panel 或 Dict),确保提取 ['close'] 的方式与当前 API 版本返回的数据结构一致。如果问题依然存在,建议在 qmt 策略编辑器中直接运行简单的 get_market_data 测试,逐步打印返回值以确认数据结构。