4、高频数据基础:Tick数据、分钟级数据、数据频率选择、数据对齐与清洗、数据存储方案
做市商这行,说白了就是跟数据打交道。你策略再牛,底层数据是脏的、频率选错了、对齐没做好,那结果就是——亏钱。我见过太多团队,模型跑得飞起,一上实盘就崩,查到最后,往往是数据基础没打牢。
今天咱们就把这块地基夯实。我会从Tick数据讲起,一直聊到怎么存、怎么清洗。嗯,都是我在实盘里踩过的坑,你听听看。
4.1 Tick数据:最原始的市场心跳
Tick数据是什么?就是交易所每笔成交的原始记录。每一笔交易,都对应一条Tick。它记录了价格、数量、时间,有时候还有买卖方向。
举个例子,一条典型的Tick数据长这样:
时间戳: 2024-01-15 09:30:01.123456
价格: 100.25
数量: 200
方向: 买 (Bid触发)
交易所: Binance
交易对: BTC/USDT
你想想看,一秒钟可能产生几十甚至上百条Tick。高频交易的核心,就是在这毫秒级的波动里找机会。
核心要点:Tick数据是最高频、最原始的数据。它没有经过任何加工,是策略回测和实盘执行的「原材料」。
我个人习惯,在做市策略开发初期,一定会先拉一周的Tick数据,肉眼扫一遍。为什么?因为很多异常模式,你光看统计量是看不出来的。比如某个交易所的Tick时间戳经常出现「倒挂」,也就是后发生的交易时间戳反而更早。这种数据不处理,你的策略逻辑会直接乱掉。
4.2 分钟级数据:降频后的「中频」视角
Tick数据太密了,存起来贵,算起来慢。所以很多时候,我们会把Tick数据聚合成分钟级数据。比如1分钟K线,就是这一分钟内的开盘价、收盘价、最高价、最低价、成交量。
分钟级数据的好处是:
- 存储成本低:一条分钟数据顶几百条Tick。
- 计算速度快:回测时跑得动,策略迭代效率高。
- 噪音少:过滤掉了微观层面的随机波动。
但要注意,降频是有代价的。你丢失了订单簿的微观结构信息。比如,一个巨大的买单在最后一秒把价格拉上去,然后瞬间撤单。在分钟K线上,你只看到一根长上影线,但Tick数据里,你能看到这个「虚假拉升」的全过程。
我的建议:策略开发初期,先用分钟级数据做快速验证。等逻辑跑通了,再切到Tick数据做精细回测。别一上来就搞Tick,否则你一天可能连一次回测都跑不完。
4.3 数据频率选择:不是越高越好
很多新手有个误区:频率越高,策略越赚钱。其实不是。
频率选择,取决于你的策略类型:
| 策略类型 | 推荐频率 | 原因 |
|---|---|---|
| 高频做市 | Tick / 毫秒级 | 需要捕捉订单簿瞬间变化 |
| 日内趋势 | 1分钟 / 5分钟 | 过滤微观噪音,抓主要趋势 |
| 统计套利 | 1分钟 / 5分钟 | 需要稳定的相关性计算 |
| 中低频做市 | 1分钟 / 15分钟 | 降低交易成本,减少滑点影响 |
我在项目中遇到过一件事:有个团队做BTC永续合约的做市,用了Tick数据,结果策略在回测里年化300%,一上实盘就亏。后来发现,他们的Tick数据里包含了大量「闪电交易」——就是那种几毫秒内价格来回跳的极端行情。回测时这些交易都按理想价格成交了,但实盘根本吃不到。这就是频率选得太高,反而引入了「回测幻觉」。
避坑指南:我曾经因为数据频率选错,白费了两周时间。记住:频率越高,对数据质量的要求也越高。如果你的数据源本身就有延迟或丢包,高频数据反而会放大这些错误。
4.4 数据对齐与清洗:脏数据是策略杀手
数据对齐,说白了就是把不同来源、不同频率的数据,放到同一个时间轴上。比如,你要把Binance的Tick数据和OKX的Tick数据对齐,才能做套利。
对齐的核心难点在于:不同交易所的时间戳精度不一样。有的精确到毫秒,有的精确到微秒,有的甚至只有秒级。你直接按时间戳合并,会发现大量「错位」。
我的做法是:
- 统一时间基准:把所有时间戳都转成UTC纳秒级整数。
- 按时间窗口对齐:比如,对于Tick数据,设定一个1毫秒的容忍窗口。在这个窗口内的数据,视为「同时发生」。
- 填充缺失值:如果某个时间点没有数据,用前一条数据填充(forward fill),或者直接丢弃。
数据清洗就更关键了。常见的脏数据包括:
- 价格异常:比如价格突然变成0,或者比前一秒翻了10倍。
- 成交量异常:比如某条Tick的成交量是正常值的100倍。
- 时间戳重复:多条数据的时间戳完全一样,但价格不同。
- 数据缺失:某段时间内完全没有数据。
清洗原则:宁可丢掉可疑数据,也不要让脏数据进入策略。我曾经因为一条价格异常的Tick,导致整个做市策略在实盘里连续吃单,亏了6位数。从那以后,我的清洗逻辑里永远有一条:价格变动超过5%的Tick,直接标记为异常,人工复核。
4.5 数据存储方案:选对了,事半功倍
高频数据量巨大。一个交易所一天的Tick数据,可能就有几个GB。怎么存,是个大问题。
我推荐几种方案:
| 存储方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| CSV文件 | 小规模、临时分析 | 简单、通用 | 慢、占用空间大 |
| Parquet | 中等规模、列式分析 | 压缩率高、读取快 | 不支持实时写入 |
| InfluxDB | 时序数据、实时查询 | 专为时序设计、查询快 | 学习成本高 |
| ClickHouse | 大规模、复杂分析 | 极速查询、支持SQL | 运维复杂 |
我个人习惯是:
- 原始Tick数据:用Parquet存,按天分区。这样回测时按日期加载,速度快,空间省。
- 分钟级数据:用ClickHouse存,方便做各种聚合查询和可视化。
- 实时数据:用InfluxDB,专门给实盘策略提供低延迟的数据读取。
一个小技巧:不管用什么方案,一定要做数据校验。我每次存完数据,都会跑一个简单的脚本,检查数据条数、时间范围、价格范围是否合理。这一步花不了几分钟,但能避免「存了一堆坏数据」的悲剧。
知识体系总览
下面这张图,把本章的核心逻辑串起来了。你可以把它当作一个「数据决策地图」:
这张图的核心逻辑是:从原始数据源出发,根据策略类型选择Tick或分钟级数据,然后做对齐和清洗,最后存到合适的存储方案里。每一步都做扎实了,你的策略才能跑得稳。
好了,高频数据基础就聊到这儿。记住一句话:数据质量决定策略上限。你花在数据上的每一分钟,都会在策略收益上得到回报。
公众号:蓝海资料掘金营,微信deep3321