问题描述
就是很简单的用法,想先尝试一下看看效果,结果输出是空的 dataframe
print(ContextInfo.get_market_data_ex(
['time', 'close'],
['000797.sz'],
'1d',
'20241027',
'20241028',
-1,
'front_ratio',
True,
False
)['000797.sz'].tail()
)
print(ContextInfo.get_market_data_ex(
['time', 'close'],
['000797.sz'],
'1d',
'20241027',
'20241028',
-1,
'front_ratio',
True,
False
)['000797.sz'].tail()
)
解决方案
在使用 QMT 的 get_market_data_ex 函数获取历史行情时,返回空 DataFrame 通常是由以下几个常见原因导致的。针对您提供的代码,主要有以下几个问题需要修正:
1. 股票代码后缀必须大写
QMT 平台对股票代码的格式要求非常严格,市场后缀必须大写。您代码中使用的 '000797.sz' 无法被系统识别,应该改为 '000797.SZ'。
2. subscribe 参数设置为 False 导致未读取到数据
您在代码的最后一个参数(subscribe)传入了 False。这意味着只读取本地已有的数据,不向服务器发起订阅或下载请求。如果您之前没有在 QMT 客户端的“数据管理”中手动下载过该时间段的日线数据,本地数据库为空,自然就会返回空的 DataFrame。建议将其改为 True,或者提前在客户端补充好历史数据。
3. fields 参数中的 time 字段
在 get_market_data_ex 返回的 DataFrame 中,时间(时间戳字符串)默认是作为 DataFrame 的 index(索引)存在的,不需要在 fields 列表中显式请求 'time'。直接请求 ['close'] 即可。
修正后的代码示例
def handlebar(ContextInfo):
# 确保在最后一根K线执行,避免盘中频繁调用
if not ContextInfo.is_last_bar():
return
data = ContextInfo.get_market_data_ex(
fields=['close'], # 不需要写 'time',时间默认是 index
stock_code=['000797.SZ'], # 后缀必须大写 SZ
period='1d',
start_time='20241027',
end_time='20241028',
count=-1,
dividend_type='front_ratio',
fill_data=True,
subscribe=True # 改为 True,确保没有本地数据时向服务器请求
)
if '000797.SZ' in data and not data['000797.SZ'].empty:
print(data['000797.SZ'].tail())
else:
print("未获取到数据,请检查网络或数据下载情况。")
总结排查步骤:
- 检查代码格式:确保
stock_code格式为代码.大写市场(如000001.SZ,600000.SH)。 - 检查数据源:如果
subscribe=False,请前往 QMT 客户端的【数据管理】->【补充数据】,手动下载对应品种和周期的历史数据。 - 检查时间范围:确保
start_time和end_time之间有实际的交易日(例如 20241027 是周日,实际只有 1028 一天的数据)。