
最近有同学反馈用get_full_tick频繁获取全市场数据卡死, 我当时推荐他用subscribe_whole_quote。 这里聊一聊获取行情数据subscribe_whole_quote、subscribe_quote、get_full_tick这几个的区别。
一、三个比喻,秒懂核心差异
想象一下,你是一个操盘手,需要时刻关注市场动态。
subscribe_whole_quote 就像你在交易大厅装了一个 “全市场警报器”。你告诉它:“关注全市场股票,有任何一只出现新的成交(TICK),就立刻告诉我变化的那部分数据。” —— 它批量监听,有变才报,效率极高。subscribe_quote 则像你雇了一个 “专职盯盘助手”。你对他说:“给我死死盯住茅台这支股票,每来一个新TICK,或者每分钟收线,都完整向我汇报一次。” —— 它精准盯防,事无巨细,延迟最低,但资源消耗也大。get_full_tick 更像你随手拿起遥控器 “拍一张电视快照”。你需要的时候,啪一下,把当前屏幕上所有股票的最新价、成交量等信息截取下来。 —— 它即取即用,不问过往,成本极低,但信息是瞬时的。
是不是一下子就清晰了?下面我们深入技术细节。
subscribe_whole_quote —— 全市场高效推送器subscribe_quote —— 精准定点监控器get_full_tick —— 轻量级快照抓取器三、实战例子
光说不练假把式。下面用 Python 代码片段展示每个函数的具体用法。
subscribe_whole_quote 盯全市场变化from xtquant import xtdata
import datetime
def on_market_data(data):
"""全市场数据回调函数"""
current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
print(f"当前时间:{current_time}")
print(f"收到{len(data)}只股票的数据")
for stock_code, stock_data in data.items():
last_price = stock_data.get('lastPrice', 'N/A')
volume = stock_data.get('volume', 'N/A')
print(f"股票{stock_code}最新价:{last_price}, 成交量:{volume}")
# 订阅沪深两市的 tick 数据
seq = xtdata.subscribe_whole_quote(code_list=['SH', 'SZ'], callback=on_market_data)
# 运行程序接收数据
xtdata.run()
# 取消订阅(可选)
# xtdata.unsubscribe_quote(seq)2、subscribe_quote 盯住你的持仓股
你持有茅台和宁德时代,需要以最低延迟获得每一笔TICK数据来驱动你的高频做T策略。
from xtquant import xtdata
def simple_callback(data):
print(f"收到行情数据: {data}")
# 订阅上证指数的1分钟线
handle = xtdata.subscribe_quote(
stock_code='000001.SH',
period='1m',
callback=simple_callback
)
xtdata.run() # 保持程序运行以接收数据3、get_full_tick 快速查询import xtquant.xtdata as xtdata
from datetime import datetime, timedelta
import time
def get_all_stock_codes():
"""获取沪深两市所有A股股票代码"""
return xtdata.get_stock_list_in_sector("沪深A股")
def get_realtime_market_status():
"""
实时统计涨跌家数(盘中使用)
返回: (上涨家数, 下跌家数, 平盘家数, 无效数据家数)
"""
stock_codes = get_all_stock_codes()
quotes = xtdata.get_full_tick(stock_codes)
up = down = unchanged = invalid = 0
for code in stock_codes:
data = quotes.get(code, {})
last_price = data.get('lastPrice')
pre_close = data.get('lastClose')
# 过滤无效数据
if last_price is None or pre_close is None or pre_close == 0:
invalid += 1
continue
# 计算涨跌幅(避免浮点误差)
change_pct = (last_price - pre_close) / pre_close * 100
if change_pct > 1e-6:
up += 1
elif change_pct < -1e-6:
down += 1
else:
unchanged += 1
return up, down, unchanged, invalid
if __name__ == "__main__":
print("=== 实时涨跌统计 ===")
up, down, unchanged, invalid = get_realtime_market_status()
print(f"上涨: {up}, 下跌: {down}, 平盘: {unchanged}, 无效数据: {invalid}")四、最后总结
subscribe_whole_quotesubscribe_quoteget_full_tick + 轮询get_full_ticksubscribe_quote没有哪个函数是万能的,关键是理解它们的性格,然后组合使用。比如,每天早上先用 get_full_tick 快速扫描选出强势板块,然后对板块内的个股用 subscribe_whole_quote 实时监控异动,最后对真正开仓的股票用 subscribe_quote 进行 TICK 级精准盯盘。