数据基础设施:行情数据源选择、实时数据管道搭建、数据清洗与对齐

做市策略跑起来之前,有一件事必须搞定——数据。

我见过太多团队,策略逻辑写得漂漂亮亮,一上线就亏钱。为什么?数据源选错了,或者数据管道没搭好。说白了,行情数据就是做市策略的「眼睛」。眼睛瞎了,再聪明的脑子也没用。

行情数据源选择:别只看价格

选数据源这件事,我个人习惯从三个维度去评估:延迟、深度、稳定性

维度 说明 我的建议
延迟 数据从交易所到你策略的时间 做市策略通常需要毫秒级,别用公开免费源
深度 订单簿的层数、成交量数据 至少需要10档,最好有全量快照
稳定性 断连率、数据缺失率 99.99% uptime 是底线

常见的行情数据源有几种:

  • 交易所直连——延迟最低,但需要自己处理协议和重连逻辑。我在项目中遇到过,某交易所的WebSocket偶尔会发空包,不处理的话策略会直接卡死。
  • 第三方数据商(如彭博、路透、Polygon)——省心,但贵。适合中小团队。
  • 公开免费源(如Binance的公开API)——只适合回测和模拟,别用于实盘。
注意: 不同数据源的「最后成交价」可能差几毫秒。做市策略对时间敏感,千万别混用多个源。

实时数据管道搭建:别让数据堵在路上

数据源选好了,接下来就是怎么把数据「喂」给策略。这里我推荐用发布-订阅模式

为什么?你想想看,做市策略通常有多个模块:风控、订单管理、监控面板。如果每个模块都自己去拉数据,不仅乱,还容易重复消费。

我常用的架构是这样的:

行情源 → 数据采集器 → 消息队列(Kafka/Redis) → 策略模块
                              ↓
                         数据存储(时序数据库)

数据采集器负责从交易所拉取数据,然后丢进消息队列。策略模块订阅自己需要的topic。这样解耦后,任何一个模块挂了,不影响其他模块。

嗯,这里要注意:消息队列的吞吐量要留余量。我记得有一次,行情突然剧烈波动,数据量暴增,Kafka直接撑爆了。从那以后,我习惯给队列加一个背压机制——数据太多时,优先丢弃旧数据,保证最新数据能及时处理。

小技巧: 用Redis做消息队列时,记得设置过期时间。行情数据过了几秒就没意义了,别让它占着内存。

数据清洗与对齐:脏数据比没数据更可怕

数据到了策略模块,还不能直接用。为什么?因为行情数据里经常有「脏数据」。

我遇到过的情况:

  • 价格突然跳到一个离谱的值(比如BTC瞬间变成0.01美元)
  • 时间戳错乱(某笔交易的时间比上一笔还早)
  • 重复数据(同一笔成交发了两次)

这些脏数据如果不处理,策略会做出错误决策。比如,看到价格暴跌就疯狂买入,结果发现是数据错误。

数据清洗的几个关键步骤:

  1. 去重——根据交易ID或时间戳+价格+数量组合去重
  2. 异常值过滤——设定价格上下限,超出范围直接丢弃
  3. 时间戳对齐——不同数据源的时间戳可能不同步,需要统一到同一个时钟

数据对齐这块,我建议用事件驱动的方式,而不是定时轮询。事件驱动能保证数据到达后立即处理,延迟更低。

核心原则: 宁可丢数据,也别用错误数据。做市策略的容错性很差,一个错误信号可能让你亏掉一天利润。

整体数据流架构

下面这张图,是我个人比较推荐的数据基础设施架构。它把数据源、管道、清洗、对齐都串起来了。

交易所A 交易所B 第三方数据商 数据采集器 协议解析 重连机制 数据缓存 心跳检测 负载均衡 消息队列 Kafka / Redis Topic: 行情 Topic: 成交 Topic: 订单簿 背压机制 清洗与对齐 去重 异常过滤 时间戳对齐 事件驱动 输出标准化 数据流方向:交易所 → 采集 → 队列 → 清洗对齐 → 策略使用 时序数据库(历史存储)

这张图里,数据从交易所出发,经过采集器进入消息队列,再被清洗对齐模块处理,最后输出给策略。同时,数据也会落地到时序数据库,用于回测和分析。

我个人习惯在清洗对齐模块里加一个数据质量监控——如果连续10笔数据都异常,直接报警。别等到策略亏钱了才发现数据有问题。

避坑指南: 我曾经在数据对齐时,直接用系统时间戳代替交易所时间戳。结果策略在行情剧烈波动时,订单簿和成交数据差了整整100毫秒。后来我改用交易所的sequence number做对齐,问题才解决。

数据基础设施这块,说白了就是三个字:稳、快、准。稳是不断连,快是低延迟,准是数据干净。这三条做到了,你的做市策略就成功了一半。

专注资料整理