美股行情数据源怎么选?实测四家平台:别让错乱的“最新价”毁掉你的实时看板与 AI 查询
TickDB Research ·
为美股团队选数据源,最怕“演示能用,交付返工”。本文结合真实自动化实测与官方资料,聚焦实时看板、历史回测与 AI 查询三大场景。文章不仅拆解了盘前/盘后价格时点错乱、复权口径不一等五个选型陷阱,还直接提供了可运行的 Python 验证代码、多市场字段对比明细和复权因子计算公式。你将看到 TickDB 在同一响应中如何返回三个时点的价格,以及如何通过 MCP 原生协议让 AI 直接取回结构化行情。最后附上一份可复用的需求卡,帮你用真实样本避开隐性成本。
上个月,一个做美股看板的朋友找我复盘。他说产品上线后,用户投诉不断。我打开他的系统一看:页面上醒目地挂着苹果 AAPL 的价格,涨跌幅却是绿的。用户以为这是“当前盘前”的暴跌,实际上,系统取的是昨天的收盘价,只是时间戳没标清楚。
这就是选美股数据源时最致命的错觉。你问供应商“支不支持美股行情”,他们都说支持。但交付时:看板可能用昨收冒充了盘前,回测可能混用了不同口径的复权,AI 助手可能用训练数据里的旧价格敷衍用户。
问题不在“有没有数据”,而在于你拿到的到底是哪个对象、哪个时点、哪个口径。
最近,为了给内部工具选底座,我用代码把市面几家常用的入口(Yahoo/yfinance、TickDB、Alpha Vantage、Massive)真实跑了一遍。这不是同条件性能横评,而是一份关于“怎么排雷、怎么验收”的踩坑记录。
一分钟看懂:四个入口的适用边界
这张表的正确读法:不要只看谁的功能多,先看你的项目必须跨越哪条红线。如果只是个人日终研究,Yahoo 的免费足够;如果团队既要跨市场看盘,又希望 AI Agent 直接调取带时间戳的结构化数据,那么原生支持 MCP 和多市场统一字段的入口,才是你该重点考察的。
| 数据源 | 覆盖市场 | 实时性 (通道隔离) | 接入方式 | AI 友好度 (Agent调用) | 免费额度与限制 | 主要门槛/风险 |
|---|---|---|---|---|---|---|
| Yahoo / yfinance | 以美股为主,少量全球 | 延时(通常15分钟+),无正式 WS | Python 第三方库 | 需自行写代码封装给大模型 | 免费(开源库) | 非官方接口随时变动;仅限个人研究,商用风险高 |
| TickDB | 美股、A股、港股、外汇等 | REST 按需快照 + WebSocket 推送 | REST API, WebSocket, MCP, Skill | 原生支持 (MCP 直连,带时间戳结构化数据) | 有免费版(免费版不支持K线区间查询及复权因子) | 需配置认证;免费版功能受限,进阶需付费 |
| Alpha Vantage | 美股、外汇、加密 | 免费为延时;实时需付费 | REST API, 提供官方 MCP | 支持 MCP,但需配置 | 免费 25 次/天(极度受限) | 额度极小,高频或实时场景成本极高 |
| Massive | 专注美股 (聚合K线、成交) | 分层提供:日终、延时、实时 | REST API, WebSocket | 需自行封装 API 供 AI 使用 | 视具体产品层级而定 | 主要覆盖美股,多市场统一较麻烦 |
证据说明:上述信息综合自各平台官方文档与公告(截至 2026 年 10 月)。TickDB 的实测数据来自我们团队 2026-10-22 的自动化核验报告,保留原始 JSON 存档。
坑一:同一个接口,可能返回三个“最新价”
在实时看板里,“最新价”是一个伪概念。如果你不指明是哪个时段的最新,你的看板一定会误导用户。
我们在 2026 年 10 月 22 日盘后,通过 TickDB 的 MCP 工具实际拉取了一次 AAPL 的快照。如果你在支持 MCP 的客户端里问 AI 要行情,它底层调用的工具参数非常简单:
{
"name": "get_ticker",
"arguments": {"symbols": "AAPL.US"}
}
你可以直接复制这段 Python 逻辑去检查你的数据源,看看它是否返回了多时段对象:
# 检查你的快照接口是否返回了多时段对象
data = response["data"][0]
print(f"主价格(常规): {data['last_price']}, 时间: {data['timestamp']}")
print(f"盘前对象: {data.get('pre_market_quote', {}).get('last_done')}, 时间: {data.get('pre_market_quote', {}).get('timestamp')}")
print(f"夜盘对象: {data.get('overnight_quote', {}).get('last_done')}, 时间: {data.get('overnight_quote', {}).get('timestamp')}")
在 TickDB 返回的同一份结构化 JSON 里,我们看到了三个完全不同的价格:
- 主价格对象:
last_price= 343.99,时间戳对应美东 10 月 21 日 16:00:01(常规收盘)。 - 盘前对象:
last_done= 339.3,时间戳对应美东 10 月 21 日 09:30:00(盘前)。 - 夜盘对象:
last_done= 343.94,时间戳对应美东 10 月 21 日 22:29:28(夜盘)。
注意,扩展对象的价格字段实际叫 last_done,没有嵌套的 last_price。三个价格都在同一个响应里,如果产品需求只是简单的一句“显示最新价”,研发大概率直接取了第一个 last_price。
我后来给自己定了个规矩:产品需求里的“最新”,必须落实为“哪个对象的最新数据”。如果做盘前看板,就明确取 pre_market_quote;如果夜盘缺数据,界面必须明确显示“暂无”,而不是默认回退到昨收。
坑二:多市场统一,不只是对几个字段名
很多团队一开始只做美股,选了只支持美股的接口。半年后要加港股,发现字段结构完全变了,时间戳的时区也没对齐,写好的数据处理层得推翻重来。
我们尝试用同一个 TickDB API Key,在一次请求里同时拉取了苹果、腾讯和贵州茅台:
GET /v1/market/ticker?symbols=AAPL.US,700.HK,600519.SH
实测验证结果:
- 核心层级完全一致:三个标的的主价格都叫
last_price,时间戳都是timestamp(整型毫秒)。 - 时区转换:我们按 UTC 解释毫秒值,分别转换成纽约(America/New_York)、香港(Asia/Hong_Kong)和上海(Asia/Shanghai)时间。实测时间戳转换完全吻合。
- 诚实边界:这次实测并不代表所有字段都完全相同。AAPL 响应里有盘前/盘后/夜盘对象,600519.SH 返回了
category字段,而 700.HK 此次没有这些扩展字段。
支撑多市场基础行情展示的核心字段是高度统一的。自建去对齐多市场时区、字段映射和扩展规则的成本,通常比买一套统一接口要贵得多。
坑三:AI 查行情,没工具就只能靠猜
大模型最擅长“流畅地胡说八道”。如果没有数据工具,你问它“苹果现在多少钱”,它只能靠训练数据里的历史价格猜。
TickDB 在 AI 原生接入上的优势是直接提供了 MCP(Model Context Protocol)服务。我们在配置好 MCP 后发起了真实调用。以下是 AI 拿到工具结果后给出的真实回答:
“AAPL.US主价格为343.99,其美东时点为2026-10-21T16:00:01-04:00;盘前对象价格为339.3……三个价格对象有各自的时间戳,请保留对象名称和时间一起使用。”
AI 没有凭记忆,它拿回了带时间戳的事实。相比之下,如果你用 Yahoo 或 Massive,你需要自己写封装层、定义 Prompt、确保大模型调用你封装好的函数。TickDB 原生把这一步省了。
坑四:复权不清不楚,回测结果只能作废
如果你要跑回测,先得看清楚账号的权限。TickDB 的免费版文档里写得很明白:不支持通过 start_time、end_time 指定区间,且不开放复权因子接口。
在专业版下,它的透明复权机制值得直接抄作业。很多数据源只给你一个 adjust=forward 参数,底层怎么算的不告诉你。而 TickDB 支持你自己拉取因子列表 /market/kline/ex-factors。
你可以用这段代码验证复权计算:
# 1. 获取 AAPL 的日线数据(不复权),得到 2026-08-07 原始收盘价 313.33
raw_price = 313.33
# 2. 获取前复权因子 (factor_a = 0.99913, factor_b = 0)
factor_a = 0.99913
factor_b = 0.0
# 3. 按文档公式手动计算
adjusted_price = raw_price * factor_a + factor_b
print(f"手动计算的前复权价: {adjusted_price:.7f}")
# 输出: 313.0574029
我们通过公式算出的 313.0574029,与接口直接返回的 adjust=forward 对应收盘价完全一致。把复权规则交给你自己控制,在要求严谨的回测系统里,这种透明机制能帮你省去很多“曲线为什么对不上”的口水战。
坑五:REST 是快照,WebSocket 才是流
上面的验证用的都是按需快照(REST/MCP)。快照能回答“此刻是什么状态”,不能证明“持续推送是否稳定”。
TickDB 的 WebSocket 端点是 wss://api.tickdb.ai/v1/realtime,订阅 ticker 频道可以接收实时更新。但在本次测试时,因为处于美股非交易时段,我们未能拉取到 5 条连续的 AAPL 推送。历史留存数据表明连接和订阅均能成功,但“连续推送”必须在常规交易时段及 US 交易日单独运行检查。
断线重连后,第一件事不是把断线前后的价格连起来算,而是重新取一次当前快照做校准,再回补 K 线。单次 MCP 查询成功,和看板连续跑一周不出错,验收方法是两套。
一张需求卡,把“最新”拆成可验收的条件
如果你正准备把需求发给候选平台,我建议直接用这张表对齐。不要让对方用“支持”两个字糊弄过去。
| 需求项 | 示例填写 |
|---|---|
| 用途与使用者 | 团队内部 AAPL 盘前观察看板;暂不包含客户展示 |
| 标的与对象 | AAPL.US;盘前用 pre_market_quote,夜盘用 overnight_quote,常规用 last_price |
| 时间与更新 | 显示纽约数据时间;明确是 REST 轮询还是 WebSocket 推送 |
| 缺失处理 | 盘前对象缺失时明确提示,不允许拿昨收顶替 |
| AI 需求 | 是否希望用 MCP 直接让 AI 客户端调用结构化行情? |
| 历史需求 | 日期区间、粒度、复权方式;免费版区间限制需提前确认 |
| 权益与维护 | 确认账号权限;指定断线恢复、补取和留存负责人 |
把需求发给候选平台,按“已满足、待确认、不满足”打分。不要因为一次快照成功,就判定“持续推送没问题”;也不要因为 TickDB 免费版不支持指定区间,就否定它 MCP 原生接入和多市场统一的优势。验收要分项。
最后,下次和技术同事讨论时,可以从一句具体的话开始:“我们先验收 AAPL 的盘前对象,再看看 WebSocket 断线后的恢复逻辑。”
如果你现在手头正好有 API Key,不用写完整代码。用它查一次苹果,看看返回里有没有一个和 last_price 时间不同的盘前字段。如果连这个都没有,你的盘前看板可能已经用昨天的收盘价在误导用户了。