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数据可视化成一个“散点图”,横轴是时间,纵轴是价格,点的大小代表成交量,颜色代表买卖方向。一眼就能看出资金的流向。

09:30 09:31 09:32 100.50 100.40 100.30 100.20 主动买盘 主动卖盘 Time & Sales 散点图示例

3.4 成交量分布:找到价格的“引力场”

成交量分布(Volume Profile),是我最常用的工具之一。它不像传统成交量指标那样只看总量,而是告诉你:在哪个价格区间,成交最活跃?

说白了,就是把成交量按价格“堆”起来。价格在某个区域停留的时间越长,成交量越大,这个区域就越重要。它就像一个“引力场”,价格被拉过去,或者被弹开。

关键概念:

  • 价值区域(VA): 成交量最大的那个价格区间,通常占全天成交量的70%左右。
  • 控制点(POC): 成交量最大的那个单一价格。
  • 高量节点(HVN): 成交量明显高于周围的价格点。
  • 低量节点(LVN): 成交量明显低于周围的价格点,往往是价格快速突破的区域。

我记得有一次做螺纹钢的日内策略。我发现价格每次跌到某个低量节点(LVN)下方,都会迅速反弹。后来我专门写了个策略,就在价格跌破LVN时做多,止损放在LVN下方一个Tick。胜率出奇的高。为什么?因为低量节点意味着那里“没人愿意卖”,稍微有点买盘,价格就上去了。

实战技巧: 计算成交量分布时,建议用Tick数据里的Volume字段,而不是用K线里的成交量。因为Tick数据能精确到每一笔,分布更细腻。我一般会取过去30分钟的Tick数据,动态计算当前的VA和POC。

好了,这一章的内容就到这里。Tick数据处理是基本功,但也是最容易被忽视的环节。你想想看,如果连原始数据都处理不好,后面那些花里胡哨的策略,不都是空中楼阁吗?


专注资料整理