数据清洗是量化策略落地的首要关卡,需分三层处理:硬规则校验(时间单调、OHLC合理、成交量非负)、业务逻辑修复(复权、主力合约拼接)、一致性对齐(交易日历重采样),并用代码实现去重插值与有效性标记。

数据清洗不是“修修补补”,而是量化策略能否跑通的第一道生死线。脏数据进,垃圾信号出——再精妙的模型也救不了错的价格、漏的日期、乱的字段。
识别高频脏数据类型
实盘中80%以上的清洗工作围绕这几类展开:
- 时间戳错乱:分钟级数据里出现重复时间、跳变(如10:01→10:05→10:02)、跨日未对齐(夜盘合约常见)
- 价格异常值:涨停/跌停瞬间的假突破、交易所临时修正导致的跳空、除权除息未复权引发的断层
- 缺失与填充失当:用0或前向填充代替停牌/休市的真实空缺,会误导波动率和成交量逻辑
- 字段错位与格式混杂:CSV里某列突然从float变成string(如“N/A”混入数值列),或日期写成“2023-01-01”和“2023/01/01”并存
清洗不是一步到位,而是分层过滤
把清洗拆成“硬规则校验→业务逻辑修复→一致性对齐”三层,避免一刀切误伤:
- 硬规则层:强制检查时间单调递增、OHLC合理性(High ≥ Open/Close ≥ Low)、成交量≥0。不满足直接标为待查,不自动删改
- 业务修复层:针对A股用前复权价替换原始收盘;期货主力合约切换时,用滚动拼接+价差调整替代简单拼接
- 对齐层:多品种/多周期数据合并前,统一用交易日历(非自然日历)重采样,确保沪深300和国债期货在同一天都有有效值
用代码守住清洗底线(Python示例)
别依赖Excel手动处理。以下三段是核心守门代码,加进你的data_loader里即可生效:
- 时间去重+插值占位:df = df.drop_duplicates(subset=['datetime']).set_index('datetime').asfreq('1T', method='pad')
- OHLC硬校验标记:df['is_valid'] = (df['high'] >= df['open']) & (df['high'] >= df['close']) & (df['low']
- 成交量突变预警:df['vol_zscore'] = (df['volume'] - df['volume'].rolling(20).mean()) / df['volume'].rolling(20).std() # 超±5倍标准差标黄
清洗结果必须可验证、可回溯
每次清洗后生成两个东西:
- 一份清洗报告:统计删除/修正的行数、各字段空值率变化、异常值分布图(用matplotlib直方图比数字更直观)
- 一个原始快照索引:保留原始文件哈希值 + 每行清洗操作日志(如“2023-07-12 14:32:00 → high由12.45修正为12.38,依据前后5分钟均值”)
这样下次策略回测结果异常,3分钟就能定位是数据问题还是逻辑问题。
基本上就这些。清洗没有银弹,但有铁律:宁可少数据,不可错数据;宁可慢一点,不可绕过去。










