一、数据预处理概述:为什么需要数据预处理

大家好,我是老蓝。今天开始咱们聊量化因子计算里的数据预处理。

说实话,我见过太多人一上来就急着跑因子、算收益。结果呢?数据一塌糊涂,回测曲线漂亮得不行,实盘一跑就崩。为什么?说白了,数据没洗干净。

数据预处理,就是给原始数据「洗澡」。把脏的、乱的、不靠谱的统统处理掉。你想想看,如果原始数据都是错的,那算出来的因子能靠谱吗?

核心观点:数据预处理不是可有可无的步骤,而是量化策略的「地基」。地基不稳,楼盖得再高也得塌。

1.1 为什么需要数据预处理

我刚开始做量化那会儿,接过一个项目。客户说他们的因子回测年化收益30%+,我一看数据——好家伙,里面有大量未来数据。比如用今天的收盘价去预测今天的涨跌,这能不准吗?但实盘根本没法用。

数据预处理要解决的核心问题有三个:

  • 数据质量差——交易所的数据也会有错误,比如某只股票突然停牌,但数据商没更新
  • 数据格式乱——不同数据源格式不同,有的用日期字符串,有的用时间戳
  • 数据逻辑错——比如前复权价格出现负数,或者成交量突然为0

嗯,这里要注意:预处理不是一次性的工作。每次拿到新数据,都得重新走一遍流程。

1.2 数据预处理的常见问题

咱们一个一个来看。我按踩坑频率排个序:

1. 缺失值

缺失值是最常见的问题。比如某只股票某天停牌了,那天的价格、成交量都是空的。再比如新股上市前,历史数据也是空的。

我在项目中遇到过最离谱的一次:某数据商提供的日线数据,有30%的日期是缺失的。一问才知道,他们只收录了有交易的日期,停牌日直接跳过了。这要是直接拿来算因子,时间序列全乱套。

我的习惯:拿到数据先跑个 df.isnull().sum(),看看缺失值分布。如果某列缺失超过20%,我会直接怀疑这个数据源的质量。

2. 异常值

异常值就是那些明显不合理的数据。比如某只股票一天涨了1000%,或者成交量突然比前一天大了100倍。

为什么会这样?可能是数据录入错误,也可能是除权除息没处理好。我曾经遇到过一个案例:某股票因为送股,价格从100块变成20块,但数据商没做复权处理。结果算出来的收益率曲线,直接多了一个-80%的「暴跌」。

避坑指南:不要一上来就用3σ或者IQR去剔除异常值。先搞清楚异常值产生的原因。如果是除权除息导致的,应该做复权处理,而不是直接剔除。

3. 重复值

重复值看起来简单,但坑也不少。比如同一只股票在同一天出现了两条记录,价格还不一样。

我记得有一次,我跑一个多因子模型,结果发现某只股票的因子值突然跳变。查了半天,原来是数据源里有一条重复记录,导致我算均值的时候被「加权」了。

处理重复值,我一般用 df.drop_duplicates(),但要注意指定判断重复的列。比如股票代码+日期,才是唯一标识。

4. 量纲不一致

量纲问题在因子计算里特别常见。比如有的因子是收益率(0.01这种小数),有的因子是市盈率(几十到几百),还有的因子是市值(几十亿到几万亿)。

你想想看,如果直接把这些因子扔进模型,市值大的因子会主导结果,收益率这种小数值的因子基本没影响。这显然不合理。

处理量纲不一致,常用的方法有标准化(Z-score)和归一化(Min-Max)。我个人习惯用标准化,因为它对异常值不那么敏感。

问题类型 常见原因 处理方法
缺失值 停牌、新股、数据缺失 填充、插值、删除
异常值 数据错误、除权除息 截尾、缩尾、复权
重复值 数据源重复、合并错误 去重、保留最新
量纲不一致 不同因子单位不同 标准化、归一化

1.3 数据预处理在量化投资中的重要性

说个真实案例吧。2018年,我帮一家私募做因子库。他们之前用的数据,预处理只做了最基础的缺失值填充。结果呢?回测的时候因子表现很好,但实盘跑了一年,收益还不如沪深300。

后来我仔细查了他们的数据,发现几个问题:

  • 前复权价格用的是「向后复权」,导致历史价格不断变化
  • 停牌日的数据直接填充了前一天的数值,相当于「无交易」变成了「价格不变」
  • 异常值只做了3σ剔除,但有些极端行情(比如2015年股灾)被误删了

这些问题单独看都不大,但叠加在一起,因子信号就完全失真了。

所以我说,数据预处理不是「锦上添花」,而是「雪中送炭」。没有干净的数据,再牛的模型也是白搭。

总结一下:数据预处理占整个量化流程的60%以上的时间。别嫌麻烦,这一步做扎实了,后面的因子计算、回测、实盘都会顺很多。

1.4 本章知识体系

下面这张图,是我自己画的数据预处理知识框架。你可以把它当成一个「检查清单」,每次处理数据时对照着来:

数据预处理知识框架 原始数据 缺失值处理 异常值检测 重复值去重 量纲标准化 向前填充 插值法 删除缺失行 3σ法则 IQR四分位法 业务规则判断 完全重复删除 部分重复合并 Z-score标准化 Min-Max归一化 排名百分位 图:数据预处理四大核心模块及常用方法

这张图我画了好几次才满意。你看,从原始数据出发,分四条路走:缺失值、异常值、重复值、量纲。每条路下面又有具体的处理方法。做预处理的时候,就按这个框架来,基本不会漏掉什么。

一个小建议:刚开始做预处理的时候,别想着一步到位。先跑通流程,再慢慢优化。我当年就是太追求完美,结果一个预处理写了三天,最后发现有个逻辑错误,又得重来。

好了,第一章就聊到这儿。数据预处理这事儿,说难不难,说简单也不简单。关键是要有耐心,把每一步都做扎实。后面几章,咱们会一个一个模块深入讲,包括具体的代码实现和实战案例。


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