VibeTradingVibeTrading
返回博客
Also available inEnglish
TutorialsJuly 16, 202610 min read

AI 交易数据管道详解:从摄取到验证

本文全面解析 AI 交易数据管道:从数据摄取、清洗、特征工程到存储与验证,识别幸存者偏差、前视偏差、数据窥探等常见数据质量问题,并附一段可直接改编用于你自己研究的可运行 Python 示例与最佳实践,是数据工程的入门必修课,还介绍如何用 Parquet 与 SQLite 高效存储时间序列数据。

#ai trading#data pipeline#python#feature engineering
Risk Disclaimer: This content is for educational purposes only. Trading involves significant risk of loss. Past performance does not guarantee future results. Always do your own research before using any trading tool or strategy.

每个 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 回测基础