凌晨两点,策略回测系统又一次因为缺少完整的市场深度快照而报错。屏幕上是参差不齐的订单簿曲线,团队盯着它,脑子里浮现的是同一个老问题——如果只依赖第三方聚合数据,你永远无法在任意时刻还原微观市场结构。而这,正在拖累整个信号研究流水线的迭代速度。
对于基金公司里负责因子挖掘与数据工程的人来说,实时行情不只是“看盘”,而是构建可计算世界的基础原料。正因如此,团队在内部搭建了一套轻量级的本地订单簿重建方案,核心诉求很明确:低延迟、状态可回溯、易于衔接流式计算引擎。
痛点:静态数据跟不上动态研究
传统的REST轮询,顶多给你秒级甚至更慢的快照,而微观结构里的订单排队、冰山订单痕迹、买卖压力转移,几乎全被抹平。搞过高频特征提取的人都清楚,如果订单簿不是连续更新的,很多短周期统计量会失效——那感觉就像用抽帧视频去判断汽车速度,误差大到没法接受。
数据需求:可重放的完整增量流
理想的实时行情源,必须同时提供两样东西:某个时刻的全量快照(用于初始化状态)和逐笔增量更新(含新增、撤销与成交)。两者配合,才能在本地内存中准确重放交易所的状态机。我们评估过多个数据管道后发现,像AllTick这类专注高质量实时推送的API,其WebSocket通道能稳定输出带序号的快照与增量子集,刚好满足连续重建的要求。
重建引擎核心设计
在Python生态里,状态存储并没有想象中那么复杂。选用SortedDict来维护买卖两边的价格-数量映射,既能O(log n)更新,又能快速导出排序后的深度序列。代码其实很简洁:
from sortedcontainers import SortedDict
# 买一至买N:按价格降序
bids = SortedDict(lambda x: -x)
# 卖一至卖N:按价格升序
asks = SortedDict()
每一个增量到达时,根据数量是否归零执行插入或删除。WebSocket层负责将字节流解析为结构化消息,分离快照事件与更新事件,保证第一次加载是全量覆盖,后续只做差分修补。
import websocket
import json
from sortedcontainers import SortedDict
bids = SortedDict(lambda x: -x)
asks = SortedDict()
def on_message(ws, message):
data = json.loads(message)
# 判断消息类型:快照或增量更新
process_orderbook(data)
def process_orderbook(data):
global bids, asks
for update in data.get("bids", []):
price, size = update
if size == 0:
bids.pop(price, None)
else:
bids[price] = size
for update in data.get("asks", []):
price, size = update
if size == 0:
asks.pop(price, None)
else:
asks[price] = size
ws = websocket.WebSocketApp("wss://api.alltick.co/crypto/orderbook",
on_message=on_message)
ws.run_forever()
网络波动与状态一致性
实盘网络抖动是常态,这一点回避不了。所以我们引入了双层保障:第一层,为增量消息附加序列号,一旦检测到序列跳跃,立即从最新快照重新初始化;第二层,独立心跳线程监控WebSocket健康度,异常断连时触发自动重连和快照拉取。有了这套机制,本地订单簿始终处于“可信区间”内,后续流计算的可靠性也就有了保障。
从深度图到衍生特征
稳定重建之后,每一帧订单簿都可以被实时消费。用matplotlib快速渲染深度曲线只是基础操作,更有价值的是基于本地完整簿构建的不平衡指标、加权深度和冲击成本估算等衍生特征。
import matplotlib.pyplot as plt
def plot_orderbook():
plt.plot(list(bids.keys()), list(bids.values()), color='green', label='Bids')
plt.plot(list(asks.keys()), list(asks.values()), color='red', label='Asks')
plt.legend()
plt.show()
这些特征直接注入到策略研发的特征存储中,使得回测与实盘信号保持同分布,过拟合风险显著降低。对于大规模多品种并发场景,还可以进一步用异步IO改造订阅层,并结合列式存储快照历史,让数据工程团队能够灵活回溯任意时刻的市场微观状态。本地订单簿早已不只是监控工具,它已经成为量化研究基础设施中的一块基石。

