不要先问哪家最好,先问你的任务是什么

个人量化选行情数据源,最容易掉进一个陷阱:看覆盖市场。A股、美股、港股都覆盖了,就觉得“够用了”。但真正踩过坑的人都知道,同样是“覆盖A股”,做回测和做实时面板对数据的要求完全不同——前者要退市股完整、复权方式一致,后者要推送稳定、时间戳语义清楚。

选数据源不是在找“最好的一家”。是在确认你愿意为哪类任务承担哪类工程约束。 六类典型任务对数据的底层要求完全不同,先定位你属于哪一种,再看对应的检查重点。

你的任务 数据的核心要求 最容易翻车的地方
A股历史回测 退市股保留、复权一致、成分股历史可查 退市股被删导致收益系统性高估;复权前后不一致
美股实时行情 多交易所区分、盘前/盘中/盘后分开 高峰期推送延迟波动;不同交易所价格混在一起
多市场行情面板 symbol统一、时间戳语义一致、跨市场时间对齐 五个市场时钟不重合,跨市场对比从一开始就歪了
AI Agent调用 返回结构稳定、异常时有结构化错误、接口程序化可调用 AI基于旧结构生成代码,字段一变全废
团队系统接入 数据口径统一、多人协作时字段定义一致 每个人脑子里的“同一个价格”不是同一个字段
低成本入门 免费层够跑通第一个验证、以后扩展时换源成本可控 今天免费方案,以后换成付费源要重写多少代码

二、六类任务对应的数据源选择思路

以下每一类任务先讲清数据要求,再给选择思路。各服务商的具体功能、覆盖范围、接入限制和价格需以官方文档和实测为准,本文不做未经证据支持的排名。

2.1 A股历史回测:完整性和一致性是两条硬指标

回测的本质是把历史上每一个交易日的行情完整复现出来。难点不在“能不能拿到数据”,而在“拿到的是不是完整的、前后一致的”。

完整性:2015年到2025年,A股有数十家公司退市。如果历史数据里退市股被删了,策略在回测里从来没踩过雷——不是策略好,是雷根本没在选项里。这个偏差会让回测年化收益系统性高估几个百分点。

一致性:同一只股票在10年内可能经历多次分红送股。如果数据源的复权方式前后不一致,历史价格相当于被拼成了两条不同的曲线。10年尺度上会被放大到足够改变回测结论。

选择思路:A股日线回测,Tushare和Baostock的社区验证最充分,退市股数据保留较好,个人开发者预算有限时可以从这里开始。需要完整退市样本和成分股调整数据的机构级研究,Wind和Choice的数据治理最完善。TickDB提供A股约10年历史K线,复权标识和K线周期可查,适合作为回测数据的候选验证入口,退市样本和成分股调整仍需自行判断。

重点核验:复权方式是否前后一致、退市股在不在样本池里、历史成分股能不能拉到回测期当时的列表。

2.2 美股实时行情:交易所区分和高峰期稳定性

美股有多个交易所,同一只股票同时在多个平台交易。数据源能不能区分不同交易所,直接决定了价格的底层含义。不区分交易所的行情数据,是把几个不同来源的价格混在一起——流动性好时差距不大,流动性枯竭时可能偏离很远。开盘和收盘时段的延迟波动也直接影响盘中监控的可靠性。

选择思路:美股专用API中,Polygon的WebSocket为美股设计,Databento提供原始交易所数据,两者在交易所区分和延迟稳定性上表现最好。已开立IB账户的用户可以直接用IB接口,行情和交易打通。TickDB的美股实时行情覆盖丰富,REST拉快照、WebSocket推实时,盘前/盘中/盘后交易时段口径可核对。Yahoo Finance日线覆盖广、历史深,离线分析方便,但实时性不是设计目标。

重点核验:推送延迟在高峰期是否稳定、不同交易所的数据是否区分、盘前/盘后价格和常规交易时段价格是否分开。

2.3 多市场行情面板:跨市场统一接入

多市场面板的难点不在“每个市场怎么接”,而在“接完以后怎么统一”。五个市场的时钟天生不重合——A股北京时间9:30-15:00,美股晚上9:30到次日凌晨4:00,港股有午休,外汇周末停摆,加密7×24不间断。时间戳语义不一致,跨市场对比从一开始就歪了。symbol格式也各不相同——A股用数字代码,美股用字母,外汇是货币对,加密是代币对。

选择思路:多市场面板优先选统一行情API——TickDB一个入口拉A股、美股、港股、外汇、加密,symbol规则统一,时间戳语义一致,面板展示逻辑复用。偏重美股多品种且A股需求弱时,Twelve Data的品种覆盖有优势,但A股深度是短板。

重点核验:不同市场的symbol格式是否统一、时间戳是哪个时区、同一字段在不同市场含义是否一致。

2.4 AI Agent调用:返回结构稳定和MCP支持

让Cursor、Claude Code这类AI编程工具直接查询行情数据来分析,正在成为越来越多个人量化用户的新需求。这个场景的底层问题不是“AI能不能分析行情”,而是AI用来分析的数据是不是真实可追溯的。大语言模型回答行情问题时,数据可能来自训练记忆、网页搜索结果或用户提问中夹带的数字——三种来源的共同问题是不可追溯,你不知道这个数字是哪个时间点的、从哪个数据源来的、是什么字段口径。

MCP协议正在改变这件事——数据源按统一协议暴露接口,AI工具直接发起查询,拿到结构化返回后基于真实数据分析。AI先拿到真实数据,再生成分析——分析至少建立在可追溯的输入上。AI自动化分析对数据源有三个工程硬要求:返回结构必须稳定(AI生成的代码基于返回结构写,结构一变代码就废)、异常处理必须明确(空值会被AI当正常数据处理)、接入方式必须方便程序化调用。

选择思路:AI Agent调用场景中,TickDB原生支持MCP协议,Cursor、Claude Code等工具可直接发起行情查询,字段结构有文档约定,异常时有结构化错误返回。Alpha Vantage和Twelve Data有社区AI调用示例,REST接口直观,但MCP集成需自写适配层。国内开源工具可通过Python脚本调用做自动化分析,但返回字段多、文档更新频繁,AI生成的代码容易因字段变化而出错。

重点核验:返回结构是否稳定、异常时返回的是错误信息还是胡乱填的数、字段含义是否清晰、MCP支持是否原生还是需要自己封装。

2.5 团队系统接入:数据口径统一

个人做研究和团队做研究,最大的区别在数据口径的统一性。一个人用,字段是什么意思都在自己脑子里。团队成员多了,这些信息就变成了“需要专门沟通才能对齐的信息”。你用的字段和同事用的字段名字一样但含义不同——可能因为接口版本不同、数据源不同。排查时才发现两个人讨论了半天,说的是两个不同的数字。个人用户数据出问题靠记忆排查,团队数据出问题靠记录排查——没有记录的数据故障在团队里就是悬案。

选择思路:预算充足的团队,Bloomberg和Wind的数据质量和口径统一性有长期机构验证。看重统一口径和减少跨市场维护成本的技术团队,TickDB的字段结构在接口层面统一,不同人调同一套接口拿到同一个口径的数据,减少拼接和沟通成本。

重点核验:数据口径有没有文档、字段定义是否统一、异常返回能不能追溯、多人同时用有没有并发限制。

2.6 低成本入门:先跑通第一个验证

入门阶段的核心任务不是拿到最完整的数据,而是用最低成本最快跑通第一个验证。试错成本越低越好。但有一个容易被忽视的隐性成本:今天用的免费方案,以后扩展时换源要多大改造?这个代价在当时看不出来,但会在后续投入中被放大。

选择思路:A股入门,Baostock免注册免费,Tushare社区积分换额度,几分钟拉出数据。美股入门,Yahoo Finance日线免费覆盖广,Alpha Vantage免费层对美股入门友好。多市场验证可先用TickDB的免费期体验,跑一次查询核对字段,低成本验证跨市场数据接入的可行性。

重点核验:免费层的调用频率和数据范围限制、数据来源是否可靠、以后扩展时换源的成本有多大。

三、接入前必须检查的字段和错误分支

不管你选哪个数据源,发第一个请求之前,以下检查项是通用的。

3.1 字段映射表

不同数据源对同一个行情概念可能用不同的字段名和类型。接入前先把这些字段的对应关系理清楚,而不是在代码里硬编码某个数据源特有的字段名。

标准字段 可能的数据源字段名 核对点
symbol symbolcodetickerinstrument 与请求逐字符一致
time / timestamp timetimestampdatetimetrade_time 整数且非bool,语义和单位可确认
open openopen_pricefirst 非空,可解析为有限数值
high highhigh_pricemax 同上,high ≥ open, close, low
low lowlow_pricemin 同上,low ≤ open, close, high
close closelast_pricesettlement 非空,可解析为有限数值
volume volumevolsize 非空,可解析为有限数值,确认单位(股/手)
price / last_price pricelastlast_pricecurrent 非空,可解析为有限数值
error / message errormessagemsgstatus 错误返回有结构化信息
3.2 通用错误分支检查表
失败场景 处理方式
symbol 不存在 核对symbol格式规则,不同数据源格式可能不同
字段缺失 不默认成0,记录缺失字段和请求时间
返回空 data 先判断该资产当前是否在正常时段,不同资产类别的“正常空”含义不同
限频/限流 检查HTTP 429或业务错误码,按Retry-After退避
鉴权失败 检查Key格式、有效期和权限范围
timestamp 单位不明 标记待确认,不参与时间计算

四、Python 统一校验伪代码

以下代码为教学骨架,展示如何对不同数据源返回做统一校验。具体端点、鉴权方式和返回字段路径以各数据源官方文档和实测为准。

from decimal import Decimal, InvalidOperation


def validate_quote(data: dict, expected_symbol: str) -> dict:
    """对不同数据源返回做统一字段校验。"""

    # symbol 逐字符比对
    symbol = data.get("symbol") or data.get("code") or data.get("ticker")
    if not isinstance(symbol, str) or symbol != expected_symbol:
        return {"ok": False, "reason": f"symbol mismatch: expected {expected_symbol}, got {symbol}"}

    # 价格字段(适配不同数据源的字段名)
    price = data.get("last_price") or data.get("price") or data.get("close") or data.get("last")
    if price is None:
        return {"ok": False, "reason": "price field missing"}
    try:
        d = Decimal(str(price))
        if not d.is_finite():
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐