问题描述
问题1:get_market_data接口只写了“从缓存获取行情数据,是主动获取行情的主要接口”,但在实际使用中请求的数据经常不对(比如取14点30分向前的1分钟k线10根,结果传回来的是13点多的数据),所以这个缓存怎么加载?如何使用能准确的获取数据?
问题2:subscribe_whole_quote订阅后返回的字段有一个speed1min和speed5min,文档上没找到相关的字段说明,这是实时的1分钟和5分钟涨速吗?在下跌的时候会是负数?(盘后才找到这里开始测试所以拿到的都是0,也看不出来实际情况)
补充问题:我的主要诉求是批量获取一堆股票(大概几百只)的分钟K线数据,上边两种方法哪个更适合(快和准)?
谢谢!
解决方案
针对您在使用 QMT 平台 API 时遇到的行情获取与订阅问题,以下是详细的解答与最佳实践建议:
问题1:get_market_data 缓存机制与数据准确性问题
原因分析:
get_market_data 接口确实是优先从本地缓存或本地已下载的数据中读取。如果您请求了 14:30 的数据,但返回的是 13:xx 的数据,通常是因为本地没有最新的分钟线数据缓存。QMT 默认不会自动在后台为您未订阅或未在主图打开的股票补充所有周期的实时 K 线。
解决方案:
- 使用新接口
get_market_data_ex:官方文档已明确建议弃用get_market_data,改用ContextInfo.get_market_data_ex。新接口提供了一个关键参数subscribe=True。当设置为True时,如果本地缓存没有最新的数据,系统会自动向服务器发起订阅并拉取最新数据,从而保证数据的准确性。 - 预先下载数据:如果是回测或盘前准备,请务必在 QMT 客户端的【数据管理】中,提前补充好对应股票池的分钟线历史数据。
问题2:关于 speed1min 和 speed5min 字段
字段解析:
是的,speed1min 和 speed5min 代表的是1分钟涨速和5分钟涨速。它们反映了标的在过去1分钟或5分钟内的价格变化百分比。
数值表现:
- 上涨时:数值为正数(例如 0.015 表示上涨 1.5%)。
- 下跌时:数值为负数(例如 -0.021 表示下跌 2.1%)。
- 盘后测试:由于盘后价格不再变动,过去1分钟和5分钟的价格变化为0,因此您测试时拿到的都是0。只有在盘中价格剧烈波动时,这两个字段才会有明显的正负值变化。
补充问题:批量获取几百只股票分钟K线数据的最佳方案
对于几百只股票的分钟K线数据,核心诉求是“快”和“准”。推荐以下两种方案,具体取决于您的策略是“定时轮询”还是“事件驱动”:
方案A:定时轮询获取(推荐使用 get_market_data_ex)
如果您是在 handlebar 中每分钟触发一次,或者使用定时器定期去拉取截面数据:
def handlebar(ContextInfo):
# 确保只在K线走完时获取
if not ContextInfo.is_last_bar():
return
stock_list = ContextInfo.get_universe() # 假设这里有几百只股票
# 使用 get_market_data_ex 批量获取,开启 subscribe=True 保证数据最新
data = ContextInfo.get_market_data_ex(
fields=['open', 'high', 'low', 'close'],
stock_code=stock_list,
period='1m',
count=10, # 获取最近10根
subscribe=True
)
# 处理 data 字典
优点:代码逻辑简单,一次性返回所有请求股票的 DataFrame 字典,适合横向截面计算(如多因子排序)。
方案B:事件驱动订阅(推荐使用 subscribe_quote)
如果您希望数据一有更新就立刻计算,而不是被动等待主图 K 线驱动:
def on_quote(datas):
# datas 包含最新推送的 K 线或 Tick 数据
print("收到行情更新:", datas)
def init(ContextInfo):
stock_list = ['000001.SZ', '600000.SH', ...] # 几百只股票
for stock in stock_list:
# 批量订阅1分钟线,数据更新时自动回调 on_quote
ContextInfo.subscribe_quote(stock, period='1m', dividend_type='none', callback=on_quote)
优点:极大地降低了无效的轮询开销,实时性最高(“快”)。只要服务器有新的 1 分钟 K 线生成,就会立刻推送到 on_quote 回调函数中。
总结建议:
- 如果您需要历史+最新的连续 K 线进行指标计算(如计算 MA、MACD),请使用
get_market_data_ex(subscribe=True)。 - 如果您只需要监控最新一根 K 线的状态变化,使用
subscribe_quote效率最高。