
推荐边看边写,不然容易看的一头雾水
经常有朋友问我:为什么跑完我提供的代码后,没有任何结果?
其实,大概率是因为你本地并没有获取到最新的行情数据。
为了帮大家彻底搞明白,这篇文章我会通过几个示例演示:在 miniQMT 里,究竟要如何正确获取到最新的行情数据。这里我先以日线数据为例来说明。📈
我这篇文章是在 2025年9月16日 13点 测试的。需要说明的是:
接下来,我会演示通过几种方式去获取日线行情,并带大家看看它们之间的差异和注意事项。
熟悉miniQMT的都知道,获取行情数据最常用的接口主要有两个:
get_market_data_ex:从缓存获取行情数据,是主动获取行情的主要接口get_local_data:从本地数据文件获取行情数据,用于快速批量获取历史部分的行情数据get_market_data_ex和get_local_data获取数据先说结论:无论是用 get_market_data_ex 还是 get_local_data,在当前环境下我都只能拿到 9月11日 的数据(今天是 9月16日)。
很多朋友经常反馈说:
根本原因其实很简单:本地 QMT 的缓存或者本地数据文件里,压根就没有最新的行情,甚至没有你要的那只股票的数据。
那么问题来了:👉 我们到底该怎么才能获取到最新的行情数据呢? 别急,继续往下看。
get_market_data_ex 示例,只能拿到 9月11日 的数据
code = '300124.SZ'
data = xtdata.get_market_data_ex([],stock_list=[code],period='1d',start_time='20250101',end_time='',dividend_type='front')
print(data[code])
get_local_data 示例,只能拿到 9月11日 的数据
code = '300124.SZ'
data = xtdata.get_local_data([],stock_list=[code],period='1d',start_time='20250101',end_time='',dividend_type='front')
print(data[code])
有人可能会说:那用订阅全推行情不就能拿到最新数据了吗? 🤔
我也专门测试了一下:通过 subscribe_whole_quote 订阅了深证市场全部股票的行情,然后再用 get_market_data_ex 和 get_local_data 去取。
结果很意外——拿到的依然还是 9月11日 的数据,依旧没有 9月16日 的最新行情。
这就说明一个问题:光订阅全推行情,并不会让 QMT 的缓存或者本地数据文件更新。
订阅全推行情,通过get_market_data_ex获取行情示例行情数据只能拿到9月11日的
code = '300124.SZ'
deffb(datas):
data_ex = xtdata.get_market_data_ex([],stock_list=[code],period='1d',dividend_type='front',count=5)
print(data_ex[code])
seq = xtdata.subscribe_whole_quote(['SZ'],callback=fb)
xtdata.run()
订阅全推行情,通过get_local_data获取行情示例行情数据只能拿到9月11日的
code = '300124.SZ'
deffb(datas):
data_ex = xtdata.get_local_data([],stock_list=[code],period='1d',dividend_type='front',count=5)
print(data_ex[code])
seq = xtdata.subscribe_whole_quote(['SZ'],callback=fb)
xtdata.run()
那订阅全推行情怎么用?
订阅全推行情数据以后,从callback函数里取最新的行情,数据类型为分笔数据,示例如下:
code = '300124.SZ'
deffb(datas):
if code in datas:
print(datas[code])
seq = xtdata.subscribe_whole_quote(['SZ'],callback=fb)
xtdata.run()
返回值是分比数据,但是里面的askPrice多档委卖价,bidPrice多档委买价是没有数据的。
{
'time': 1758001683000,
'lastPrice': 83.97,
'open': 79.96000000000001,
'high': 85.55,
'low': 79.51,
'lastClose': 80.15,
'amount': 5404196400.0,
'volume': 658001,
'pvolume': 65800104,
'stockStatus': 3,
'openInt': 13,
'transactionNum': 0,
'lastSettlementPrice': 80.15,
'settlementPrice': 0.0,
'pe': 0.0,
'askPrice': [0.0, 0.0, 0.0, 0.0, 0.0],
'bidPrice': [0.0, 0.0, 0.0, 0.0, 0.0],
'askVol': [0, 0, 0, 0, 0],
'bidVol': [0, 0, 0, 0, 0],
'volRatio': 0.0,
'speed1Min': 0.0,
'speed5Min': 0.0
}
接下来我又换了个思路:用 subscribe_quote2 来订阅单只股票的 5 根日线行情,并通过回调函数把收到的行情数据打印出来。
这里有个细节一定要注意 ⚠️:当订阅的数据返回后,它会先进入本地缓存。
这意味着什么?
get_market_data_ex 或 get_local_data 去取,就能拿到比较新的行情数据了。code = '300124.SZ'
deffb(datas):
if code in datas:
print(datas[code])
xtdata.unsubscribe_quote(seq)
seq = xtdata.subscribe_quote2(stock_code=code,callback=fb,period='1d',dividend_type='front',count=5)
xtdata.run()
返回值
[{
'time': 1757520000000,
'open': 79.0,
'high': 81.12,
'low': 77.89,
'close': 80.7,
'volume': 576815,
'amount': 4604488185.210001,
'settlementPrice': 0.0,
'openInterest': 15,
'dr': 1.0,
'totaldr': 24.93064385174295,
'preClose': 6.95169983515247e-310,
'suspendFlag': 0
}, {
'time': 1757606400000,
'open': 81.33999999999999,
'high': 82.21,
'low': 79.49,
'close': 79.67999999999999,
'volume': 592316,
'amount': 4777023017.74,
'settlementPrice': 0.0,
'openInterest': 15,
'dr': 1.0,
'totaldr': 24.93064385174295,
'preClose': 6.95169983515247e-310,
'suspendFlag': 0
}, {
'time': 1757865600000,
'open': 79.60000000000001,
'high': 82.17,
'low': 79.35000000000001,
'close': 80.15,
'volume': 522526,
'amount': 4215152023.84,
'settlementPrice': 0.0,
'openInterest': 15,
'dr': 1.0,
'totaldr': 24.93064385174295,
'preClose': 6.95169983515247e-310,
'suspendFlag': 0
}, {
'time': 1757952000000,
'open': 79.96000000000001,
'high': 85.55000000000001,
'low': 79.51,
'close': 83.98,
'volume': 661797,
'amount': 5436034654.47,
'settlementPrice': 0.0,
'openInterest': 13,
'dr': 1.0,
'totaldr': 24.93064385174295,
'preClose': 6.95169983515247e-310,
'suspendFlag': 0
}]
通过get_local_data和get_market_data_ex获取到了16号的数据。
code = '300124.SZ'
data = xtdata.get_local_data([],stock_list=[code],period='1d',start_time='20250101',end_time='',dividend_type='front')
print(data[code])
code = '300124.SZ'
data = xtdata.get_market_data_ex([],stock_list=[code],period='1d',start_time='20250101',end_time='',dividend_type='front')
print(data[code])
最后,我又测试了 download_history_data2 接口。 它的作用很直接:主动下载指定标的的历史行情数据。
和前面几种方式不同,这里有个关键点 💡: 调用 download_history_data2 之后,不仅会把最新的日线数据拉下来,还会同步更新 QMT 的缓存 和 本地数据文件。
这样一来,无论你再用 get_market_data_ex 还是 get_local_data,都能顺利拿到最新的行情数据了。🎉
通过download_history_data2下载行情
xtdata.download_history_data2(stock_list=[code],
period='1d',
start_time='20250101',
end_time='',
incrementally=False)
通过get_local_data和get_market_data_ex获取到了16号的数据。
data = xtdata.get_market_data_ex([],stock_list=[code],
period='1d',
start_time='20250101',
end_time='',
dividend_type='front')
print(data[code])
data = xtdata.get_local_data([],stock_list=[code],
period='1d',
start_time='20250101',
end_time='',
dividend_type='front')
print(data[code])
miniQMT 获取行情数据,最容易踩坑的地方就在于:接口不等于最新数据。 核心逻辑其实很简单:
get_market_data_ex / get_local_data👉 依赖缓存和本地文件,如果没有最新行情,就只能拿到旧数据(比如只能到 9 月 11 日)。
订阅全推行情(subscribe_whole_quote)👉 拿到的是实时分笔流,但不会自动更新缓存和本地文件。
订阅单股行情(subscribe_quote2)👉 可以拿到最新的日线数据,并会写入缓存,从而影响 get_market_data_ex / get_local_data 的结果。
主动下载(download_history_data2)👉 最稳妥的方式,直接拉取并同步更新缓存和本地文件,保证后续查询一定有最新数据。
💡 所以,如果你只是被动查询,很容易遇到“数据不更新”的情况。要想确保拿到最新行情,最可靠的办法就是:
download_history_data2 主动拉取;subscribe_quote2 或 subscribe_whole_quote)直接从回调里取。记住一句话:订阅拿实时,下载补历史,查询靠缓存。
一篇文章让你彻底搞懂量化中RSI指标,附实战策略+附源码,建议收藏
MiniQMT+Backtrader:平民股票量化界的“黄金搭档”,永远的神!
万字干货:用神经网络预测股市,这次真的讲透了,Python+神经网络实战全流程(附源码)
牛市不是等出来的,是提前感知出来的:花姐教你打造自己的A股情绪指标
为什么指数涨你却亏钱?80%的人忽略的市场宽度指标揭晓,我用Python实现了(附源码)
上班族没时间炒股?不妨试试这个隔夜超短战法(附:Python量化源码)
反转还是假象?华尔街奇才的神秘指标:Python实战神奇九转(含代码)量化小白必看
跟风还是反转?用 ADX 判断趋势强度,Python 教程全程带你飞
花姐,专注于Python量化与股票策略研究,兼顾Python基础知识分享,内容实用接地气,擅长用代码解读市场,用策略提升认知,干货满满,务实至上。
👇关注+星标花姐公众号 第一时间看到推文👇
如果文章对你有帮助,还请点「推荐」支持一下花姐
--- End ---
粉丝福利
为了方便大家低门槛获得量化资格,花姐找了一家不错的营业部,10万入金就可以开通QMT+miniQMT量化,备注【花姐】才可以享受此福利
