2. 数据准备与清洗:交易数据来源、数据质量检查、数据清洗与标准化

做量化交易,有一句话我特别认同:垃圾进,垃圾出。你策略再牛,模型再复杂,底层数据是脏的,结果一定惨不忍睹。我自己就吃过这个亏——刚入行那会儿,拿了一组看似完美的历史 tick 数据跑回测,年化收益高得吓人。结果一查,原来是某天数据里混进了几个异常大的成交单,直接把策略给「骗」了。

所以,数据准备与清洗,不是可有可无的杂活。它是整个交易执行分析的基石。今天我们就来聊聊这块。

核心观点: 数据清洗占掉整个量化项目 60% 以上的时间,一点都不夸张。别想着跳过,老老实实做。

2.1 交易数据的主要来源

数据从哪来?说白了就三条路:

  • 交易所官方数据:最权威,但贵。比如上交所、深交所的 Level-2 行情,或者 CME 的实时数据。我建议有条件直接走这条路,省心。
  • 第三方数据供应商:像 Wind、Bloomberg、聚宽、Tushare 这些。质量参差不齐,但胜在方便。我个人的习惯是,先用免费接口做原型验证,上线前再切到付费数据。
  • 自建数据采集:自己写爬虫或者对接 FIX 协议。嗯,这里要注意,维护成本极高。除非你是高频交易团队,否则不推荐。

你想想看,如果数据源本身就错了,后面所有分析都是白搭。所以第一步,先搞清楚你的数据到底是从哪个管道流进来的。

2.2 数据质量检查:别让脏数据毁了你的策略

拿到数据后,别急着算指标。先做质量检查。我一般会检查下面几个维度:

检查项 说明 常见问题
完整性 数据是否有缺失?时间戳是否连续? 节假日、断网导致的数据空洞
准确性 价格、成交量是否在合理范围内? 价格出现负数、成交量异常大
一致性 不同数据源之间是否对得上? 同一只股票,A 源和 B 源的收盘价差 0.5%
时效性 数据是否是最新的?延迟多少? 回测用了未来数据,这是大忌

我曾经遇到过一个案例:某只股票在 10:30 到 10:31 之间,成交量突然从 100 手飙到 100 万手。一看就是数据录入时多敲了两个零。如果不处理,你的滑点模型会完全失真。

小技巧: 写一个简单的「合理性校验」脚本。比如,价格不能为负,成交量不能超过当日总流通盘的 10%。跑一遍,异常数据就全出来了。

2.3 数据清洗:把脏东西筛出去

检查完了,就该动手洗了。数据清洗,说白了就是三件事:去重、补缺、纠错

2.3.1 去重

同一个时间戳出现两条一模一样的数据?直接删掉。我习惯用 pandas 的 drop_duplicates(),但要注意,别把不同交易所的同一笔交易误删了。

2.3.2 补缺

缺失值怎么处理?分情况:

  • 时间序列数据:用前向填充(ffill)或者插值。比如,某分钟没有成交,就用上一分钟的收盘价。
  • 截面数据:用均值、中位数填充,或者干脆删除该样本。

我个人不太建议用太复杂的插值方法。你想想看,市场数据本身就有噪音,强行「猜」一个值出来,反而可能引入偏差。

2.3.3 纠错

价格跳空、成交量异常、买卖价差为负……这些都得修。举个例子:

# 一个简单的价格异常检测
import pandas as pd

def detect_price_anomaly(df, column='close', threshold=0.05):
    # 计算价格变化率
    df['pct_change'] = df[column].pct_change()
    # 标记变化超过 5% 的点
    anomalies = df[abs(df['pct_change']) > threshold]
    return anomalies

这段代码很基础,但够用。实际项目中,我会把阈值设成动态的,比如基于过去 20 天的标准差。

注意: 纠错不是让你「美化」数据。如果某笔交易确实就是异常(比如乌龙指),你应该保留它,但打上标签。因为回测时,这种极端事件恰恰是检验策略鲁棒性的好机会。

2.4 数据标准化:让不同来源的数据能「对话」

数据洗完了,但不同来源的数据格式可能不一样。比如,A 源的时间戳是 Unix 毫秒,B 源是字符串格式。这时候就需要标准化。

我一般会做这几步:

  1. 时间戳统一:全部转为 UTC 时间,精确到毫秒。
  2. 字段命名统一:比如,成交价统一叫 price,成交量统一叫 volume
  3. 数值精度统一:价格保留 4 位小数,成交量保留整数。
  4. 除权除息调整:复权处理,不然历史价格会失真。

举个例子,标准化前后的对比:

字段 标准化前(源A) 标准化前(源B) 标准化后
时间 2024-01-01 09:30:00 1704061800 2024-01-01 01:30:00 UTC
价格 100.5 100.5000 100.5000
成交量 1,000 1000.0 1000

标准化这一步,说白了就是定规矩。规矩定好了,后面所有模块才能顺畅对接。

2.5 知识体系总览

下面这张图,是我自己总结的数据准备与清洗的完整流程。你可以把它当成一个检查清单:

交易数据准备与清洗流程 数据来源 数据质量检查 数据清洗 交易所官方 第三方供应商 自建采集 完整性检查 准确性检查 一致性检查 去重 补缺 纠错 数据标准化(时间、字段、精度、复权) 输出:干净、标准化的交易数据集

这张图把整个流程串起来了。从数据来源开始,经过质量检查、清洗,最后标准化输出。每一步都不能省。

我的建议: 把数据清洗流程写成脚本,每次拿到新数据就自动跑一遍。别手动处理,人总会犯错。自动化才是王道。

好了,数据准备与清洗这块就聊到这儿。记住一句话:数据质量决定了你的分析天花板。花时间把数据搞干净,后面所有工作都会顺畅很多。

专注资料整理