我们在开发CTA策略时,最头疼的问题不是信号逻辑,而是回测数据与实盘的一致性。尤其是当策略依赖盘口深度、买卖价差、挂单量等微观指标时,普通的1分钟K线完全不够用。我们经常对着回测收益曲线自问:如果当时能拿到那个时点的完整订单簿,是不是就能解释策略为什么会在这个价位开仓?
答案是肯定的。今天我们就从量化研究的角度,分享如何通过加密货币API,将历史订单簿快照纳入你的回测数据池,让策略验证更加贴近真实撮合环境。
订单簿快照:回测的“微观还原剂”
订单簿快照记录了某一瞬间所有限价委托单的分布。它包含买盘(Bids)和卖盘(Asks)两个队列,每个队列由价格-数量对组成。我们常用以下表格来理解其数据结构:
| 字段 | 描述 |
|---|---|
| Bids | 买方挂单,按价格降序排列 |
| Asks | 卖方挂单,按价格升序排列 |
| Timestamp | 快照时间(毫秒) |
| Symbol | 合约或现货交易对 |
例如,BTCUSDT在某个毫秒的快照如下:
{
"symbol": "BTCUSDT",
"timestamp": 1784188200000,
"bids": [
["65000", "2.5"],
["64990", "1.8"]
],
"asks": [
["65010", "1.2"],
["65020", "3.1"]
]
}
有了这些数据,我们就可以在回测时模拟限价单的成交概率、滑点大小,甚至评估大单冲击成本,这些是K线永远无法提供的。
历史查询的障碍与解决思路
熟悉加密货币API的朋友都知道,几乎没有任何交易所提供“按时间戳查询历史订单簿”的端点。原因很简单——存储所有历史状态对平台来说是巨大的成本。因此,我们作为量化研究员,必须自己搭建数据采集和存档系统。
这个系统的核心思想是:实时接收订单簿更新,并在本地按时间维度持久化。虽然初期需要投入开发资源,但一旦建立,它可以成为你策略研发的“金矿”。
采集架构选型:为何抛弃HTTP拥抱WebSocket?
在数据采集层面,我们对比了两种方案:
- HTTP轮询:实现简单,但采样间隔会导致数据失真。例如,即使每秒请求一次,订单簿在这一秒内的多次变动都会被遗漏,回测时无法捕捉到瞬间流动性变化,这对高频策略是致命的。
- WebSocket长连接:推送机制保证每条更新都被接收,可以完整记录订单簿的变化轨迹。尽管需要处理增量合并,但数据质量远胜于轮询。
对于量化回测,数据精度直接决定策略有效性,因此我们毫不犹豫地选择WebSocket。
接入示例:AllTick API的WebSocket订阅
在实践中,我们接入过多个数据源,其中AllTick API的WebSocket接口文档清晰,且支持多个交易对,适合快速部署。下面是最基础的订阅代码:
import websocket
import json
url = "wss://apis.alltick.co/websocket-api/stock-websocket-interface-api/transaction-quote-subscription"
def on_message(ws, message):
data = json.loads(message)
print(data)
ws = websocket.WebSocketApp(
url,
on_message=on_message
)
ws.run_forever()
在量化生产环境中,我们会将on_message替换为自定义的回调函数,解析数据后写入时序数据库(如InfluxDB)或列式存储(如Parquet),并建立时间索引,方便后续按时间范围查询。
存储策略:平衡精度与资源
订单簿存储不能“一视同仁”,我们应该根据策略频率来决定保存粒度:
| 策略类型 | 推荐保存粒度 |
|---|---|
| 低频趋势跟踪(小时级) | 每5秒快照 |
| 中频波段交易(分钟级) | 每200毫秒快照 + 增量日志 |
| 高频做市(毫秒级) | 完整增量日志,按需重建快照 |
我们通常采用混合模式:内存中始终维护最新的订单簿,同时将每笔增量写入压缩日志;另外,每隔固定间隔(比如500ms)将内存快照落地。当需要回测特定时间段时,加载最接近的全量快照,再重放后续增量,即可获得精确到毫秒的状态。
时间同步也是一个容易忽视的点。我们要求所有采集服务器与权威NTP源同步,并在入库时统一使用交易所推送的timestamp,而非本地时间,以免因时钟偏移导致回测时序错乱。
回测中的注意事项
- 数据完整性校验:回测前必须扫描数据区间,若发现时间断裂,应剔除或插值(但插值风险大,建议剔除)。
- 重连容灾:WebSocket断开后,应调用REST接口获取当前全量快照,再重新订阅增量,保证恢复后的数据连续。
- 增量与快照分离:推送消息中常包含
type字段,区分snapshot和update,处理逻辑不同,千万不能混淆。 - 异常值过滤:对价格、数量进行阈值校验,避免因交易所异常推送导致回测曲线突变。
长期视角:订单簿数据是策略进化的基石
我们团队经过多年实践,深刻认识到,加密货币API的价值不仅在于实时行情,更在于它赋予了我们构建专属历史数据库的能力。订单簿快照虽然占用存储,但它蕴含的市场微观结构信息——如订单到达率、撤单率、价差波动等——是优化策略参数、开发新因子的宝贵素材。
建议所有量化从业者,从现在开始,有规划地积累订单簿数据。即使初期只是每秒存一次快照,积累一年后,你会发现它带来的洞察远超K线。毕竟,市场的本质是订单的博弈,而不是蜡烛图的绘画。


