数据基础设施:行情数据源选择、实时数据管道搭建、数据清洗与对齐
做市策略跑起来之前,有一件事必须搞定——数据。
我见过太多团队,策略逻辑写得漂漂亮亮,一上线就亏钱。为什么?数据源选错了,或者数据管道没搭好。说白了,行情数据就是做市策略的「眼睛」。眼睛瞎了,再聪明的脑子也没用。
行情数据源选择:别只看价格
选数据源这件事,我个人习惯从三个维度去评估:延迟、深度、稳定性。
| 维度 | 说明 | 我的建议 |
|---|---|---|
| 延迟 | 数据从交易所到你策略的时间 | 做市策略通常需要毫秒级,别用公开免费源 |
| 深度 | 订单簿的层数、成交量数据 | 至少需要10档,最好有全量快照 |
| 稳定性 | 断连率、数据缺失率 | 99.99% uptime 是底线 |
常见的行情数据源有几种:
- 交易所直连——延迟最低,但需要自己处理协议和重连逻辑。我在项目中遇到过,某交易所的WebSocket偶尔会发空包,不处理的话策略会直接卡死。
- 第三方数据商(如彭博、路透、Polygon)——省心,但贵。适合中小团队。
- 公开免费源(如Binance的公开API)——只适合回测和模拟,别用于实盘。
实时数据管道搭建:别让数据堵在路上
数据源选好了,接下来就是怎么把数据「喂」给策略。这里我推荐用发布-订阅模式。
为什么?你想想看,做市策略通常有多个模块:风控、订单管理、监控面板。如果每个模块都自己去拉数据,不仅乱,还容易重复消费。
我常用的架构是这样的:
行情源 → 数据采集器 → 消息队列(Kafka/Redis) → 策略模块
↓
数据存储(时序数据库)
数据采集器负责从交易所拉取数据,然后丢进消息队列。策略模块订阅自己需要的topic。这样解耦后,任何一个模块挂了,不影响其他模块。
嗯,这里要注意:消息队列的吞吐量要留余量。我记得有一次,行情突然剧烈波动,数据量暴增,Kafka直接撑爆了。从那以后,我习惯给队列加一个背压机制——数据太多时,优先丢弃旧数据,保证最新数据能及时处理。
数据清洗与对齐:脏数据比没数据更可怕
数据到了策略模块,还不能直接用。为什么?因为行情数据里经常有「脏数据」。
我遇到过的情况:
- 价格突然跳到一个离谱的值(比如BTC瞬间变成0.01美元)
- 时间戳错乱(某笔交易的时间比上一笔还早)
- 重复数据(同一笔成交发了两次)
这些脏数据如果不处理,策略会做出错误决策。比如,看到价格暴跌就疯狂买入,结果发现是数据错误。
数据清洗的几个关键步骤:
- 去重——根据交易ID或时间戳+价格+数量组合去重
- 异常值过滤——设定价格上下限,超出范围直接丢弃
- 时间戳对齐——不同数据源的时间戳可能不同步,需要统一到同一个时钟
数据对齐这块,我建议用事件驱动的方式,而不是定时轮询。事件驱动能保证数据到达后立即处理,延迟更低。
整体数据流架构
下面这张图,是我个人比较推荐的数据基础设施架构。它把数据源、管道、清洗、对齐都串起来了。
这张图里,数据从交易所出发,经过采集器进入消息队列,再被清洗对齐模块处理,最后输出给策略。同时,数据也会落地到时序数据库,用于回测和分析。
我个人习惯在清洗对齐模块里加一个数据质量监控——如果连续10笔数据都异常,直接报警。别等到策略亏钱了才发现数据有问题。
数据基础设施这块,说白了就是三个字:稳、快、准。稳是不断连,快是低延迟,准是数据干净。这三条做到了,你的做市策略就成功了一半。