2. Tick数据基础
在进入异常Tick识别与修复之前,必须先建立对Tick数据本身的准确认知。很多看似“异常”的记录,其实源于对字段语义、时间戳口径或数据源格式的误解。本节从定义出发,逐层拆解Tick的组成要素,为后续的识别与修复打下基础。
一、Tick的定义与本质
Tick是金融市场行情数据的最小粒度记录,通常表示一次成交或一次报价快照。它不等同于“一笔委托”,也不等同于“一个价格变动”,其确切含义取决于数据源。按内容可分为三类:
- 成交Tick(Trade Tick):记录一次实际成交,包含成交价、成交量、成交时间,部分源还带买卖方向。
- 盘口Tick(Quote Tick):记录某一时刻的买卖盘快照,包含买一至买N、卖一至卖N的价格与挂单量。
- 混合Tick:同一流中既有成交又有盘口,通过类型字段区分,常见于期货Level-1数据。
理解这一点至关重要:成交Tick的“成交量”是增量,而盘口Tick的“挂单量”是存量。若把存量当增量累加,就会产生巨量异常。
二、Tick的数据结构与核心字段
一条标准Tick通常由时间戳、价格、成交量、方向及辅助标识构成。下表列出常见字段及其语义:
| 字段 | 含义 | 典型类型 | 易错点 |
|---|---|---|---|
| timestamp | 时间戳 | int64 / string | 毫秒与微秒混淆 |
| price | 成交价或报价 | float / int | 浮点精度、最小变动单位 |
| volume | 成交量(增量) | int | 与累计量混淆 |
| turnover | 成交额 | float | 与volume×price不一致 |
| side | 买卖方向 | char / int | 主动买卖判定口径不同 |
| symbol | 标的代码 | string | 大小写、后缀差异 |
建议在入库前统一字段命名与单位,例如时间戳统一为毫秒UTC,价格统一为最小变动单位的整数倍,可大幅降低后续修复成本。
三、时间戳:最容易被忽视的异常源头
时间戳是Tick排序、去重、对齐的基准。常见口径包括交易所时间、本地接收时间、撮合时间。三者可能相差数十毫秒甚至数秒。若混用,会出现“时间倒流”或“同一时刻大量重复”的假异常。
处理时需关注:
- 精度:秒、毫秒、微秒、纳秒,转换时注意溢出。
- 时区:UTC与本地时间混用会导致跨日错位。
- 单调性:同一标的的Tick时间戳应非递减,出现回退需标记。
- 重复:同一时间戳多条记录可能是快照重复推送,而非真实成交。
# 检查时间戳单调性示例
df = df.sort_values(['symbol','timestamp'])
df['ts_diff'] = df.groupby('symbol')['timestamp'].diff()
anomaly = df[df['ts_diff'] < 0]
print(anomaly[['symbol','timestamp','ts_diff']].head())
四、价格与成交量字段的语义陷阱
价格字段的异常往往来自最小变动单位(tick size)不匹配。例如某股票tick size为0.01元,若出现0.015元,则可能是数据源精度问题或复权处理错误。成交量字段则需区分增量与累计量:
- 增量成交量:每笔独立,可直接求和。
- 累计成交量:当日累计,需做差分才能得到单笔量。
- 零成交量:可能是撤单或纯报价,不应计入成交统计。
若将累计成交量误当增量,单日总量会被放大数百倍,且差分后可能出现负值,这是最常见的“异常Tick”来源之一。
五、常见数据源与格式对比
不同数据源的Tick在字段、编码、推送方式上差异明显。选择修复策略前,必须先确认数据源特性:
- 交易所直连:如CTP、飞马,二进制或自定义结构,字段紧凑,时间精度高。
- 行情商API:如Wind、聚宽,多为结构化对象,字段命名规范但可能做过后处理。
- 文件格式:CSV、Parquet、HDF5,适合离线分析,但需注意编码与分隔符。
- 消息队列:Kafka、Redis,实时性强,但需处理乱序与重复。
下图展示了一条Tick从数据源到可用记录的字段流转与关键校验点:
六、案例复盘:一次“异常巨量”的排查
某策略在回测中发现某日某股票成交量是正常值的300倍。排查过程如下:
- 检查数据源,发现该源提供的是累计成交量,而策略按增量累加。
- 对累计量做差分后,出现负值,说明存在撤单或数据修正。
- 进一步发现部分Tick时间戳相同但累计量不同,属于快照重复推送。
- 修复方案:按时间戳去重,取最新累计量,再做差分并截断负值为0。
复盘结论:异常Tick未必是数据错误,更多是语义误用。建立字段语义字典,比事后修复更有效。
掌握Tick的定义、结构、时间戳口径、价格与成交量语义以及数据源差异,是后续识别与修复工作的前提。只有在统一语义的基础上,才能准确判断什么是真正的异常。