4、数据清洗基础:缺失值处理、异常值检测、去重、格式统一、时间戳对齐、数据质量评估

在另类数据处理与投资信号提取的实战流程中,数据清洗往往占据整个项目 60% 以上的时间。另类数据(如卫星影像、电商订单、物流轨迹、舆情文本、信用卡消费流水等)天生具有高噪声、非结构化、多源异构的特征。若未经清洗直接进入信号提取环节,轻则降低策略夏普比率,重则产生虚假相关性导致实盘亏损。本章将系统拆解数据清洗的六大核心模块:缺失值处理、异常值检测、去重、格式统一、时间戳对齐与数据质量评估,并给出可直接落地的判断路径与工程化方法。

数据清洗六大模块工程链路 多源原始数据 卫星/电商/舆情/物流 ① 缺失值处理 删除/均值/中位数 插值/模型预测 缺失率阈值判断 ② 异常值检测 3σ / IQR / MAD 孤立森林 / DBSCAN 业务规则校验 ③ 去重 完全去重 / 模糊去重 时间窗口去重 业务主键定义 ④ 格式统一 单位/编码/日期格式 数值类型转换 文本标准化 清洗中间层 标准化DataFrame ⑤ 时间戳对齐 重采样 / 插值对齐 时区统一 / 交易日历 前向/后向填充 ⑥ 数据质量评估 完整性/准确性/一致性 及时性/唯一性 质量评分卡 高质量数据集 可直接用于信号提取 质量评估不达标 → 回溯清洗环节迭代优化 图:数据清洗六大模块工程链路与反馈机制

上图展示了数据清洗的完整工程链路:多源原始数据依次经过缺失值处理、异常值检测、去重、格式统一四大基础模块后,进入时间戳对齐与数据质量评估环节。质量评估结果不达标时,需要回溯至对应模块进行迭代优化。下面逐一展开每个模块的核心原理、操作流程与实战要点。

4.1 缺失值处理:从“忽略”到“决策”

核心原理

缺失值并非简单的“空值”,其产生机制决定了处理策略。按缺失机制可分为三类:完全随机缺失(MCAR)、随机缺失(MAR)与非随机缺失(MNAR)。MCAR 指缺失与任何变量无关,可直接删除或简单填充;MAR 指缺失与其他已观测变量相关,需用模型预测填充;MNAR 指缺失与缺失值本身相关,处理最为棘手,需引入外部信息或业务假设。在另类数据场景中,卫星影像因云层遮挡导致的缺失属于 MNAR,而传感器临时故障导致的缺失多为 MCAR。

判断方法与操作流程

  1. 缺失率诊断:计算每个字段的缺失比例。缺失率 < 5% 且为 MCAR 时,可直接删除缺失样本;缺失率在 5%-20% 之间,建议使用填充策略;缺失率 > 20% 时,需评估该字段的业务价值,考虑删除字段或引入代理变量。
  2. 缺失机制判断:通过 t 检验或卡方检验比较“有缺失组”与“无缺失组”在其他变量上的差异。若差异显著,则倾向于 MAR 或 MNAR。
  3. 填充策略选择:数值型字段优先使用中位数(抗异常值干扰)或线性插值;时间序列数据使用前向填充(ffill)或后向填充(bfill);分类字段使用众数填充;高维数据可使用 KNN 或随机森林回归预测填充。
  4. 缺失指示变量:对于有业务含义的缺失(如“未交易”与“数据丢失”),建议额外生成 is_missing 指示变量,保留缺失本身的信息量。
经验提醒:在投资信号提取中,缺失值填充务必避免“未来函数”。例如,使用未来数据计算出的均值填充当前缺失值,会造成前视偏差(Look-ahead Bias),导致回测结果虚高。填充时只能使用截至当前时刻的历史数据。

案例拆解:电商高频数据缺失处理

某量化团队获取某电商平台每日商品销量数据,用于构建消费景气度信号。原始数据中,约 12% 的“销量”字段缺失。初步诊断发现:缺失主要集中在周末及大型促销活动期间。进一步分析显示,周末缺失与平台系统维护相关(MCAR),而促销期间缺失与高并发写入失败相关(MNAR)。处理方案:对周末缺失使用前后 7 日同类型日(工作日/周末)的中位数填充;对促销期缺失,引入“促销活动虚拟变量”作为辅助特征,使用随机森林回归预测填充。最终,信号与社零总额的相关系数从 0.31 提升至 0.47,且回测中未出现前视偏差。

常见误区与复盘

  • 误区一:所有缺失值一律用均值填充。这会压缩数据方差,削弱信号区分度。
  • 误区二:忽略缺失的时空分布。若缺失集中在特定时段(如每年 1 月),填充后可能引入季节性伪信号。
  • 复盘要点:每次填充后,应对比填充前后数据的分布形态(均值、方差、分位数),确保填充未破坏原始分布特征。

4.2 异常值检测:区分“噪声”与“信号”

核心原理

异常值在另类数据中具有双重身份:可能是传感器故障或录入错误产生的噪声,也可能是极端市场事件(如黑天鹅)或真实异常行为(如大额资金异动)的宝贵信号。因此,异常值检测的核心不是“删除”,而是“识别与标注”。检测方法分为三类:统计方法(3σ、IQR、MAD)、距离与密度方法(DBSCAN、LOF)、树模型与集成方法(孤立森林、随机森林)。

判断方法与操作流程

方法 适用场景 关键参数 优缺点
3σ 原则 近似正态分布的单变量数据 σ 倍数(通常 3) 简单快速;对非正态分布失效
IQR 法 偏态分布、含离群点的数据 1.5×IQR 或 3×IQR 稳健;对样本量敏感
MAD 法 含强离群点的数据 中位数偏差 比 3σ 更稳健;计算稍复杂
孤立森林 高维数据、无监督场景 树数量、采样比例 线性复杂度;需调参
DBSCAN 密度分布不均的数据 ε 邻域、MinPts 可发现任意形状簇;参数敏感

实战场景:物流轨迹数据异常识别

在基于物流卡车 GPS 轨迹的供应链信号项目中,原始数据包含经纬度、速度、方向角等字段。初始使用 3σ 法检测速度异常,发现大量“瞬时速度超过 120km/h”的记录。但进一步核查发现,部分异常源于 GPS 漂移(噪声),而另一部分则对应真实的高速公路超车行为(信号)。处理策略:结合加速度(前后两点速度差/时间差)进行二次判断——若加速度超过 5m/s² 且持续时间小于 3 秒,判定为 GPS 漂移并剔除;若加速度持续超过阈值,则标记为“异常驾驶事件”并保留。最终,该异常事件频率与物流公司季度营收增速的领先相关性达到 0.62。

风险提示:在金融另类数据中,异常值往往是重大投资信号的起点。例如,某只股票在盘前出现远超日均水平的异常大单,可能是机构调仓的前兆。因此,除非有确凿证据表明是数据错误,否则不建议直接删除异常值,而应单独建表存储并打上标签。

常见误区与总结

  • 误区一:对全量数据统一使用一种检测方法。应分字段、分时段、分业务场景选择合适方法。
  • 误区二:只检测单变量异常,忽略多变量组合异常(如“高销量+低库存”组合)。
  • 总结:异常值检测的产出物应包含三部分——异常值列表、异常原因初步判断、处理建议(删除/修正/保留标注)。

4.3 去重:定义“唯一性”的业务边界

核心原理

去重并非简单的“删除重复行”,而是基于业务语义定义唯一键(Primary Key)。在另类数据中,常见重复类型包括:完全重复(所有字段相同)、关键字段重复(如相同时间戳+相同股票代码)、近似重复(如文本内容高度相似但略有差异)。去重策略直接影响数据量级与信号质量。

操作流程

  1. 定义唯一键:根据业务逻辑确定唯一标识。例如,行情数据唯一键为(时间戳, 股票代码);舆情数据唯一键为(新闻ID, 发布时间)。
  2. 完全去重:使用 DataFrame.drop_duplicates() 按唯一键去重,保留第一条或最后一条记录。
  3. 近似去重:对文本类数据使用 SimHash 或 MinHash 计算相似度,设定阈值(如相似度 > 0.85 视为重复)。
  4. 时间窗口去重:对于高频数据,若同一事件在 1 秒内被多次上报,仅保留第一条。

案例拆解:舆情数据去重

某团队抓取财经新闻用于构建市场情绪指标。原始数据中,同一篇新闻被多个源站转载,导致重复率高达 35%。若直接按标题去重,会遗漏不同源站的差异化编辑内容;若完全不去重,则会放大特定媒体的影响力。解决方案:采用“标题 SimHash 相似度 > 0.9 + 发布时间差 < 24 小时”的双重条件判定重复,保留源站权重最高的版本。去重后,情绪指标与沪深 300 次日收益的相关系数从 0.12 提升至 0.19,且策略换手率下降 22%。

常见误区

  • 误区一:盲目使用全部字段去重,导致同一业务实体的多条记录被误删。
  • 误区二:忽略时间维度。例如,同一股票在 09:30:00.000 与 09:30:00.500 的两笔成交不应视为重复。

4.4 格式统一:让数据“说同一种语言”

核心原理

多源数据在单位、编码、日期格式、数值精度、文本大小写等方面存在天然差异。格式统一的目标是建立标准化的数据字典与转换规则,确保后续特征提取时无需重复处理。关键维度包括:数值格式(整数/浮点/科学计数)、日期时间格式(YYYY-MM-DD vs MM/DD/YYYY)、单位统一(美元/人民币、吨/千克)、文本编码(UTF-8/GBK)、分类标签(“男/女” vs “M/F”)。

操作流程

# 示例:日期格式统一与单位转换
import pandas as pd

# 统一日期格式
df['date'] = pd.to_datetime(df['date'], format='mixed', dayfirst=False)

# 单位转换:将美元转换为人民币(假设汇率 7.2)
df['amount_cny'] = df['amount_usd'] * 7.2

# 文本标准化:统一大小写与去除空格
df['title'] = df['title'].str.strip().str.lower()

# 分类标签映射
df['gender'] = df['gender'].map({'M': 'male', 'F': 'female', '男': 'male', '女': 'female'})

实战场景:多源卫星数据格式统一

在卫星遥感数据中,不同卫星(如 Sentinel-1 与 Landsat-8)的影像分辨率、投影坐标系、辐射定标参数均不同。若直接拼接使用,会导致信号失真。处理流程:统一重采样至 10m 分辨率 → 转换至 WGS84 坐标系 → 辐射定标转换为反射率 → 统一存储为 GeoTIFF 格式。格式统一后,NDVI(归一化植被指数)信号与农产品期货价格的相关系数稳定性显著提升。

常见误区

  • 误区一:忽略隐式格式差异。例如,某些数据源将“20240101”存储为整数,而另一些存储为字符串。
  • 误区二:在清洗阶段过早进行聚合或降采样,导致后续分析灵活性下降。

4.5 时间戳对齐:构建统一时间轴

核心原理

另类数据的时间粒度差异巨大:行情数据精确到微秒,舆情数据精确到秒,卫星影像通常为日频或周频。时间戳对齐的目标是将多源数据映射到统一的时间轴上,以便进行特征拼接与信号计算。对齐方式包括:内连接(仅保留共同时间点)、左连接(以主数据时间轴为准)、重采样(升采样/降采样)、前向/后向填充。

操作流程

场景 推荐方法 注意事项
高频行情 + 日频舆情 舆情数据降采样至日频,或行情数据升采样至日频 避免引入未来信息,舆情应使用当日已发布数据
周频卫星 + 日频价格 卫星数据前向填充至日频 填充后需添加“数据日期”字段,区分实际观测日与填充日
跨时区数据 统一转换为 UTC 或交易所本地时间 注意夏令时切换,使用 pytz 或 zoneinfo 库

案例拆解:卫星与行情数据对齐

某团队利用夜间灯光卫星数据预测区域经济活跃度,进而构建大宗商品需求信号。卫星数据为月频,而商品期货为日频。对齐方案:将卫星数据前向填充至日频,并生成“距上次观测天数”特征。回测发现,若不添加该特征,模型会错误地将填充值视为真实观测值,导致信号衰减;添加后,策略年化收益提升 3.2 个百分点。

关键原则:时间戳对齐的核心是“不引入未来信息”。任何填充或重采样操作,只能使用截至当前时刻的数据。建议在代码中显式检查:assert df.index.is_monotonic_increasing,确保时间轴单调递增。

4.6 数据质量评估:量化“干净”的程度

核心原理

数据质量评估是清洗工作的收尾环节,也是建立数据信任度的关键。评估维度包括:完整性(缺失率)、准确性(与真实值或权威源的偏差)、一致性(同一实体在不同字段或不同表中的逻辑统一)、及时性(数据延迟)、唯一性(重复率)。建议建立数据质量评分卡,对每个字段打分并生成报告。

评估指标体系

  • 完整性得分 = 1 - 缺失率,目标 > 0.95
  • 准确性得分 = 抽样比对准确率,目标 > 0.98
  • 一致性得分 = 1 - 逻辑冲突率,目标 > 0.99
  • 及时性得分 = 按时到达的数据量 / 总数据量,目标 > 0.90
  • 唯一性得分 = 1 - 重复率,目标 > 0.99

操作流程

  1. 自动化检查:编写数据质量检查脚本,每日运行并输出报告。
  2. 阈值告警:当完整性得分低于 0.90 或准确性得分低于 0.95 时,触发告警并暂停信号更新。
  3. 人工抽检:每周随机抽取 100 条记录进行人工核对,验证自动化检查的准确性。
  4. 质量回溯:将质量评分与策略收益进行相关性分析,找出“低质量数据导致信号失效”的具体环节。

总结复盘

数据清洗不是一次性的“预处理”,而是贯穿数据管线全生命周期的持续过程。建议建立“清洗规则库”,将每次处理逻辑(如缺失值填充方法、异常值判定阈值)版本化管理,便于回溯与复现。同时,清洗规则的变更必须经过回测验证,避免因清洗逻辑调整导致策略表现变化而无法归因。

最终提醒:在投资信号提取中,数据清洗的终极目标不是“数据完美”,而是“信号可靠”。过度清洗(如删除所有异常值)可能抹去真实的市场信号;清洗不足则会让噪声主导模型。建议在清洗后保留一份“原始数据 + 清洗日志”的完整链路,确保任何信号都可追溯至原始数据。