3、Tick级数据处理:微观世界的入场券
做短线交易,尤其是高频或者日内策略,很多人上来就看1分钟、5分钟K线。但我个人习惯是,先扎进Tick数据里泡一泡。为什么?因为K线是加工过的“二手信息”,而Tick数据才是市场最原始的呼吸和心跳。
说白了,Tick数据就是交易所每一笔成交的原始记录。你想想看,每一笔交易的价格、数量、时间,甚至买卖方向,都藏在里面。今天这一章,我们就来聊聊怎么跟这些“原始人”打交道。
核心观点: 你的策略精度,取决于你对Tick数据的处理深度。处理不好,后面全是垃圾。
3.1 Tick数据格式与存储:别让数据成为瓶颈
先说说Tick数据长什么样。不同交易所给的格式略有不同,但核心字段就那么几个。我拿国内期货市场的典型格式举个例子:
| 字段名 | 含义 | 示例值 |
|---|---|---|
| DateTime | 交易所时间戳(毫秒级) | 2024-01-15 09:30:01.250 |
| LastPrice | 最新成交价 | 3856.00 |
| Volume | 该笔成交量 | 5 |
| Turnover | 该笔成交额 | 19280.00 |
| BidPrice1 | 买一价 | 3855.80 |
| AskPrice1 | 卖一价 | 3856.20 |
| BidVol1 | 买一量 | 120 |
| AskVol1 | 卖一量 | 80 |
嗯,这里要注意。很多新手只盯着LastPrice看,其实Bid/Ask的挂单变化才是真正的“暗流”。我在项目中遇到过,有些策略就是靠捕捉买一卖一量的突变来抓行情的。
存储方面,我建议用列式存储。 比如Parquet或者HDF5。为什么?因为Tick数据量太大了。一天的数据可能几千万行,如果用CSV存,查询和加载都慢得要命。列式存储只读取你需要的列,速度快一个数量级。
我的小技巧: 存储时,把日期作为分区字段。比如每天一个文件,或者每小时一个文件。这样回溯测试时,按日期范围读取,效率极高。
3.2 数据清洗与对齐:垃圾进,垃圾出
拿到原始Tick数据,千万别直接拿来算指标。你信不信,里面全是坑。
常见问题:
- 时间戳错乱: 网络延迟或者撮合引擎的bug,可能导致时间戳不是严格递增的。
- 重复数据: 某些行情源会推送重复的Tick。
- 异常价格: 比如突然出现一个0,或者价格偏离正常范围几十个点。
我曾经有一次,策略在回测里表现完美,一上实盘就亏钱。查了三天,发现是Tick数据里混入了夜盘收盘前的“集合竞价”数据,那些价格根本不是连续交易产生的。从那以后,我清洗数据的第一件事就是:过滤掉非连续交易时段的数据。
对齐问题更头疼。 不同股票或者期货合约,它们的Tick时间戳可能不是对齐的。比如A股票在09:30:01.250成交了一笔,B股票在09:30:01.260成交了一笔。你要做价差套利,就必须把它们对齐到同一个时间轴上。
我的做法是:构建一个固定的时间网格,比如每100毫秒一个桶。然后把每个Tick数据扔进对应的桶里。桶内的数据,取最后一笔作为该时刻的代表。
# 伪代码示例:时间对齐
import pandas as pd
def align_ticks(tick_df, freq='100ms'):
# 将时间戳设为索引
tick_df.set_index('DateTime', inplace=True)
# 重采样到固定频率,取每个桶内的最后一笔
aligned = tick_df.resample(freq).last()
# 前向填充,处理没有Tick的桶
aligned.fillna(method='ffill', inplace=True)
return aligned
警告: 前向填充(ffill)要慎用。如果连续多个桶都没有数据,说明市场流动性极差,这时候用前一个价格填充,会引入严重的滞后偏差。我一般会设置一个最大填充间隔,比如超过5个桶没数据,就标记为NaN。
3.3 时间与销售(Time & Sales)分析:读懂每一笔交易
Time & Sales,其实就是逐笔成交明细。但别小看它,这里面藏着主力的“小动作”。
核心分析维度:
- 大单识别: 单笔成交量超过某个阈值(比如平均量的5倍),很可能是机构在动手。
- 买卖方向判断: 用Tick价格和Bid/Ask比较。如果成交价靠近Ask,说明买方主动;靠近Bid,说明卖方主动。
- 成交速度: 单位时间内的Tick数量。突然加速,往往意味着行情要变盘。
我举个例子。你看到某只股票在10秒内连续出现了10笔大单,而且全部是主动买盘(价格打在卖一上)。这说明什么?说明有人在抢筹。这时候,你如果还傻傻地等着回调,可能就错过了。
我个人习惯,会把Time & Sales数据可视化成一个“散点图”,横轴是时间,纵轴是价格,点的大小代表成交量,颜色代表买卖方向。一眼就能看出资金的流向。
3.4 成交量分布:找到价格的“引力场”
成交量分布(Volume Profile),是我最常用的工具之一。它不像传统成交量指标那样只看总量,而是告诉你:在哪个价格区间,成交最活跃?
说白了,就是把成交量按价格“堆”起来。价格在某个区域停留的时间越长,成交量越大,这个区域就越重要。它就像一个“引力场”,价格被拉过去,或者被弹开。
关键概念:
- 价值区域(VA): 成交量最大的那个价格区间,通常占全天成交量的70%左右。
- 控制点(POC): 成交量最大的那个单一价格。
- 高量节点(HVN): 成交量明显高于周围的价格点。
- 低量节点(LVN): 成交量明显低于周围的价格点,往往是价格快速突破的区域。
我记得有一次做螺纹钢的日内策略。我发现价格每次跌到某个低量节点(LVN)下方,都会迅速反弹。后来我专门写了个策略,就在价格跌破LVN时做多,止损放在LVN下方一个Tick。胜率出奇的高。为什么?因为低量节点意味着那里“没人愿意卖”,稍微有点买盘,价格就上去了。
实战技巧: 计算成交量分布时,建议用Tick数据里的Volume字段,而不是用K线里的成交量。因为Tick数据能精确到每一笔,分布更细腻。我一般会取过去30分钟的Tick数据,动态计算当前的VA和POC。
好了,这一章的内容就到这里。Tick数据处理是基本功,但也是最容易被忽视的环节。你想想看,如果连原始数据都处理不好,后面那些花里胡哨的策略,不都是空中楼阁吗?