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排序、去重、对齐的基准。常见口径包括交易所时间、本地接收时间、撮合时间。三者可能相差数十毫秒甚至数秒。若混用,会出现“时间倒流”或“同一时刻大量重复”的假异常。

处理时需关注:

  1. 精度:秒、毫秒、微秒、纳秒,转换时注意溢出。
  2. 时区:UTC与本地时间混用会导致跨日错位。
  3. 单调性:同一标的的Tick时间戳应非递减,出现回退需标记。
  4. 重复:同一时间戳多条记录可能是快照重复推送,而非真实成交。
# 检查时间戳单调性示例
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从数据源到可用记录的字段流转与关键校验点:

Tick数据字段流转与校验 数据源 交易所/行情商 CSV/Kafka/API 原始字段 timestamp price / volume 校验点 时间单调性 价格tick size 可用Tick 标准化 入库 关键校验规则 时间戳非递减,回退标记为可疑 价格必须为最小变动单位的整数倍 成交量非负,累计量需差分 同一时间戳重复记录需去重或合并

六、案例复盘:一次“异常巨量”的排查

某策略在回测中发现某日某股票成交量是正常值的300倍。排查过程如下:

  1. 检查数据源,发现该源提供的是累计成交量,而策略按增量累加。
  2. 对累计量做差分后,出现负值,说明存在撤单或数据修正。
  3. 进一步发现部分Tick时间戳相同但累计量不同,属于快照重复推送。
  4. 修复方案:按时间戳去重,取最新累计量,再做差分并截断负值为0。
复盘结论:异常Tick未必是数据错误,更多是语义误用。建立字段语义字典,比事后修复更有效。

掌握Tick的定义、结构、时间戳口径、价格与成交量语义以及数据源差异,是后续识别与修复工作的前提。只有在统一语义的基础上,才能准确判断什么是真正的异常。