Tick数据实战:Tick数据的结构与含义、如何获取Tick数据、Tick数据的清洗与预处理

各位同学,咱们今天聊点真家伙——Tick数据。

很多做量化的人,做了三五年,还在用日线、小时线。说实话,那都是“二手数据”。真正的一手情报,藏在Tick里。我当年刚入行时,带我的老大哥跟我说过一句话,我一直记到现在:“谁掌握了Tick,谁就掌握了市场的脉搏。”

今天这一章,我就把Tick数据的底裤给你扒干净。

一、Tick数据的结构与含义

先问个问题:你知道一根K线是怎么来的吗?

嗯,很多人会说:开盘价、收盘价、最高价、最低价。那这些价格又是从哪来的?

答案是——从每一笔真实的成交中来的。每一笔成交,就是一个Tick。

Tick数据,说白了就是交易所推送的每一笔逐笔成交记录。它是最微观、最原始的市场数据。

核心要点:Tick数据记录的是“发生了什么”,而不是“汇总后长什么样”。

一个标准的Tick数据,通常包含以下字段:

字段名 含义 示例
Time 成交时间(精确到毫秒甚至微秒) 2024-01-15 09:30:00.123
Price 成交价格 15.68
Volume 成交量(股/手) 1000
Side 成交方向(主动买/主动卖) Buy / Sell
Symbol 合约代码 600519.SH

这里我要特别强调一下Side(成交方向)这个字段。很多人以为它不重要,其实它才是Tick数据的灵魂。

为什么?因为通过Side,你可以判断出这笔成交是“买方主动吃单”还是“卖方主动砸盘”。这直接反映了当前市场的资金意图。

我的经验:我在做高频因子挖掘时,发现“主动买成交量占比”这个指标,比单纯的价格涨跌信号要早1-3个Tick。说白了,资金动作永远走在价格前面。

二、如何获取Tick数据

好,现在你知道Tick数据长什么样了。下一个问题:去哪搞?

我直接给你列几个靠谱的渠道:

  • 交易所官方数据源:上交所L1/L2行情、深交所行情、中金所行情。最权威,但贵。
  • 第三方数据服务商:万得、聚宽、米筐、Tushare等。性价比高,适合个人和中小机构。
  • 券商API接口:部分券商提供CTP、XTP等接口,可以直接拉取Tick数据。
  • 自行采集:通过爬虫或行情网关抓取。技术门槛高,但最灵活。

我个人建议,刚开始做研究的朋友,先用聚宽或Tushare的免费接口试试水。别一上来就花大价钱买全市场Tick,万一你发现这条路走不通呢?

下面给一段Python代码,演示如何通过Tushare获取某只股票的Tick数据:

import tushare as ts

# 设置token(需要去tushare官网注册)
pro = ts.pro_api('your_token_here')

# 获取2024年1月15日贵州茅台的Tick数据
df = pro.tick_data(
    ts_code='600519.SH',
    trade_date='20240115',
    start_time='093000',
    end_time='150000'
)

print(df.head())

注意:免费接口通常有频率限制,比如每分钟只能请求200次。如果你要批量拉取大量数据,建议升级付费版或自己搭建数据仓库。

三、Tick数据的清洗与预处理

拿到原始Tick数据后,千万别直接拿去用。我踩过这个坑,而且踩得很惨。

有一次,我写了一个策略,回测表现特别好。结果实盘一跑,亏得亲妈都不认识。排查了两天,最后发现——原始Tick数据里有大量“脏数据”。

常见的脏数据包括:

  • 重复数据:同一笔成交被推送了两次
  • 缺失数据:某些时间段的Tick丢失了
  • 异常价格:比如价格突然跳到0或者999999
  • 时间戳错乱:后一笔成交的时间戳比前一笔还早
  • 成交量异常:单笔成交量超过该股票当日流通盘的1%

所以,清洗这一步,必须做,而且要做扎实。

我一般按以下流程处理:

  1. 去重:按时间戳+价格+成交量+方向去重
  2. 排序:按时间戳升序排列
  3. 剔除异常值:价格超出当日涨跌停范围的,直接删掉
  4. 补全缺失:如果某秒内没有Tick,可以插入一个空Tick(价格不变,成交量为0)
  5. 校验连续性:检查时间戳是否连续,不连续的要标记出来

下面是我常用的清洗代码片段:

def clean_tick_data(df):
    # 1. 去重
    df = df.drop_duplicates(subset=['time', 'price', 'volume', 'side'])
    
    # 2. 排序
    df = df.sort_values('time').reset_index(drop=True)
    
    # 3. 剔除异常价格(假设涨跌停为±10%)
    df = df[(df['price'] > 0) & (df['price'] < 99999)]
    
    # 4. 剔除成交量异常(单笔超过总股本0.1%视为异常)
    total_shares = 100000000  # 示例值,实际需从行情获取
    df = df[df['volume'] < total_shares * 0.001]
    
    return df

避坑指南:我曾经在清洗时犯过一个低级错误——把“价格不变但成交量很大”的Tick当成异常给删了。后来才发现,那是大资金在某个价位上对倒。所以,清洗规则要结合业务场景来定,不能一刀切。

清洗完之后,我建议你再做一步:生成Tick级别的衍生特征。比如:

  • 累计主动买成交量
  • 累计主动卖成交量
  • 买卖力量比(Buy/Sell Ratio)
  • 价格波动率(基于连续Tick的价格变化)
  • 大单识别(单笔成交量超过某个阈值)

这些特征,才是你后续建模和策略开发的“原材料”。

好了,关于Tick数据的结构、获取和清洗,今天就聊到这儿。记住一句话:数据质量决定策略上限。Tick数据虽然麻烦,但值得你花时间去打磨。


公众号:蓝海资料掘金营,微信deep3321