1. 数据清洗基础:认识量化交易中的脏数据、缺失值处理、重复值检测与删除

做量化交易这些年,我踩过最大的坑,不是策略回测不过,而是数据本身就有问题。你想想看,模型再牛,喂进去的是垃圾,出来的只能是更垃圾。今天咱们就从最基础的数据清洗说起。

1.1 量化交易中的“脏数据”长什么样?

说白了,脏数据就是那些不符合预期的数据。我在项目中遇到过不少奇葩情况,比如某只股票某天的收盘价突然飙到1000万,或者成交量变成负数。这些数据一旦混进回测,你的策略曲线会变得非常“刺激”。

常见的脏数据类型包括:

  • 异常值:价格跳空、成交量突变、买卖价差异常
  • 格式错误:日期格式不统一、数字带逗号或货币符号
  • 逻辑矛盾:开盘价高于最高价、成交量大于流通股本
  • 时间戳错乱:非交易时间出现数据、时间顺序颠倒

核心原则:宁可缺失,不可错误。错误数据比缺失数据更危险,因为它会“悄悄”影响你的统计结果。

1.2 缺失值处理:别急着扔掉

缺失值在金融数据里太常见了。停牌、节假日、数据源故障,都会导致缺失。我个人习惯是,先搞清楚缺失的原因,再决定怎么处理。

1.2.1 缺失值检测

先看看数据到底缺了多少。用Python的pandas可以快速搞定:

import pandas as pd
import numpy as np

# 加载数据
df = pd.read_csv('stock_data.csv')

# 查看每列的缺失数量
print(df.isnull().sum())

# 查看缺失比例
print(df.isnull().mean() * 100)

1.2.2 缺失值处理方法

处理缺失值,我一般按这个优先级来:

  1. 删除法:缺失比例超过50%的列,直接删掉。别心疼,留着也是累赘。
  2. 填充法:缺失比例在5%-50%之间,用前向填充或插值。
  3. 标记法:缺失比例低于5%,可以填充均值/中位数,同时加一个“是否缺失”的标记列。

我的经验:对于时间序列数据,前向填充(ffill)通常比均值填充更合理。因为金融数据有很强的时序相关性,昨天的价格比所有历史均值更有参考价值。

# 前向填充
df['close'].fillna(method='ffill', inplace=True)

# 线性插值
df['volume'].interpolate(method='linear', inplace=True)

# 标记缺失
df['close_missing'] = df['close'].isnull().astype(int)

避坑指南:我曾经在回测时用均值填充了停牌期间的数据,结果策略在停牌复牌后表现异常好——因为填充的均值恰好“预测”了复牌后的走势。嗯,这其实是典型的未来函数问题。停牌期间的数据,千万别用未来信息去填充。

1.3 重复值检测与删除

重复数据在量化交易中很隐蔽。比如同一个交易日的同一只股票,因为数据源重复推送,出现了两条完全一样的数据。或者因为时间精度问题,同一笔交易被记录了两次。

1.3.1 重复值检测

检测重复值,关键是确定“重复”的标准。是全部字段相同才算重复,还是只看关键字段?

# 检测完全重复的行
duplicates = df.duplicated()
print(f"完全重复的行数:{duplicates.sum()}")

# 基于关键字段检测重复(比如股票代码+日期)
key_duplicates = df.duplicated(subset=['stock_code', 'trade_date'])
print(f"关键字段重复的行数:{key_duplicates.sum()}")

1.3.2 重复值处理策略

处理重复值,我一般分三步走:

  • 第一步:查看重复数据的具体内容,判断是数据源问题还是业务逻辑问题。
  • 第二步:如果是完全重复,直接删除。保留第一条即可。
  • 第三步:如果是关键字段重复但其他字段不同,需要进一步分析。比如同一只股票同一天有两条不同的收盘价,那就要去核实哪个才是对的。
# 删除完全重复的行
df.drop_duplicates(inplace=True)

# 基于关键字段保留第一条
df.drop_duplicates(subset=['stock_code', 'trade_date'], keep='first', inplace=True)

重要提醒:删除重复数据前,一定要先备份原始数据。我见过有人删完才发现,那些“重复”数据其实是不同交易所的同一只股票,只是代码不同而已。

1.4 本章知识体系

下面这张图总结了数据清洗的核心流程,你可以把它当作操作手册来用:

数据清洗核心流程 原始数据 异常值检测 缺失值处理 重复值检测 处理方法 • 3σ原则 • IQR方法 处理方法 • 删除法 • 填充法 / 标记法 处理方法 • 完全重复删除 • 关键字段去重 清洗后数据

数据清洗看起来繁琐,但这是量化交易中最值得花时间的一步。我见过太多人花几个月开发策略,却不愿意花一天清洗数据。结果呢?回测曲线漂亮得像假的一样,实盘一跑就崩。

我的习惯:每次拿到新数据,先跑一遍清洗流程,然后把清洗前后的数据做个对比统计。这样既能发现数据问题,也能验证清洗效果。久而久之,你甚至能总结出不同数据源的“脾气秉性”。


公众号:蓝海数据掘金营,微信deep3321