数据采集与预处理:高频数据源、数据清洗、时间对齐、缺失值处理
各位同学,咱们今天聊点实在的。做异常交易行为识别,数据就是咱们的“粮草”。粮草不干净,仗就没法打。我见过太多团队,模型建得花里胡哨,结果数据预处理没做好,上线就崩。所以这一章,咱们把数据采集和预处理这块硬骨头啃下来。
高频数据源:从哪里拿数据?
高频数据,说白了就是“快数据”。它不是每天收盘后的日线,而是每一笔成交、每一次报价的切片。我个人习惯把高频数据源分成三类:
- 交易所Level-2行情:这是最正统的数据源。包含逐笔成交、十档买卖盘口、委托队列等。我建议优先用这个,因为它最权威。
- 第三方数据商:比如万得、聚宽、米筐。它们会把原始数据做清洗和封装,省事。但要注意,有些数据商会有延迟或丢包。
- 自建爬虫:嗯,这个我不太推荐。除非你团队有专门的爬虫工程师,否则维护成本太高。我曾经有个项目,爬虫被反爬机制搞了三次,最后数据还是不全。
你想想看,高频数据每秒可能产生几千条记录。如果数据源本身就有问题,后面所有分析都是白搭。所以第一步,选对数据源。
数据清洗:把脏数据筛出去
数据清洗,说白了就是“去伪存真”。高频数据里常见的脏数据有:
- 重复数据:同一笔交易被记录两次。我遇到过,某数据商在行情波动剧烈时,会重复推送同一笔成交。
- 异常值:比如价格突然变成0,或者成交量突然暴增100倍。这通常是系统bug或网络抖动造成的。
- 字段缺失:比如某条记录没有成交价格,或者没有时间戳。
怎么处理?我一般用三步走:
- 去重:按时间戳+交易ID去重。如果时间戳精确到微秒,基本不会误删。
- 过滤异常:设定价格和成交量的合理范围。比如,价格不能为负,成交量不能超过当日总成交量的1%。
- 标记缺失:不要直接删除缺失字段的记录。先标记,后面再决定是填充还是丢弃。
核心原则:宁可漏掉一条可疑数据,也不要放进来一条脏数据。异常交易识别本身就是找“少数派”,脏数据会严重干扰模型判断。
时间对齐:让不同数据源“对上表”
时间对齐是个大坑。我刚开始做高频分析时,以为时间戳都一样,直接合并就行。结果发现,不同数据源的时间戳精度不一样,有的精确到秒,有的精确到毫秒,还有的是微秒。你想想看,如果两个数据源的时间差了几毫秒,在高频场景下,可能就完全对不上了。
我的做法是:
- 统一时间精度:把所有时间戳都转成毫秒级。如果原始数据是微秒,就取整到毫秒。如果原始数据是秒,就补零到毫秒。
- 建立时间索引:用时间戳作为DataFrame的索引。这样后续的合并、重采样都方便。
- 处理时区:高频数据通常用UTC时间。如果数据源用了本地时间,一定要转成UTC。我曾经因为时区问题,导致回测结果差了整整一个小时。
小技巧:用pandas的pd.to_datetime()统一时间格式,再用set_index()设为索引。这样后续操作会快很多。
缺失值处理:填还是不填?
缺失值处理,是预处理里最考验经验的一环。高频数据里,缺失值很常见。比如某只股票在某个毫秒内没有成交,那这一行的成交量就是空的。
我个人习惯分情况处理:
| 缺失类型 | 处理方法 | 适用场景 |
|---|---|---|
| 连续缺失(<5个) | 线性插值 | 价格、成交量等连续变量 |
| 连续缺失(≥5个) | 前向填充 | 盘口数据,如买卖价差 |
| 随机缺失 | 删除该行 | 非关键字段,如交易ID |
| 大量缺失(>30%) | 丢弃该特征 | 该字段可能不可靠 |
举个例子。假设某只股票在10:00:00.000到10:00:00.004之间没有成交记录。如果缺失只有4个毫秒,我会用线性插值,把价格和成交量补上。但如果缺失了10个毫秒以上,我建议用前向填充,也就是用上一个有效值填充。为什么?因为高频数据里,价格变化很快,线性插值可能引入虚假的中间值。
避坑指南:千万不要对所有缺失值都用同一个方法。我曾经在项目里统一用均值填充,结果把异常交易信号全抹平了。缺失值处理,一定要结合业务场景。
知识体系框架
下面这张图,是我自己总结的数据采集与预处理的核心逻辑。你可以把它当作一个检查清单,每次做数据预处理时,对照着走一遍。
这张图从左到右,从上到下,就是咱们做数据预处理的完整流程。你每次拿到新数据,都可以按这个顺序走一遍。我保证,这样处理出来的数据,模型用起来会顺手很多。
总结一下:数据采集与预处理,没有捷径。选对数据源,洗干净脏数据,对齐时间戳,处理好缺失值。这四步走完,你的数据就基本合格了。剩下的,就是交给模型去挖掘异常交易行为。