AI 交易数据管道详解:从摄取到验证
本文全面解析 AI 交易数据管道:从数据摄取、清洗、特征工程到存储与验证,识别幸存者偏差、前视偏差、数据窥探等常见数据质量问题,并附一段可直接改编用于你自己研究的可运行 Python 示例与最佳实践,是数据工程的入门必修课,还介绍如何用 Parquet 与 SQLite 高效存储时间序列数据。
每个 AI 交易策略都从数据开始。无论模型多么复杂,垃圾数据只会产生垃圾信号。一个设计良好的数据管道,能把可靠策略与那些纸上漂亮、实盘崩塌的回测区分开来。
在本教程中,我们将完整走过 AI 交易数据管道——摄取、清洗、特征工程、存储和验证——并提供一段可以改编用于你自己研究的 Python 代码。
数据摄取
摄取是把原始数据拉入系统的过程。对散户交易者来说,最常见来源是免费价格 API(如 yfinance)、券商 API(如 Alpaca)以及量化平台(如 OpenBB)。某些策略还会使用另类数据:财报日历、新闻情绪、社交媒体活跃度或链上指标。
关键决策是粒度。长期股票策略可能只需要日 K 线,而高频加密货币策略则需要逐笔或订单簿数据。更高频率意味着更高的存储和清洗成本,因此让数据匹配你的持仓周期。
如果你正在搭建第一个技术栈,可以参考我们的 最小可用 Python 交易技术栈 指南,了解需要用到的库。
数据清洗
原始市场数据很少是干净的。你会遇到交易所 outage 导致的缺失 K 线、重复时间戳、坏 tick 导致的可疑跳价,以及与公司行为不一致的复权价格。清洗就是在数据进入模型前修复这些问题。
一个简单的清洗清单包括:删除重复时间戳、仅在经济学上合理时才前向填充、以及标记超过合理标准差的异常值。切勿盲目插值价格数据,因为一根缺失 K 线可能携带流动性信息。
特征工程
特征工程把原始价格转化为模型可理解的信号。常见例子包括移动均线、不同时间尺度的收益、波动率估计、成交量比率,以及 RSI、MACD 等技术指标。
最重要的规则是因果性:每个特征都必须在做出决策的那一刻可计算。如果你用当前 K 线的收盘价来预测同一根 K 线的收益,就引入了前视偏差。应把目标向前平移,或基于前一根 K 线计算特征。
数据存储
高效的存储让迭代更快。小项目用 CSV 或 SQLite 即可。规模扩大后,Parquet 等列式格式能减少磁盘占用和加载时间。按标的和日期分区,这样只需加载需要的部分。
实盘交易中,存储层需要同时支持历史批量查询和低延迟更新。很多散户系统采用混合方案:研究用 Parquet,最新 K 线用内存缓存。
数据验证
验证是质量关卡。在模型看到数据之前,先验证时间戳单调递增、标的完整、价格列为正、特征分布合理。自动化断言能尽早发现静默 bug。
稳健的管道还应包含样本外划分和滚动验证。用 2020-2023 年训练、2024 年测试,比随机打乱更好,因为市场有记忆,且机制会切换。
一段简单的 Python 管道
import yfinance as yf
import pandas as pd
# 1. 摄取
raw = yf.download("AAPL", start="2020-01-01", end="2024-01-01")
# 2. 清洗
df = raw.copy()
df = df.dropna()
df = df[~df.index.duplicated(keep="last")]
# 3. 特征工程
df["returns"] = df["Close"].pct_change()
df["sma_20"] = df["Close"].rolling(window=20).mean()
df["volatility"] = df["returns"].rolling(window=20).std()
df["target"] = (df["Close"].shift(-5) > df["Close"]).astype(int)
# 4. 验证
assert df["Close"].isnull().sum() == 0
assert df.index.is_monotonic_increasing
assert (df["Close"] > 0).all()
# 5. 存储
df.to_parquet("aapl_features.parquet")这段代码下载苹果日 K 数据,删除缺失和重复行,构建一组简单特征,验证结果,并写入 Parquet。它不是生产级别的——没有日志、模式约束或单元测试——但抓住了核心思想。如果你想在中国市场实践,逻辑同样适用于 A 股或港股数据,只需把数据源替换为对应接口。
常见数据质量问题
即使经验丰富的构建者也会遇到以下问题。
| 问题 | 症状 | 解决方法 |
|---|---|---|
| 前视偏差 | 回测收益好得不真实 | 使用时点特征和平移后的目标 |
| 幸存者偏差 | 策略看起来很好,因为退市亏损股缺失 | 包含历史成分股 |
| 重复时间戳 | 回测资金曲线出现神秘跳变 | 去重并断言单调性 |
| 坏 tick | 价格出现异常尖刺 | 用标准差或交易所标识过滤异常值 |
| 公司行为 | 价格看起来不一致 | 统一使用拆分/分红复权数据 |
| 缺失 K 线 | 市场压力期间出现缺口 | 标记而非盲目填充 |
总结
干净的数据管道是 AI 交易背后无名英雄。它能保护你免受前视偏差、幸存者偏差和静默数据 bug 的侵害,否则这些都会污染模型。在担心模型架构之前,先投资于摄取、清洗、特征工程、存储和验证。世界上最棒的模型也救不了糟糕的数据。
管道稳定后,下一步就是把它接入一个简单的机器人。我们的 第一篇 AI 交易机器人:EMA 交叉与 Alpaca 指南展示了如何在模拟盘中实现。
Related reading: 最小可用 Python 交易技术栈 | 第一篇 AI 交易机器人:EMA 交叉与 Alpaca | Backtrader 回测基础