量化策略跑得再漂亮,如果数据进的管道不顺畅,所有的模型都只是纸上谈兵。我在做实盘交易和行情监控的初期,最让我头疼的就是怎样实时、完整地把全市场A股的逐笔成交数据拉进来。几千只股票,用轮询方式一个个调接口,根本不能满足策略对时效性的苛刻要求。曾经用多线程并发请求,也很快因为频控和服务器压力而碰壁。
回头来看,解决这个问题的核心不在于“请求得有多快”,而在于选择“谁主动推送”这一架构。采用了WebSocket批量订阅后,整个数据链路才变得可靠且低延迟。
轮询方案在量化实战中为何注定失败
轮询模式本质上是同步、被动的请求-响应循环。你必须在代码中设置一个定时器,不断向服务器索取每只股票的最新价。问题是,A股市场逐笔成交非常密集,尤其是在开盘、尾盘和异动拉升的瞬间,tick爆发式增长。等你轮询走完一圈,大量tick已经埋没在时间的长河里。
WebSocket推送则是全双工、异步的。你只需跟服务器说一声:“我要这些股票的实时成交”,之后每一笔买卖都会自动推送到你的客户端。你既不用操心频率控制,也不会因为等待回复而错过任何关键的信号。最关键的是,不管订阅多少标的,你和服务器之间始终只用维持一条TCP连接,资源开销极低。
行情API的批量订阅协议
不同厂商的行情接口在订阅格式上有些细微差别,但通常就以下两种主流形态:
| 订阅方式 | 消息格式 | 适用场景 |
|---|---|---|
| 数组模式 | ["000001","000002","600036"] |
策略动态生成股票池,代码处理直观 |
| 字符串拼接 | "000001,000002,600036" |
参数传递便捷,某些网关接口采用 |
更高阶的接口还支持全市场通配符订阅,你只需声明订阅“全部A股”,就能接收所有正常交易品种的逐笔数据。这类权限一般需要向数据服务商单独申请。
一次订阅多只A股的Python实现
我曾在自己的回测和实盘体系里接入过类似AllTick的行情接口,下面的代码是简化后的核心订阅逻辑。通过WebSocket连接,一次性发送10只股票的订阅指令,之后所有tick都将自动到达。
import websocket
import json
# 推送逐笔成交的WebSocket端点
url = "wss://apis.alltick.co/websocket-api/stock-websocket-interface-api/transaction-quote-subscription"
def on_message(ws, message):
# 解析tick数据包
data = json.loads(message)
# 提取逐笔成交列表
for tick in data.get("ticks", []):
print(f"代码:{tick['code']} 价格:{tick['price']} 时间:{tick['time']}")
def on_open(ws):
# 构建订阅指令,一次订阅10只代表性A股
sub_msg = {
"action": "subscribe",
"symbols": ["000001", "000002", "600036", "600519", "000858",
"002415", "300750", "601318", "000333", "002594"]
}
ws.send(json.dumps(sub_msg))
ws = websocket.WebSocketApp(url, on_message=on_message)
ws.on_open = on_open
ws.run_forever()
脚本启动后,这10只股票的每一笔成交都会毫秒级地抵达你的策略逻辑层,完全无须担心数据延迟。
策略端如何消化实时tick流
当你的订阅范围从几十只扩大到全市场,tick的流速将呈指数级上升。为了让策略引擎稳定运行,我一般会做以下优化:
- 分片并行消费:以股票代码为Key进行哈希分区,将tick分流到多个处理线程,每个线程只负责固定的一部分股票,避免锁竞争。
- 最新价内存快照:维护一个全局字典
current_price["000001"]=最新成交价,让信号计算模块可以极快读取,不需要遍历tick流。 - 批量落库:采用批量INSERT或者使用时序数据库的缓冲写入特性,每积累100条tick或每隔200毫秒刷一次盘,大幅降低磁盘压力。
- 事件驱动信号:只在价格变化超过滑点阈值时触发策略重新计算,其余微小幅跳直接忽略,提升信号稳定度。
全市场订阅的实战注意事项
如果真的需要对全市场进行实时扫描,有两项硬性条件必须满足。 其一,本地的处理能力要够。我在实战中见过单秒三四百条tick的情况,如果CPU或网络带宽跟不上,就必须在前面加一层消息队列(比如Kafka)作为缓冲,让策略按部就班地消费。 其二,一定要利用行情接口的过滤功能。很多API支持“仅推送有成交记录”的模式,能过滤掉大量无交易时段的无用推送,流量直接砍半。
量化路上的数据选型感悟
想要在A股市场做实盘量化,稳定高效的实时行情管道是地基中的地基。WebSocket全双工订阅模式,是我目前认为最平衡的方案。不要再浪费时间重构多线程轮询,那种方式在全面市场的颗粒度下根本走不通。
选型方面,重点考察数据接口的批量订阅能力、推送延迟、全市场权限开放程度和运行稳定性。我的习惯是先拿一小部分股票进行压力测试,验证推送延迟和系统吞吐达到策略要求,再逐步放开到全量。有了像AllTick这类接口的弹性订阅支持,就可以很方便地进行这种渐进式验证,让整个量化系统上线之后安然无恙。

