一、高频数据基础:Tick数据与Bar数据、Level2行情、数据频率选择
做高频量化,第一关就是数据。我见过太多人策略写得漂亮,结果数据源没选对,回测曲线漂亮得像假的一样——嗯,上线就亏。
今天咱们就把高频数据的底裤扒干净。说白了,就三件事:Tick和Bar到底怎么用?Level2行情到底值不值得买?数据频率选多少合适?
1.1 Tick数据:最原始的脉搏
Tick数据,就是交易所每笔成交的原始记录。每一笔交易,都记下了时间、价格、成交量、买卖方向。
举个例子,上交所的Tick长这样:
时间戳: 2024-01-15 09:30:01.123
价格: 15.28
成交量: 1200
买卖方向: 主动买
我个人习惯把Tick数据叫做「裸数据」。为什么?因为它最真实,没有任何加工。你想想看,所有的高频策略,最终都要落到Tick级别才能执行。
核心要点:Tick数据是高频交易的「原子单位」。任何Bar数据都是从Tick聚合来的。
我在项目中遇到过一个问题:某家数据商提供的Tick数据,时间戳精度只有毫秒。结果做订单流分析时,同一毫秒内的多笔交易顺序全乱了。后来我换了一家微秒级精度的数据源,问题才解决。
避坑指南:我曾经以为所有Tick数据都一样。直到有一次回测一个高频反转策略,用A家的Tick数据年化收益30%,用B家的直接亏10%。一查,原来是A家把同一毫秒内的交易按价格排序了,而B家按收到顺序排的。数据清洗的细节,能直接决定策略生死。
1.2 Bar数据:从Tick到K线的聚合艺术
Bar数据,就是把Tick按时间窗口聚合。最常见的当然是1分钟Bar、5分钟Bar。但做高频的人,更关心的是秒级Bar,比如1秒Bar、500毫秒Bar。
一个标准的Bar包含四个价格:Open、High、Low、Close,外加成交量。
聚合逻辑其实很简单:
def ticks_to_bar(ticks, bar_interval_ms=1000):
"""
将Tick数据聚合成指定毫秒间隔的Bar
"""
bar_start = ticks[0]['time']
bar_end = bar_start + bar_interval_ms
bar_data = []
current_bar_ticks = []
for tick in ticks:
if tick['time'] < bar_end:
current_bar_ticks.append(tick)
else:
# 生成Bar
bar = {
'time': bar_start,
'open': current_bar_ticks[0]['price'],
'high': max(t['price'] for t in current_bar_ticks),
'low': min(t['price'] for t in current_bar_ticks),
'close': current_bar_ticks[-1]['price'],
'volume': sum(t['volume'] for t in current_bar_ticks)
}
bar_data.append(bar)
# 重置
bar_start = bar_end
bar_end += bar_interval_ms
current_bar_ticks = [tick]
return bar_data
你可能会问:为什么不用现成的Bar数据,非要自己从Tick聚合?
原因很简单:不同数据商的Bar聚合规则不一样。有的用自然时间,有的用交易时间;有的包含盘前数据,有的不包含。自己做聚合,才能保证数据一致性。
我的经验:做高频策略,我建议至少保留Tick数据。Bar数据可以随时生成,但Tick数据丢了就再也找不回来了。存储成本虽然高一点,但值得。
1.3 Level2行情:比Tick更深的细节
Level2行情,说白了就是「增强版Tick」。普通Tick只告诉你成交了,Level2还告诉你:
- 十档买卖盘口:买一到买十,卖一到卖十,每个价位的挂单量
- 逐笔成交:每一笔成交的详细情况,包括成交编号
- 委托队列:前50笔挂单的明细
- 资金流向:大单、中单、小单的划分
我刚开始做高频时,觉得Level2就是噱头。直到有一次,我用普通Tick数据做订单簿重建,发现重建出来的深度跟实际差了好几个价位。后来买了Level2数据,才发现原来中间有那么多撤单和改单。
| 数据类型 | 包含信息 | 数据量/天(单只股票) | 典型用途 |
|---|---|---|---|
| 普通Tick | 成交价、量、方向 | 约500KB | 价格发现、动量策略 |
| Level2 | 十档盘口、逐笔成交、委托队列 | 约5-10MB | 订单簿分析、微观结构策略 |
| 全量快照 | 全部档位盘口、全部委托 | 约50-100MB | 做市商策略、套利策略 |
一句话总结:普通Tick是「结果」,Level2是「过程」。做高频微观结构,必须上Level2。
1.4 数据频率选择:不是越快越好
这个问题我经常被问到:「做高频是不是频率越高越好?」
答案是否定的。频率选择取决于三件事:
- 策略逻辑:做市商需要毫秒级,趋势跟踪可能秒级就够了
- 交易成本:频率越高,手续费和滑点占比越大
- 数据质量:高频数据噪声大,需要更复杂的滤波
我个人习惯把频率分成三个档次:
- 毫秒级(1-100ms):做市商、套利、订单簿预测。需要Level2数据,对延迟极度敏感
- 秒级(100ms-10s):高频动量、反转策略。Tick或1秒Bar即可,对延迟要求适中
- 分钟级(1min+):日内趋势、统计套利。普通Bar数据就够,对延迟不敏感
我曾经踩过的坑:刚开始做高频时,我一股脑买了毫秒级数据,结果策略跑下来还不如分钟级。后来分析发现,我的策略逻辑本身就需要至少3秒的持仓时间,毫秒级数据带来的噪声反而让信号质量下降了。频率不是越高越好,匹配策略逻辑才是关键。
1.5 知识体系总览
下面这张图,是我自己梳理的高频数据知识体系。每次带新人,我都会先让他们看这张图:
这张图把整个知识体系串起来了。从上往下看:数据源决定了你能拿到什么,数据类型决定了你能做什么分析,频率选择决定了策略的适用场景。
我的建议:刚开始做高频,别急着上Level2。先用普通Tick数据把策略逻辑跑通,确认有盈利信号后,再升级到Level2做精细化优化。这样成本最低,效率最高。