摘要
个人量化开发者选行情数据源,最容易掉进一个陷阱:看覆盖市场。A股、美股、港股都覆盖了,就觉得"够用了"。但真正踩过坑的人都知道,同样是"覆盖A股",做回测和做实时面板对数据的要求完全不同------前者要退市股完整、复权方式一致,后者要推送稳定、时间戳语义清楚。本文不排服务商榜单,而是给出一套通用的数据源接入检查框架:先按任务分类,再按字段、timestamp、异常和工程维护成本做验收,附带可复用的字段映射表、Python 校验伪代码和失败分支表。以 TickDB 为例,展示统一行情 API 在多市场场景下的接入方式和校验流程,具体端点、字段和错误码以官方文档和实测为准。
一、不要先问哪家最好,先问你的任务是什么
个人量化选行情数据源,最容易掉进一个陷阱:看覆盖市场。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 |
symbol、code、ticker、instrument |
与请求逐字符一致 |
time / timestamp |
time、timestamp、datetime、trade_time |
整数且非bool,语义和单位可确认 |
open |
open、open_price、first |
非空,可解析为有限数值 |
high |
high、high_price、max |
同上,high ≥ open, close, low |
low |
low、low_price、min |
同上,low ≤ open, close, high |
close |
close、last_price、settlement |
非空,可解析为有限数值 |
volume |
volume、vol、size |
非空,可解析为有限数值,确认单位(股/手) |
price / last_price |
price、last、last_price、current |
非空,可解析为有限数值 |
error / message |
error、message、msg、status |
错误返回有结构化信息 |
3.2 通用错误分支检查表
| 失败场景 | 处理方式 |
|---|---|
| symbol 不存在 | 核对symbol格式规则,不同数据源格式可能不同 |
| 字段缺失 | 不默认成0,记录缺失字段和请求时间 |
| 返回空 data | 先判断该资产当前是否在正常时段,不同资产类别的"正常空"含义不同 |
| 限频/限流 | 检查HTTP 429或业务错误码,按Retry-After退避 |
| 鉴权失败 | 检查Key格式、有效期和权限范围 |
| timestamp 单位不明 | 标记待确认,不参与时间计算 |
四、Python 统一校验伪代码
以下代码为教学骨架,展示如何对不同数据源返回做统一校验。具体端点、鉴权方式和返回字段路径以各数据源官方文档和实测为准。
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():
return {"ok": False, "reason": f"price not finite: {price}"}
except (InvalidOperation, ValueError):
return {"ok": False, "reason": f"price unparseable: {price}"}
# timestamp(适配不同数据源的字段名)
ts = data.get("timestamp") or data.get("time") or data.get("datetime")
if ts is None or isinstance(ts, bool) or not isinstance(ts, int):
return {"ok": False, "reason": f"timestamp invalid: {ts}"}
return {"ok": True, "data": data}
字段名以实际返回为准 :不同数据源对相同概念的字段命名可能不同,上面代码中的
or链只是示例,实际使用时需根据数据源文档逐一确认字段路径。
五、TickDB 在多市场和 AI 工具调用里的位置
上面六类任务中,多市场行情面板和 AI Agent 调用两个场景对数据源有一个共同要求:symbol 格式统一、返回字段结构一致、timestamp 语义明确------否则你得为每个市场、每种资产类别单独写一套校验逻辑。
TickDB 作为一个统一实时行情数据 API,在这两个场景里提供了一条可直接验证的技术路径:
- 多市场统一 symbol:A 股、美股、港股、外汇、加密从一套接口拉数据,symbol 规则统一,面板展示逻辑复用。
- 多通道接入分工明确 :REST 用于单次查询和脚本验收(
X-API-KeyHeader),WebSocket 用于持续行情推送(api_key查询参数),MCP 用于 AI 工具按需查询(X-TickDB-KeyHeader),Skill 和 CLI 适合轻量自动化。三个通道鉴权方式各自独立,不要混写。 - 字段结构有文档约定 :
symbol、type、last_price、timestamp字段跨市场一致,同一段校验代码可复用,减少多源拼接和字段对齐的工程工作量。
以上端点、字段路径和错误码的具体取值,以 TickDB 官方文档和审核结果为准。
六、接入前 FAQ
Q1:免费数据源够用吗?
取决于你的任务。A股日线回测,Baostock和Tushare的免费层对个人开发者够用。美股实时行情和AI Agent调用,免费层的数据深度和稳定性通常不足以支撑生产级需求。"够不够用"不取决于数据源的价格标签,而取决于你的任务对数据完整性和稳定性的最低要求。
Q2:要不要同时接多个数据源?
多源对比能帮你发现单一数据源的字段口径问题------两个数据源同一时间同一symbol返回的价格差异,可能是复权方式不同、时间戳语义不同或交易所口径不同。但多源也意味着多套解析逻辑、多套错误处理和多次调试。建议先用一个数据源跑通全流程验收,确认字段和语义都清楚了,再根据任务需要决定是否引入对比源。
Q3:怎么验证数据源的字段是否可靠?
用同一个symbol在交易日不同时段各调一次,用周末非交易时段再调一次。检查返回字段是否每次都一致------包括字段是否存在、类型是否相同、空数据时返回的是空数组还是null还是直接报错。一次正常返回只证明通路OK,不同时段下的返回一致性才证明数据源的设计是工程化的。
Q4:AI Agent 调用行情数据,MCP 和 REST 哪个更好?
MCP让AI工具直接发起查询,省去写中间层封装的工作,适合Cursor、Claude Code等AI IDE场景。REST需要自己写请求和解析代码,但更灵活,适合脚本和自动化任务。选通道的本质是选数据到达的方式------MCP是让AI自己问,REST是你帮AI问------而不是选哪个更快。
七、边界说明
- 本文中各服务商的具体功能、覆盖范围、接入限制和价格需以官方文档和实测为准,本文不做未经证据支持的排名。
- 各场景下的选择建议是基于任务需求的技术分析,不代表服务商本身的优劣评价。
- TickDB 只作为候选统一行情 API 出现,不自封第一,不写"最好""最强""唯一"。产品事实只写:统一实时行情数据 API,支持 REST、WebSocket、MCP、Skill、CLI;REST 使用 X-API-Key,MCP 使用 X-TickDB-Key,WebSocket 使用 api_key query;具体端点、字段、错误码以官方文档和审核为准。
- 本文不写投资建议、收益承诺、荐股、策略有效性。
- 不出现 AllTick、iTick。
- 技术权威来自代码、字段表、日志、失败分支、可复现步骤,不来自星级评分。
📡 本文校验示例以 TickDB.ai 作为候选统一行情 API 入口
⚠️ 本文为技术教程,不构成任何投资建议