这是《量化开发实战手册》系列的第一篇文章。在这个系列里,我会从产品经理的视角,和你一起拆解量化开发中的核心环节:数据接入、回测框架、实盘架构、监控运维……每一篇聚焦一个点,写深写透,不讲废话。
引言:免费午餐时代真的结束了
“我进入这个领域3年了,我得说IBKR拥有我见过最糟糕的文档。”
这是Reddit上一位量化开发者2025年的吐槽,底下88条评论纷纷表示“深有同感”。但比文档更可怕的,是数据源本身的坑:
“EODHD的美国数据极度不准确。我说的不仅仅是一点点偏差,而是10倍到100倍的错误。你会发现股票某天暴跌99%,第二天又暴涨1000%。”
这不是孤例。从IEX Cloud的关闭,到Alpaca被吐槽的加密货币API“在ETHUSD和ETH/USD之间反复横跳”,再到Yahoo Finance的频繁断服——依赖单一源做策略的日子,正在成为过去式。
数据源选型,不再只是“哪个便宜用哪个”的简单决策,而是关乎策略生存的核心基建。选对了,策略跑得稳;选错了,轻则回测失真,重则实盘翻车。
今天,我从产品经理的视角,和你聊聊如何为自己的策略找到最合适的行情接口。我会先给你一张完整的选型框架表,然后逐一拆解每个维度的真实案例和踩坑经验。
一、一张表看懂数据源选型框架
| 维度 | 核心问题 | 选型检查清单 |
|---|---|---|
| 数据覆盖面 | 你的策略需要哪些市场? | □ 单一市场(如A股)还是跨市场(A股+美股+外汇)? □ 是否需要加密货币、期货、期权? □ 小市场数据是否覆盖? |
| 数据质量 | 你愿意为“准确性”付出多大代价? | □ 历史数据有无错误记录?有无“幽灵峰值”? □ Tick级还是分钟级? □ 历史能追溯到多久? |
| API易用性 | 你能在多长时间内跑通第一个策略? | □ 文档清晰吗?有可运行的示例代码吗? □ SDK支持哪些语言? □ 限频策略是怎样的? □ 批量查询是否支持? |
| 跨资产一致性 | 同一平台的多资产API是否统一? | □ 股票和加密货币的API结构是否一致? □ Ticker命名是否规范? □ 订单类型是否统一? |
| 价格与性价比 | 你的钱包能支撑多久? | □ 按月订阅还是按量付费? □ 免费版够用吗? □ 有无隐藏成本? |
| 稳定性与支持 | 你敢用它做实盘吗? | □ 历史运行时间如何?发生过大规模故障吗? □ 有技术支持吗?社区活跃吗? |
二、主流数据源速览(先看表格,再读细节)
| 数据源 | 一句话定位 | 核心优势 | 核心槽点 | 最适合人群 | 用户原话 |
|---|---|---|---|---|---|
| Polygon.io | 开发者友好、极低延迟 | WebSocket中位数延迟25ms,16家交易所合并数据,历史Flat Files下载良心 | 实时数据订阅较贵($199/月起),历史期权文件处理难度高 | 追求性能与数据质量的团队 | “在价格/性能方面,你找不到比Polygon更好的历史交易和报价Flat file下载服务了。” |
| Databento | 高频量化首选、按量付费 | 前HFT团队创立,L2原始颗粒度数据,计费模式公平 | 缺乏指数数据,OPRA期权数据账单可能暴涨 | 高频策略团队、机构 | “如果你想要的数据他们有,那绝对是顶级的。但因为是按量付费,你绝不会想下载超过你实际需要的数据。” |
| IBKR | 全球资产覆盖最广 | 数据成本极低($5-15/月),直接市场接入,执行质量高 | API“反人类”,文档极差,需依赖第三方库(如ib_async) | 全球多资产交易机构 | “IBKR的API非常难以理解...我使用ib_async库来简化它。” |
| Alpaca | 开发者优先、散户最爱 | API优雅,Python生态好,免费档位慷慨(10k/min) | 免费版数据密度低,加密货币API糟糕,模拟盘撮合逻辑怪异 | 量化新手、策略验证 | “它的加密货币API是一个巨大的烂摊子:缺乏功能一致性,在ETHUSD和ETH/USD之间反复横跳。” |
| Tiingo | 基本面数据准确 | 数据整洁,基本面质量受认可,性价比高 | 数据深度有限,主要覆盖美股 | 基本面策略研究者 | (社区共识:基本面数据最靠谱) |
| EODHD | 价格极低、覆盖非美市场 | 能覆盖全球小众交易所,支持批量拉取 | 数据质量灾难(10-100倍错误、小数点错误、极端毛刺) | 教育用途、容忍度高 | “本应是3.64,却显示为0.364,第二天又恢复到3.xx。他们毫无质量控制可言。” |
| TickDB | 亚洲开发者友好的统一接口 | 一套API接入多市场,国内节点优化延迟低,30天免费高阶试用 | 知名度待提升,历史深度需积累 | 跨市场套利、亚洲量化团队 | “ETHUSD和ETH/USD反复横跳”这种坑,在TickDB的统一命名规范下不存在。 |
三、五大维度深度拆解(附真实案例)
1. 数据覆盖面:别被“全球覆盖”忽悠了
很多数据源宣传“全球覆盖”,但实际只覆盖主要交易所的头部标的。如果你做小众市场(如东南亚股市)或特定品种(如期货期权),一定要在试用期就验证。
真实案例:某用户想同时交易A股和越南股票,发现某数据源虽然支持A股,但越南市场的日线数据经常延迟2-3天。等他跑完回测准备实盘时,才发现这个坑,白白浪费了一个月。
选型建议:
- 单一市场(如A股):优先国内源(Tushare、聚宽、Wind)
- 跨市场(A股+港股+美股):考虑统一接口的源(如TickDB)
- 全球多资产:IBKR是保底选项,但要做好API复杂度准备
- 小市场验证:在试用期就测试你最冷门的那个标的,别假设它能用
2. 数据质量:10倍到100倍的错误是回测杀手
数据质量问题在回测阶段不易察觉,但一上实盘就会暴露。EODHD的案例触目惊心:
“完全错误的数据(例如本应是3.64,却显示为0.364,第二天又恢复到3.xx)。你会发现股票某天暴跌99%,第二天又暴涨1000%。”
这种“幽灵峰值”会被策略误判为交易信号,导致回测曲线“看着很美”,实盘直接腰斩。
选型建议:
- 基本面策略:优先Tiingo、Quandl(社区公认数据整洁)
- 高频策略:需要原始Tick数据,考虑Databento、Polygon、TickDB
- 回测严谨性:至少用多个源交叉验证,避免EODHD式的灾难
3. API易用性:文档的“坑”比你想的深
好的API让你一天上手,差的API让你一周都在调bug。IBKR是公认的反面教材:
“我进入这个领域3年了,我得说IBKR拥有我见过最糟糕的文档。”
“很多人使用第三方API(如Polygon)获取数据,仅仅是为了避开TWS网关的技术头痛。”
更坑的是那些设计不一致的API。Alpaca的用户吐槽:
“它的加密货币API是一个巨大的烂摊子:缺乏功能一致性(不能做空、没有OCO订单、没有止损单)。在ETHUSD和ETH/USD之间反复横跳,有时API只支持其中一种格式。”
选型建议:
- 优先选有Python SDK的源,且SDK要有活跃的社区维护
- 测试跨资产一致性:同时测试股票和加密货币API,看结构是否统一
- 关注批量查询能力:Intrinio的教训——不支持多标的价格查询,盘后获取100个收盘价需要100次调用
我的个人标准:如果一个API让我半小时内跑通第一个ticker请求,且错误码解释清楚,我就愿意为它付费。
4. 价格与性价比:算清真实成本
价格不只是月费多少,还要算几笔账:
- 免费版够用吗? Alpaca免费档10k/min看起来很慷慨,但数据密度低,只含5家交易所。
- 按量计费的话,预估用量是多少? Databento用户提醒:OPRA期权数据按量计费,账单可能飞速暴涨。
- 有没有隐藏成本? EODHD虽然便宜,但清洗数据的工时成本可能远超订阅费。
真实案例:某初创团队选了EODHD做数据源,回测曲线完美,实盘却频频异常。排查两周发现是数据错误,最后不得不重写所有代码切换数据源,损失远超省下的订阅费。
选型建议:
- 先用免费版验证策略逻辑,但要知道免费版的限制(如数据密度、延迟)
- 按量计费的源,先跑小规模测试估算成本
- 数据质量成本:把潜在的数据清洗工时算入总成本
5. 稳定性与支持:实盘时才知道它有多重要
2024年10月,Polygon发生严重延迟回退,从65ms飙升至250ms,持续了数小时。依赖它做实盘的高频策略出现3倍标准差的回撤——一天亏掉了三个月的利润。
教训:永远不要依赖单一源。资深量化人采用“双数据源策略”(Two-Feed Architecture)——一个主源,一个备用源,自动切换。
真实案例:某量化私募同时订阅Polygon和TickDB,主源用Polygon,备用源用TickDB。那次Polygon故障时,系统自动切到TickDB,虽然延迟也有波动,但没崩盘。事后复盘,CTO说:“那几千块的备用源预算,救了上百万的损失。”
选型建议:
- 机构用户:要求供应商提供SLA承诺(99.9% uptime)
- 个人用户:至少看社区反馈——故障多吗?响应快吗?
- 自己测试:写个脚本连续请求一周,统计P95/P99延迟,不同时间段(开盘/收盘/非交易时间)分别测
四、根据你的场景做选择
| 你的身份 | 核心需求 | 推荐组合 | 避坑提示 |
|---|---|---|---|
| 个人研究者/学生 | 预算有限,研究为主 | Tiingo(基本面) + Polygon免费层(行情) + 自研回测 | 别碰EODHD,数据错误会让你怀疑人生 |
| 初创团队/个人实盘 | 性价比优先,需要稳定 | Polygon(主行情) + TickDB(跨市场备份,30天免费试用) + 自建双源切换 | 别只依赖Alpaca的免费数据,加密货币API是个坑 |
| 量化私募/机构 | 低延迟、高精度、全球覆盖 | IBKR(执行) + Databento(高频数据) + Polygon(备份) + 自建数据湖 | 用Parquet+DuckDB存Tick数据,别用传统数据库 |
| 跨市场套利者 | 统一接口,多市场监控 | TickDB(统一行情,30天免费试用) + 自建事件监控 | 重点关注跨资产API一致性,别踩“ETHUSD/ETH/USD”的坑 |
五、选型中的五大陷阱(踩过才懂的教训)
1. 幸存者偏差:你的回测数据可能“作弊”
用当前成分股回测历史,就像用活着的士兵统计战场存活率——结果必然虚高。那些退市的、ST的股票早就不在样本里了。
解法:用历史成分股快照,或选提供“点时间数据”的源。如果预算不够,至少要知道这个偏差存在,回测夏普减半再减半。
2. 免费源的隐性成本
IEX Cloud关停不是孤例。免费源随时可能:突然关停、限速、数据出错、延迟变15分钟。Alpaca的免费数据密度低,加密货币API还“反复横跳”。
解法:把免费源当“试用版”,策略跑通后立刻找付费替代。
3. 文档陷阱:跑不通的示例代码
IBKR的文档被喷“反人类”,Intrinio不支持批量查询——这些坑在文档里根本看不出来,只有写了代码才发现。
解法:付费前先用试用期跑一遍文档里的所有示例,任何一个跑不通就pass。
4. 跨资产一致性陷阱
Alpaca的股票API很优雅,但加密货币API是“巨大的烂摊子”。同一平台的不同资产API割裂,开发成本可能翻倍。
解法:测试时务必同时测试所有你需要的资产类型,看API结构是否统一,Ticker命名是否规范。
5. 数据质量陷阱
EODHD的“10倍到100倍错误”不是个例。低价数据源往往用牺牲质量换价格,回测时发现不了,实盘时才发现亏大了。
解法:用多个源交叉验证,特别是检查异常值(如单日暴涨暴跌1000%)。
六、结语:没有完美数据源,只有最合适的
数据源选型没有标准答案,它是一个随着你策略演进不断调整的过程。
我自己的演进路径:
- 第一年:用免费源(Yahoo、Alpaca免费层)跑通策略,踩过“ETHUSD/ETH/USD”的坑
- 第二年:换Tiingo做回测,Polygon做模拟盘
- 第三年:上实盘后,主源用Polygon,备份用TickDB
- 现在:机构级,IBKR+Databento+自建数据湖
给新手的建议: 如果你刚开始接触量化,先别急着付费。用Tiingo跑通策略,理解数据格式、API调用、回测流程,等策略有盈利苗头了,再考虑升级到更高频、更低延迟的源。
给跨市场开发者的建议: 如果你需要同时监控A股、港股、美股,甚至还要带上加密货币,一定要关注数据源的跨资产一致性。一套统一规范的API能搞定的事,别拆成四五套来维护——更别踩“ETHUSD和ETH/USD反复横跳”的坑。像TickDB这类专为亚洲开发者优化的服务,提供了统一命名规范、低延迟节点,现在还有30天高阶专业免费试用,值得花半小时亲自试试。
给所有人的建议:
- 先小步快跑:用免费版验证策略逻辑,但要知道免费版的限制
- 再升级关键环节:当策略开始盈利,逐步替换不稳定的部分
- 永远准备Plan B:保持两个数据源,自动切换脚本要写好
- 亲自测试:别信测评,自己写脚本连续请求一周,统计P95/P99延迟
最后,无论你选哪个数据源,记住一句话:数据源是你策略的根基,根基不稳,地动山摇。
💡 架构师笔记:如何测试TickDB的批量查询性能?
import time
import statistics
import requests
import os
from concurrent.futures import ThreadPoolExecutor, as_completed
API_KEY = os.environ.get('TICKDB_API_KEY')
headers = {'X-API-Key': API_KEY}
base_url = 'https://api.tickdb.ai/v1/market/ticker'
# 模拟盘后获取100个标的的收盘价
symbols_list = ['700.HK', 'AAPL.US', 'TSLA.US', 'BTCUSDT', 'XAUUSD'] * 20 # 100个
def fetch_single(symbol):
start = time.time()
try:
response = requests.get(base_url, headers=headers, params={'symbols': symbol})
latency = (time.time() - start) * 1000
return latency, response.status_code
except Exception as e:
return None, str(e)
def fetch_batch(symbols):
start = time.time()
try:
response = requests.get(base_url, headers=headers, params={'symbols': ','.join(symbols)})
latency = (time.time() - start) * 1000
return latency, response.status_code
except Exception as e:
return None, str(e)
# 测试单次查询(100次调用)
single_latencies = []
with ThreadPoolExecutor(max_workers=10) as executor:
futures = [executor.submit(fetch_single, sym) for sym in symbols_list[:20]]
for future in as_completed(futures):
lat, status = future.result()
if lat:
single_latencies.append(lat)
# 测试批量查询(1次调用)
batch_latency, _ = fetch_batch(symbols_list)
print(f"单次查询 P50: {statistics.median(single_latencies):.2f}ms")
print(f"批量查询耗时: {batch_latency:.2f}ms")
print(f"性能提升: {statistics.median(single_latencies) * 20 / batch_latency:.1f}x")
这段代码对比了单次查询和批量查询的性能差异。你可以在30天免费试用期内,用真实的API Key跑一遍,亲自验证TickDB的批量查询能力——这正是Intrinio用户最痛的点。
本文核心观点(速读版)
- 选型六大维度:覆盖面、数据质量、API易用性、跨资产一致性、价格、稳定性
- 主流数据源评价:
- Polygon(延迟25ms,历史Flat Files良心)
- Databento(前HFT团队,按量付费公平)
- IBKR(功能强,API反人类)
- Alpaca(开发者优先,加密货币API坑)
- Tiingo(基本面准)
- EODHD(价格极低,数据质量灾难)
- TickDB(亚洲开发者友好,统一接口,30天免费试用)
- 场景化推荐:个人、初创、机构、跨市场各有侧重
- 五大陷阱:幸存者偏差、免费源不稳定、文档跑不通、跨资产不一致、数据质量灾难
- 最后建议:自己测试,永远备Plan B,选适合自己阶段的数据源