数据采集与预处理:高频数据源、数据清洗、时间对齐、缺失值处理

各位同学,咱们今天聊点实在的。做异常交易行为识别,数据就是咱们的“粮草”。粮草不干净,仗就没法打。我见过太多团队,模型建得花里胡哨,结果数据预处理没做好,上线就崩。所以这一章,咱们把数据采集和预处理这块硬骨头啃下来。

高频数据源:从哪里拿数据?

高频数据,说白了就是“快数据”。它不是每天收盘后的日线,而是每一笔成交、每一次报价的切片。我个人习惯把高频数据源分成三类:

  • 交易所Level-2行情:这是最正统的数据源。包含逐笔成交、十档买卖盘口、委托队列等。我建议优先用这个,因为它最权威。
  • 第三方数据商:比如万得、聚宽、米筐。它们会把原始数据做清洗和封装,省事。但要注意,有些数据商会有延迟或丢包。
  • 自建爬虫:嗯,这个我不太推荐。除非你团队有专门的爬虫工程师,否则维护成本太高。我曾经有个项目,爬虫被反爬机制搞了三次,最后数据还是不全。

你想想看,高频数据每秒可能产生几千条记录。如果数据源本身就有问题,后面所有分析都是白搭。所以第一步,选对数据源。

数据清洗:把脏数据筛出去

数据清洗,说白了就是“去伪存真”。高频数据里常见的脏数据有:

  • 重复数据:同一笔交易被记录两次。我遇到过,某数据商在行情波动剧烈时,会重复推送同一笔成交。
  • 异常值:比如价格突然变成0,或者成交量突然暴增100倍。这通常是系统bug或网络抖动造成的。
  • 字段缺失:比如某条记录没有成交价格,或者没有时间戳。

怎么处理?我一般用三步走:

  1. 去重:按时间戳+交易ID去重。如果时间戳精确到微秒,基本不会误删。
  2. 过滤异常:设定价格和成交量的合理范围。比如,价格不能为负,成交量不能超过当日总成交量的1%。
  3. 标记缺失:不要直接删除缺失字段的记录。先标记,后面再决定是填充还是丢弃。

核心原则:宁可漏掉一条可疑数据,也不要放进来一条脏数据。异常交易识别本身就是找“少数派”,脏数据会严重干扰模型判断。

时间对齐:让不同数据源“对上表”

时间对齐是个大坑。我刚开始做高频分析时,以为时间戳都一样,直接合并就行。结果发现,不同数据源的时间戳精度不一样,有的精确到秒,有的精确到毫秒,还有的是微秒。你想想看,如果两个数据源的时间差了几毫秒,在高频场景下,可能就完全对不上了。

我的做法是:

  • 统一时间精度:把所有时间戳都转成毫秒级。如果原始数据是微秒,就取整到毫秒。如果原始数据是秒,就补零到毫秒。
  • 建立时间索引:用时间戳作为DataFrame的索引。这样后续的合并、重采样都方便。
  • 处理时区:高频数据通常用UTC时间。如果数据源用了本地时间,一定要转成UTC。我曾经因为时区问题,导致回测结果差了整整一个小时。

小技巧:用pandas的pd.to_datetime()统一时间格式,再用set_index()设为索引。这样后续操作会快很多。

缺失值处理:填还是不填?

缺失值处理,是预处理里最考验经验的一环。高频数据里,缺失值很常见。比如某只股票在某个毫秒内没有成交,那这一行的成交量就是空的。

我个人习惯分情况处理:

缺失类型 处理方法 适用场景
连续缺失(<5个) 线性插值 价格、成交量等连续变量
连续缺失(≥5个) 前向填充 盘口数据,如买卖价差
随机缺失 删除该行 非关键字段,如交易ID
大量缺失(>30%) 丢弃该特征 该字段可能不可靠

举个例子。假设某只股票在10:00:00.000到10:00:00.004之间没有成交记录。如果缺失只有4个毫秒,我会用线性插值,把价格和成交量补上。但如果缺失了10个毫秒以上,我建议用前向填充,也就是用上一个有效值填充。为什么?因为高频数据里,价格变化很快,线性插值可能引入虚假的中间值。

避坑指南:千万不要对所有缺失值都用同一个方法。我曾经在项目里统一用均值填充,结果把异常交易信号全抹平了。缺失值处理,一定要结合业务场景。

知识体系框架

下面这张图,是我自己总结的数据采集与预处理的核心逻辑。你可以把它当作一个检查清单,每次做数据预处理时,对照着走一遍。

数据采集与预处理核心流程 高频数据源 第三方数据商 自建爬虫 数据清洗 去重 → 过滤异常值 → 标记缺失字段 时间对齐 统一时间精度 → 建立时间索引 → 处理时区 缺失值处理 线性插值 / 前向填充 / 删除行 / 丢弃特征

这张图从左到右,从上到下,就是咱们做数据预处理的完整流程。你每次拿到新数据,都可以按这个顺序走一遍。我保证,这样处理出来的数据,模型用起来会顺手很多。

总结一下:数据采集与预处理,没有捷径。选对数据源,洗干净脏数据,对齐时间戳,处理好缺失值。这四步走完,你的数据就基本合格了。剩下的,就是交给模型去挖掘异常交易行为。

蓝海数据掘金营,专注资料整理