4、Tick数据清洗基础:去重处理、时间戳标准化与价格精度调整
各位同学,欢迎来到Tick级订单流数据清洗的第一课。
说实话,做量化交易这几年,我踩过最大的坑,反而不是策略逻辑本身,而是数据。你想想看,策略再牛,喂进去的是脏数据,出来的结果能信吗?我个人习惯是,拿到任何Tick数据,先做三件事:去重、标准化时间、修整价格精度。这三板斧砍完,数据才算勉强能用。
4.1 重复Tick过滤——别让假数据骗了你的策略
为什么会有重复Tick?
我在项目中遇到过好几次,交易所的行情推送偶尔会重发,或者数据商在拼接文件时出现重复行。如果你不做去重,回测时同一个Tick被计算两次,成交量翻倍、成交笔数翻倍,策略表现会虚高。嗯,这很危险。
核心原则:去重不能只看价格和数量,必须结合时间戳和交易方向。
我常用的去重逻辑是这样的:
import pandas as pd
def remove_duplicate_ticks(df):
"""
去除完全重复的Tick记录
我习惯用 subset 指定关键列,避免误删
"""
# 按时间、价格、数量、买卖方向去重
df_clean = df.drop_duplicates(
subset=['timestamp', 'price', 'volume', 'side'],
keep='first' # 保留第一条,丢弃后续重复
)
return df_clean.reset_index(drop=True)
小技巧:如果你发现数据量特别大,可以先按时间排序,再用 duplicated() 标记重复,这样能看清重复分布。
我曾经遇到过一个极端案例:某数据商提供的Tick数据中,有将近3%的重复行。当时没做去重,回测年化收益虚高了8%。从那以后,去重成了我数据流水线的第一道关卡。
4.2 时间戳标准化——统一时区与精度
Tick数据的时间戳,是个容易出幺蛾子的地方。
不同交易所用的时区不一样。比如,芝加哥商品交易所(CME)用的是美国中部时间,而国内期货交易所用的是北京时间。如果你把两个市场的Tick数据放在一起分析,时间不对齐,结果就是灾难。
我个人习惯是:所有时间戳统一转为UTC,精度统一到毫秒。
def standardize_timestamp(df, time_col='timestamp'):
"""
标准化时间戳:统一时区到UTC,精度到毫秒
"""
# 假设原始时间是北京时间(UTC+8)
df[time_col] = pd.to_datetime(df[time_col])
df[time_col] = df[time_col].dt.tz_localize('Asia/Shanghai')
df[time_col] = df[time_col].dt.tz_convert('UTC')
# 去掉时区信息,保留毫秒精度
df[time_col] = df[time_col].dt.tz_localize(None)
df[time_col] = df[time_col].dt.floor('ms') # 向下取整到毫秒
return df
注意:有些数据源的时间戳是纳秒级的,直接存会占用大量内存。我建议统一降采样到毫秒,除非你的策略需要纳秒级精度。
你想想看,如果两个Tick的时间差只有1微秒,你的策略能捕捉到吗?反正我的策略不行。所以,别纠结那点精度,统一到毫秒就够了。
4.3 价格精度调整——浮点数舍入问题
浮点数在计算机里是个麻烦精。
举个例子,你看到的价格是100.01,但在内存里可能是100.0099999999。如果你直接拿这个数去做比较或计算,结果会莫名其妙地出错。
我在项目中遇到过:因为浮点数精度问题,导致两个明明相等的价格被判定为不相等,订单流分析直接崩了。嗯,这种bug最难查。
我的解决方案是:根据合约的最小价格变动单位(tick size)进行舍入。
def adjust_price_precision(df, price_col='price', tick_size=0.01):
"""
调整价格精度:按最小变动单位舍入
"""
df[price_col] = (df[price_col] / tick_size).round(0) * tick_size
# 保留两位小数,避免多余尾数
df[price_col] = df[price_col].round(2)
return df
重要提醒:不同合约的tick size不一样。比如,螺纹钢期货是1元/吨,而黄金期货是0.02元/克。千万别用同一个值去处理所有数据。
我曾经犯过这个错:用0.01去处理所有品种的价格,结果螺纹钢的价格被截断得乱七八糟。后来我专门维护了一个合约参数表,每个品种的tick size都单独配置。
4.4 本章知识体系总览
下面这张图,是我自己总结的Tick数据清洗流程。你看一遍,心里就有谱了。
这张图把三个步骤串起来了。你照着这个流程走,基本不会出大问题。
4.5 实战中的避坑指南
最后,分享几个我踩过的坑,你遇到了能少走弯路。
- 去重时别只看价格和数量。 我曾经只按价格和数量去重,结果把不同时间点的真实成交给删了。一定要带上时间戳和买卖方向。
- 时间戳标准化要小心夏令时。 有些交易所会切换夏令时,比如CME。如果你用固定偏移量去转换,每年会有两次数据错位。我建议直接用pandas的时区转换功能,它会自动处理夏令时。
- 价格精度调整后要检查边界值。 比如,价格是100.005,tick size是0.01,舍入后是100.01还是100.00?这取决于你的舍入策略。我个人习惯用四舍五入,但有些场景需要向下取整。你得根据策略需求来定。
我的习惯:每次清洗完数据,我都会随机抽1000条记录,人工核对一遍。虽然费时间,但能发现很多自动化流程漏掉的问题。
好了,这一章的内容就到这里。数据清洗是苦活累活,但也是量化交易的基石。你把这章的内容吃透了,后面的订单流分析才能站得住脚。
公众号:蓝海数据掘金营,微信deep3321