问题描述
迅投知识库-完整实例里的复权计算方式里给出的代码:
# 指定要处理的股票代码
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_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 返回为空")
3. 推荐使用 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("本地无数据,请检查下载")
总结排查步骤:
- 确保数据已下载:在 qmt 客户端“数据管理”中查看
002594.SZ的日线数据是否存在。 - 检查参数传递:确保
get_market_data的参数(特别是时间范围)正确传递。 - 检查返回值结构:
get_market_data返回的可能是多维结构(如 Panel 或 Dict),确保提取['close']的方式与当前 API 版本返回的数据结构一致。
如果问题依然存在,建议在 qmt 策略编辑器中直接运行简单的 get_market_data 测试,逐步打印返回值以确认数据结构。