
blog 高级 · ~1 min read
交易数据:来源与清洗
策略好不好取决于背后的数据。学从哪拿交易数据、什么让它脏、怎么在回测前清洗。
#algorithmic#quant-trading
本文为英文。需要查看中文翻译吗?
交互工具在翻译视图中可能无法使用。
交易数据:来源与清洗
垃圾进,垃圾出。每个回测的可信度只跟底下的数据一样。
任何信号、任何模型、任何策略之前——是数据。而市场数据默认是脏的:缺口、拆分、坏 tick、时区错误、幸存者偏差,都合伙让你的回测撒谎。清洗数据是一半的工作。
交易数据来源
| 来源 | 适合 | 成本 |
|---|---|---|
| Yahoo Finance / Stooq | 美股日线、原型化 | 免费 |
| Polygon.io、Alpha Vantage | 日内股票、基本面 | 免费增值 |
| Binance / Coinbase / Kraken API | 加密货币 OHLCV 和逐笔 | 免费 |
| Interactive Brokers API | 多资产实盘 + 历史 | 经纪商费 |
| Tiingo、EOD Historical | 全球日终 | 订阅 |
| Databento、Algoseek | tick 级、期货、期权 | 付费 |
把粒度匹配你的策略:微观结构用 tick,日内用 1 分钟,波段用日线。别为你永远不用的 tick 付钱。
脏数据清单
- 缺失 bar——交易所假日、行情中断。只在合理时前向填充或插值
- 坏 tick——飙到零或荒谬值。用滚动 z 阈值过滤(比如拒绝 |z| > 10)
- 股票拆分——原始价格会显示假的 50% 跌幅。永远用拆分调整收盘
- 分红——总回报序列跟价格序列不同。决定你要哪个
- 时区——混 UTC 和本地,你的 join 会静默断裂。统一 UTC
- 前视偏差——用了实际是明天开盘的收盘时间戳。确认每个 bar 的时间戳是开始,不是结束
幸存者偏差
如果你的历史标的是"今天的沪深 300 成分股",回测会排除每家破产或退市的公司。收益看起来人为地高,因为输家消失了。
修法:用时间点成分股列表(有的话),或加退市收益代理。免费数据几乎从不包含这个——免费数据的隐性成本。
前视与同步
join 多个品种时,对齐要紧。常见 bug:用品种 A 的日收盘在同一天品种 B 的收盘上入场——实盘不可能。
规则:每个 bar 只能用 bar 收盘时可用的信息。任何从收盘价本身派生的特征用 .shift(1)。
清洗管道
df = df.tz_localize('UTC').tz_convert('UTC')
df = df[~df.index.duplicated(keep='first')]
df = df.resample('1min').last().ffill()
df['ret'] = np.log(df['close']).diff()
z = (df['close'] - df['close'].rolling(100).mean()) / df['close'].rolling(100).std()
df = df[z.abs() < 10]
回测前健全性检查
- 画清洗后的序列——像不像你认识的那张图?
- 查买入持有的年化收益——跟公开数字对得上吗?
- 验证没漏进未来特征(跑个"应当为零"的滞后检查)
- 确认每个时间戳的标的成员跟现实匹配
小结
免费数据是你用过的最贵的数据。幸存者偏差、坏 tick、前视泄漏悄悄抬高每个回测。在信任何策略结果之前,投资干净的时间点数据和严格清洗管道——因为没有信号能在垃圾数据上活下来。
实时行情
打开完整图表 →相关市场数据由 TradingView 提供。
📝
我的笔记
登录后可在本文保存笔记并与社区分享。
由 Marcus Cole 起草 · 由 Timi Chen 于 2026-06-03 审核 · 最后检查于 2026-06-03
下一篇推荐
algorithmicquant-trading 2026-07-01
Quant Research Workflow: Jupyter Notebooks and Feature Engineering
A repeatable quant research workflow using Jupyter notebooks covers feature engineering, validation, and notebook hygiene that produces deployable signals.
阅读更多 →Smart Recommendations