2. 数据准备与清洗:交易数据来源、数据质量检查、数据清洗与标准化
做量化交易,有一句话我特别认同:垃圾进,垃圾出。你策略再牛,模型再复杂,底层数据是脏的,结果一定惨不忍睹。我自己就吃过这个亏——刚入行那会儿,拿了一组看似完美的历史 tick 数据跑回测,年化收益高得吓人。结果一查,原来是某天数据里混进了几个异常大的成交单,直接把策略给「骗」了。
所以,数据准备与清洗,不是可有可无的杂活。它是整个交易执行分析的基石。今天我们就来聊聊这块。
2.1 交易数据的主要来源
数据从哪来?说白了就三条路:
- 交易所官方数据:最权威,但贵。比如上交所、深交所的 Level-2 行情,或者 CME 的实时数据。我建议有条件直接走这条路,省心。
- 第三方数据供应商:像 Wind、Bloomberg、聚宽、Tushare 这些。质量参差不齐,但胜在方便。我个人的习惯是,先用免费接口做原型验证,上线前再切到付费数据。
- 自建数据采集:自己写爬虫或者对接 FIX 协议。嗯,这里要注意,维护成本极高。除非你是高频交易团队,否则不推荐。
你想想看,如果数据源本身就错了,后面所有分析都是白搭。所以第一步,先搞清楚你的数据到底是从哪个管道流进来的。
2.2 数据质量检查:别让脏数据毁了你的策略
拿到数据后,别急着算指标。先做质量检查。我一般会检查下面几个维度:
| 检查项 | 说明 | 常见问题 |
|---|---|---|
| 完整性 | 数据是否有缺失?时间戳是否连续? | 节假日、断网导致的数据空洞 |
| 准确性 | 价格、成交量是否在合理范围内? | 价格出现负数、成交量异常大 |
| 一致性 | 不同数据源之间是否对得上? | 同一只股票,A 源和 B 源的收盘价差 0.5% |
| 时效性 | 数据是否是最新的?延迟多少? | 回测用了未来数据,这是大忌 |
我曾经遇到过一个案例:某只股票在 10:30 到 10:31 之间,成交量突然从 100 手飙到 100 万手。一看就是数据录入时多敲了两个零。如果不处理,你的滑点模型会完全失真。
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 源是字符串格式。这时候就需要标准化。
我一般会做这几步:
- 时间戳统一:全部转为 UTC 时间,精确到毫秒。
- 字段命名统一:比如,成交价统一叫
price,成交量统一叫volume。 - 数值精度统一:价格保留 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 知识体系总览
下面这张图,是我自己总结的数据准备与清洗的完整流程。你可以把它当成一个检查清单:
这张图把整个流程串起来了。从数据来源开始,经过质量检查、清洗,最后标准化输出。每一步都不能省。
好了,数据准备与清洗这块就聊到这儿。记住一句话:数据质量决定了你的分析天花板。花时间把数据搞干净,后面所有工作都会顺畅很多。