刚开始做量化的时候,我也踩过一个很常见的坑:拿到 Tick 数据就直接进策略,结果回测表现和实盘感觉完全对不上。
后来回头看,问题并不在策略,而是 Tick 数据本身并不“干净”。
如果基础数据有问题,后面的逻辑写得再漂亮,结果也很难可信。
这篇主要记录一下我在实际项目中,对 Tick 数据做基础处理的一些经验,算是给刚入门的朋友一个参考。
Tick 数据里,常见但容易忽略的问题
即便是交易所推送的逐笔成交数据,在实际使用中也经常会遇到一些问题,比如:

  • 重复 Tick:相同时间戳、价格、成交量被重复记录
  • 异常价格:极端偏离当前行情,多半来自传输或解析异常
  • 时间戳顺序混乱:Tick 没有严格按时间递增
  • 字段不完整:有价格没成交量,或者反过来

这些问题在单条数据上看不明显,但一旦进入回测或统计分析,很容易放大影响。
所以在策略逻辑之前,我一般都会先做一层最基础的 Tick 清洗。
一个简单但实用的 Tick 清洗流程
下面这个示例,是我平时会用到的一种最基础处理方式,思路很简单:

import pandas as pd

def clean_ticks(raw_ticks):
    """
    对原始 Tick 数据做基础清洗
    raw_ticks: list[dict],包含 timestamp / price / volume 等字段
    """
    df = pd.DataFrame(raw_ticks)

    # 确保时间顺序
    df = df.sort_values("timestamp").reset_index(drop=True)

    # 去重
    df = df.drop_duplicates()

    # 去掉关键字段为空的记录
    df = df.dropna(subset=["price", "volume"])

    # 过滤明显异常值(阈值需根据标的调整)
    df = df[(df["price"] > 0) & (df["volume"] > 0)]

    return df

这类处理并不复杂,但非常有必要
很多“策略不稳定”的问题,最后都能追溯到数据层。
实际项目里,清洗规则一定要结合标的和交易制度调整,这里只是一个基础示例。
关于数据源本身的一点体会
在做这些基础处理时,我个人更倾向于使用字段定义清晰、时序比较稳定的实时数据源,这样可以少写很多防御性代码。
之前的一些项目里,我用过支持股票、外汇和加密资产实时推送的数据服务(例如 AllTick 的 WebSocket 行情),整体字段完整性和时间顺序比较稳定,对我来说更多是“省事”,而不是为了追求功能有多复杂。