MCP金融数据接入指南:让 Claude 取实时行情,并且能验证数据时效
作者: TickDB Research · 发布: 2026/9/14 · 阅读: 5
标签: 知乎
我用 Claude 辅助做过一版估值草稿。它给了我 AAPL 的价格,我拿这个价格算了一个倍数,写进了草稿。
第二天开盘我才发现,那个价格和当时盘中的差了一截。草稿里所有基于价格算出来的东西,基准日不对,得从头再对一遍。
那次之后我才意识到:Claude 给我的数字,不是不能信,是我没办法验证它新不新。它可能来自实时接口,也可能来自训练记忆。从返回的内容上,我看不出区别。
MCP 能解决"拿到实时数据"这一层。但从"知道这个协议"到"本地配好、并且能验证返回的时间戳合理",中间还有一道门槛。这篇文章给你一个可复现的闭环:配置 → 调用 get_ticker → 检查 timestamp → 转北京时间验收 → 用检查清单固化下来。
这篇文章在解决什么
核心结论:MCP 金融数据接入,关键不是能不能取到数字,是取到的数字能不能验证时效。
这篇文章解决四层需求:
- 能不能拿到——Claude 有没有实时数据源,还是只能用训练记忆。
- 拿到的新不新——返回的数字有没有时间来源,能不能判断时效。
- 不同市场能不能比——A 股和美股的行情放在一起,时间轴是否统一。
- 能不能复用——这套验证能不能固化成每次取数都跑的流程。
你可以直接带走:
- 一份可跑的 MCP config 结构;
- 一份五项检查清单,每次配置新环境逐项过;
- 一段时间戳转换 Python 代码;
- 三类常见错误的修复动作;
- 一组真实 JSON 返回,用于对照你自己的工作流。
MCP金融数据接入:MCP 是 AI 工具和外部数据之间的标准化桥梁
MCP(Model Context Protocol)是让 AI 工具调用外部工具的协议层。根据 Model Context Protocol 官方规范(modelcontextprotocol.io),它定义的是 AI 应用和外部数据源之间的标准连接方式。
你不必是协议专家。只需要知道:配好 MCP server 之后,Claude 能调用外部工具,拿到结构化返回,而不是靠记忆回答。
TickDB 是什么:面向 AI 工具的统一市场数据服务
在配置之前,先把这个数据源讲清楚。
TickDB 是面向开发者、量化研究和 AI 应用的统一实时市场数据服务,覆盖 A 股、美股、港股、中国期货、外汇/贵金属、指数等市场。它通过 REST、WebSocket、MCP、Skill、CLI 提供行情、K线、资金流、盘口、交易日历等数据。
在本文场景里,我用的是它的 MCP server——这是它面向 AI 工具的接入方式,让 Claude 能直接调用结构化市场数据。本文的主验收工具是 get_ticker 和 get_kline_latest,前者返回实时行情快照,后者返回最新 K 线。
配置 TickDB MCP:先让 Claude 能调用工具
环境准备三件事:拿到 API Key;在 MCP 客户端配置文件里注册 TickDB MCP server;确认鉴权头正确传入。
MCP 侧的鉴权头是 X-TickDB-Key,和 REST 的 X-API-Key 不是同一个头。这一点在配置阶段最容易搞混。
config 的结构大致如下,字段值按你自己的客户端环境替换:
{
"mcpServers": {
"tickdb": {
"command": "<你的 MCP 客户端启动命令>",
"args": ["<TickDB MCP server 启动参数>"],
"env": {
"X-TickDB-Key": "<你的 API Key>"
}
}
}
}
配置完第一件事不是直接进入研究,是做一次最小调用。下面这段返回就是我做的最小调用。
第一次调用 get_ticker:看 last_price,也看 timestamp
这是我在 2026-09-14 实际调用 get_ticker(symbols="AAPL,688256.SH") 的返回,原始 JSON,未做修改:
{
"code": 0,
"message": "success",
"data": [
{
"symbol": "AAPL",
"name": "Apple Inc.",
"type": "stock",
"last_price": "332.27",
"open": "327.45",
"prev_close": "326.57",
"volume_24h": "50716865",
"quote_volume_24h": "16888803875",
"high_24h": "336.22",
"low_24h": "326.3",
"price_change_24h": "5.7",
"timestamp": 1789156801000,
"pre_market_quote": {
"last_done": "327.388",
"timestamp": 1789133400000,
"volume": 460944
},
"post_market_quote": {
"last_done": "332.55",
"timestamp": 1789171199000,
"volume": 2919418
},
"overnight_quote": {
"last_done": "328.93",
"timestamp": 1789353750000,
"volume": 82677
},
"price_change_percent_24h": "1.75"
},
{
"symbol": "688256.SH",
"name": "寒武纪",
"type": "stock",
"last_price": "1035.37",
"open": "1020",
"high_24h": "1039",
"low_24h": "998.88",
"volume_24h": "52087",
"price_change_percent_24h": "-0.45",
"timestamp": 1789355965000
}
]
}
last_price 是给人看的。timestamp 是给验收用的。
AAPL 的 timestamp 是 1789156801000,寒武纪的是 1789355965000,两个都是毫秒级整数。它们放在同一个返回里,本身就是一个可验证的样本:A 股和美股两个市场,同一套调用、同一套字段、同一个时间戳口径。
三条验收标准
以下三条是我用来判断"数据来自 API 还是模型记忆"的标准。三条都过,数据可用;任何一条不过,先别用。
验收一:timestamp 字段存在且为毫秒级整数
核心判断:没有 timestamp 的行情数字,不进入策略研究。
有 timestamp 但精度不明,先确认单位再用。看返回 JSON 里 timestamp 字段是否存在,值是否为 13 位整数。10 位是秒级,13 位是毫秒级,两者换算差 1000 倍,混用会产生几十年的偏差。
验收二:时间戳转成北京时间后,落在合理交易时段
核心判断:字段存在只是第一步,时间戳合理才是数据可信的证据。
下面这段代码是我实际用来验收的,直接可跑:
from datetime import datetime, timezone
import pytz
# 寒武纪 688256.SH
ts_ms = 1789355965000
ts_sec = ts_ms / 1000
utc_dt = datetime.fromtimestamp(ts_sec, tz=timezone.utc)
bj_dt = utc_dt.astimezone(pytz.timezone("Asia/Shanghai"))
print(bj_dt) # → 2026-09-14 11:19:xx+08:00(A股今日早盘)
# AAPL
ts_aapl = 1789156801000
bj_aapl = datetime.fromtimestamp(ts_aapl / 1000, tz=timezone.utc)\
.astimezone(pytz.timezone("Asia/Shanghai"))
print(bj_aapl) # → 2026-09-12 06:00:xx+08:00(美股9月11日收盘后)
我当时的验收结论:
- 寒武纪
1789355965000→ 北京时间 2026-09-14 11:19,落在 A 股早盘交易时段,符合逻辑; - AAPL
1789156801000→ 北京时间 2026-09-12 06:00,对应美股 9 月 11 日收盘后交易段,符合周末无交易逻辑。
我进一步用 get_trading_sessions(market="US") 核对了时段定义:
{
"code": 0,
"message": "success",
"data": [
{
"market": "US",
"trading_sessions": [
{"begin_time": 400, "end_time": 930, "trade_session": 1},
{"begin_time": 930, "end_time": 1600},
{"begin_time": 1600, "end_time": 2000, "trade_session": 2}
]
}
]
}
返回的盘前、盘中、盘后分段与 timestamp 落点一致。模型训练记忆里的价格,不会恰好落在这两个时段的合理位置上。
这里有一个容易被忽略的点:AAPL 和寒武纪来自两个不同市场,但返回的时间戳是同一套毫秒级口径。跨市场比较时,我不需要为每个市场单独处理时间格式。这是统一数据入口带来的便利——如果我自己维护两个市场的数据源,时间轴对齐是我要额外处理的环节。
验收三:字段结构对照官方文档,不凭感觉
核心判断:字段名、单位、嵌套结构要和官方文档对得上。
get_kline_latest 返回里的 time 字段,我也一并检查。我实际调用的 1d K 线返回:
{
"code": 0,
"message": "success",
"data": [
{
"symbol": "AAPL",
"type": "stock",
"interval": "1d",
"klines": [
{
"time": 1789099200000,
"open": "327.45",
"high": "336.22",
"low": "326.3",
"close": "332.27",
"volume": "50716865",
"quote_volume": "16888803875"
}
]
},
{
"symbol": "688256.SH",
"type": "stock",
"interval": "1d",
"klines": [
{
"time": 1789315200000,
"open": "1020",
"high": "1039",
"low": "998.88",
"close": "1035.43",
"volume": "52109",
"quote_volume": "5298311100"
}
]
}
]
}
time 是毫秒级时间戳,AAPL 的 close 和 get_ticker 的 last_price 一致(332.27),说明两个接口的数据源是同一套。这个交叉验证,比单看一个接口更可靠。
我还拉了 get_kline 的历史 K 线做连续性检查(AAPL,1d,最近 5 根):
{
"code": 0,
"message": "success",
"data": {
"symbol": "AAPL",
"type": "stock",
"interval": "1d",
"klines": [
{"time": 1788494400000, "open": "328.305", "high": "328.93", "low": "317.86", "close": "319.97", "volume": "39606884"},
{"time": 1788840000000, "open": "317.1", "high": "320.7", "low": "314.9", "close": "316.22", "volume": "35477090"},
{"time": 1788926400000, "open": "315.485", "high": "319.15", "low": "309.9", "close": "315.34", "volume": "65639962"},
{"time": 1789012800000, "open": "316.67", "high": "326.74", "low": "316.51", "close": "326.57", "volume": "70011913"},
{"time": 1789099200000, "open": "327.45", "high": "336.22", "low": "326.3", "close": "332.27", "volume": "50716865"}
]
}
}
5 根 K 线时间连续、无缺失,收盘价前后衔接正确。
可带走物:五项检查清单
把这套验证固化下来,我用的是一份五项清单。每次配置新环境或换数据源,逐项过:
□ get_ticker 返回中包含 timestamp 字段
□ timestamp 是 13 位毫秒级整数
□ 转换后的北京时间落在目标市场交易时段
□ get_kline_latest 的 close 与 get_ticker 的 last_price 一致
□ 请求的所有 symbols 都在返回里出现
这五项覆盖了前面四层需求:第 1-2 项解决"拿到的新不新",第 3 项解决"不同市场能不能比",第 4 项解决"数据源是否一致",第 5 项解决"调用是否完整"。清单本身解决的是第 4 层"能不能复用"。
注意事项:三类常见错误怎么修
配置路径。 MCP 客户端的配置文件位置因工具而异,写错路径的表现是"server 没注册成功",但报错不一定直说。修复动作:先确认客户端文档里的配置位置,再写 server 块。
鉴权头用错。 TickDB MCP 侧用 X-TickDB-Key,REST 侧用 X-API-Key。混用的表现是调用返回鉴权失败,而不是数据。修复动作:MCP 配置里统一用 X-TickDB-Key。
symbols 后缀写错。 get_ticker(symbols="AAPL,688256.SH") 里,美股用代码,A 股用带交易所后缀的代码。后缀写错的表现是返回里缺该标的,而不是报错。修复动作:用 get_available_symbols 先确认标的写法,再调用。
这三类错误的共同点是:报错表现不直观,但都能用一次最小调用测出来。
注意事项:什么情况下不需要接 MCP
这套配置不是所有研究工作流都必要。以下场景,接了是过度配置:
- 纯日频研究,且用行情软件人工核对价格——你已经在人工验证,MCP 的 timestamp 验收对你没有增量。
- 不需要在 AI 对话里取实时数据——如果 Claude 只用来写代码、改文档,不参与取数,那不必接。
- 单市场、单一数据源、且已有稳定自建管道——如果你的自建层已经处理了时间戳统一,MCP 是另一条路,不是必须替换。
反过来,如果你符合以下任一情况,这套配置的收益会明显:需要跨市场对比、需要在 AI 对话里直接取数、需要每次取数都带可验证的时间来源。
TickDB MCP 工具覆盖哪些能力
get_ticker 和 get_kline_latest 调通之后,其余工具的调用方式相同。MCP server 目前提供 13 个工具,覆盖行情、K线、资金流、盘口、交易日历等。以下是其中主要的行情与市场数据工具:
| 工具名称 | 用途 |
|---|---|
| get_ticker | 实时行情快照(last_price + timestamp) |
| get_kline_latest | 最新 K 线(含 time 字段) |
| get_kline | 历史 K 线(OHLCV) |
| get_available_symbols | 查询可用标的 |
| get_capital_flow | 资金流向 |
| get_intraday | 日内分钟/逐笔 |
| get_market_metrics | 市场指标 |
| get_order_book | 盘口深度 |
| get_recent_trades | 最近成交明细 |
| get_trade_days | 交易日历 |
| get_trading_sessions | 交易时段 |
每个工具返回的字段结构不同,但"字段存在 + 时间合理 + 结构对照文档"这三条验收逻辑是一样的。
FAQ:MCP金融数据常见问题
MCP 如何连接金融行情数据?
通过 MCP server 把行情 API 包装成 Claude 可调用的工具。配置完成后,Claude 发起工具调用,拿到结构化返回。验证方式:调用 get_ticker,检查返回里是否有 timestamp。
大模型如何调用金融数据 API?
模型本身不直接调 API,是通过 MCP 这类协议层转接。顺序很重要:先取得结构化事实(标的、字段、时间戳),再让模型分析。反过来做,分析结论没有可追溯的数据基础。
AI Agent 如何获取可追溯的行情数据?
每条数据带标的、字段、时间戳三个要素。可追溯的意思是:你能从返回的数字反查到它的时间来源。时间戳能转成市场当地时间并落在合理交易时段,就是可追溯。
Claude 如何接入实时股票数据?
配置 TickDB MCP server,确认鉴权头用 X-TickDB-Key,然后做一次最小调用验证。重点不是"接上了",是"接上之后返回的数据带不带 timestamp"。
TickDB 支持哪些市场?
覆盖 A 股、美股、港股、中国期货、外汇/贵金属、指数等市场。在本文场景里,我主要验证了 A 股(寒武纪 688256.SH)和美股(AAPL)两个市场,两者在同一套 MCP 调用里返回,时间戳口径一致。
MCP 和 REST 我该用哪个?
如果你需要让 AI 工具在对话里直接取数,用 MCP——它是面向 AI 工具的接入层。如果你是在自己的代码里批量拉数据、跑回测,用 REST——它更适合程序化调用。两者底层是同一套数据,区别在接入方式。本文场景是前者。
MCP 金融数据接入,关键不是能不能取到数字,是取到的数字能不能验证时效。
现在打开你的 MCP config,调用一次 get_ticker,把返回的 timestamp 转成北京时间,对照上面那份五项清单过一遍。
通过 TickDB API 获取实时行情数据
一个 API 接入外汇、加密货币、美股、港股、A股、贵金属和全球指数的实时行情。支持 WebSocket 低延迟推送,免费开始使用。
免费领取 API Key查看 API 文档