在金融数据这个行当里待久了,你会发现一个非常明显的分裂:一边是撑起全行业报价、行情、公告、财务数据的传统 API 体系和终端生态,一边是最近一年多开始疯狂渗透进来的 MCP、智能体、多智能体这些新名词。两边还没有真正正面交锋,但做数据平台的人已经能明显感觉到,旧接口正在被 AI 时代的应用拉扯着往前走。
这篇文章想聊的,不是“哪家终端更好用”的站队问题,而是一个更实际的工程问题:当 AI 智能体开始替人看数据、查数据、盯数据的时候,传统金融数据商的 API 模式还能撑多久?为什么 MCP(Model Context Protocol)这类把“接口”变成“能力”的协议,会被越来越多团队当作分水岭?以及,为什么金融数据的未来大概率是多智能体协作,而不是一个大模型包打天下?适合数据工程师、投研平台开发者和关注 AI 应用的量化从业人员一起讨论。
1. 传统金融数据终端的“API 老路”到底卡在哪
1.1 从终端进化出 API,但 API 始终带着“终端思维”
很多年轻工程师第一次接触金融数据 API 时,都会有一种错觉:这东西好全,什么数据都能拉。用久了才发现,它的全,是站在“终端界面”的角度设计的全,而不是站在“任务流程”的角度设计的全。
传统终端最早是给交易员和研究员看的,屏幕上是一个个函数页面:行情页、公司资料页、财报页、新闻页。后来开放 API,本质上是把这些页面背后的数据“凿了个洞”透出来,而不是重新为程序化使用设计一套数据服务。所以你经常遇到这样的情况:想在程序里算“某公司近三年毛利率变化”,终端里需要分别在三个页面找数据,API 里同样要调三个不同模块的接口,然后自己拼字段、对时间、统一货币单位。这不是工程师笨,而是接口本身就是按页面模块切的,不是按业务任务切的。
1.2 授权、版本、时区、复权:四个让工程师掉发的细节
传统金融数据 API 真正磨人的,往往不是大功能,而是一堆小细节。我今天做数据平台时,最常被问到的问题集中在四类:
| 细节 | 常见的坑 | 对程序化使用的影响 |
|---|---|---|
| 授权模型 | API 权限跟着终端席位走,多人共用要抢授权 | 智能体/多个进程并发取数时经常被限流或拒登 |
| 字段版本 | 调整后字段不保证向后兼容,旧代码静默出错 | 需要维护一层字段映射和兼容层 |
| 时区口径 | 同一事件在不同接口里可能用纽约时间、伦敦时间、本地时间 | 跨市场拼接数据时容易错位对不上 |
| 复权因子 | 复权计算口径各模块不一致 | 回测和实盘信号偶尔会对不上 |
这几个问题单独拎出来都不难解决,难的是它们叠加在一起。我在多个项目里都维护过一个“适配层”,专门做字段映射、时区统一、版本回退。这个适配层本身工作量不小,但它恰恰说明了最核心的问题:传统 API 提供的是“原始数据的碎片”,而不是“可以直接使用的答案”。
1.3 无状态请求,接不住“有状态的研究过程”
更根本的问题是状态。一个研究员的工作流从来不是“拉一次数据”就结束的,他通常会经历:建立跟踪列表、形成初步假设、拉历史数据验证、补充同行对比、观察后续变化、反复修正判断。这是一个有状态、有上下文、有记忆的过程。
但传统 API 是基于“请求—响应”模型设计的,每一次请求都是独立的,不记得你上一轮查了什么,也不知道你为什么要查这个字段。这在纯脚本时代没问题,因为脚本自己管理状态。可到了智能体时代,问题就暴露了:智能体需要把一个研究过程拆成几十个动作,并记住每个动作的上下文,如果每个动作都要回到“无状态接口”的世界里自己拼装,那智能体的优势就废了大半。
2. MCP 之所以重要:它把“数据接口”升级成了“能力协议”
2.1 从“取数接口”到“可调用的数据工具包”
MCP 的核心理念,简单说就是给智能体提供一套统一的“工具发现与调用协议”。过去我们集成数据源,是给模型写提示词、给代码写函数、给用户写说明书,让模型学会“该调哪个接口、传哪些参数、怎么解析返回”。而 MCP 做了一个关键转折:把数据服务封装成一个个“工具”,智能体通过统一协议自动发现工具有哪些、每个工具需要什么参数、调用后返回什么结构,然后直接调用。
用大白话类比:传统 API 是告诉一个实习生“去第三层的档案室,找第二个柜子,拿蓝色文件夹,翻到第 7 页,把表格抄回来”。MCP 是直接给实习生一个工具箱,箱子上贴着标签:“季度财务数据”“行业对比”“公告检索”,他只要说出需求,工具自己会去相应的位置取东西。对智能体来说,后者友好得不是一点半点。
我个人的看法是,MCP 不是突然冒出来的技术,它更像是“把多年来的 API 治理经验协议化”的产物。它的意义不在协议本身有多新,而在于它首次让数据提供方能够站在“使用者是智能体”的角度来设计接口。
2.2 资源、工具、提示词:MCP 三个原语在金融场景的映射
MCP 有几个基础原语:资源(Resources)、工具(Tools)、提示词(Prompts)。在金融数据场景里,这三者恰好对应三类非常具体的东西,整理一下就是:
| MCP 原语 | 金融数据中的对应物 | 说明 |
|---|---|---|
| 资源 | 数据集、公告原文、公司卡片、行业分类表 | 只读的数据对象,智能体可以引用和检索 |
| 工具 | 历史行情区间统计、财务指标计算、事件订阅、估值筛选 | 可执行的动作,智能体调用后拿到计算结果 |
| 提示词 | 完整的投研报告框架、财报解读步骤、风控核查清单 | 标准流程模板,降低智能体“从零开始”的出错率 |
这个映射关系做出来后,很多设计问题立刻清晰了很多。你不需要把“历史行情区间统计”拆成一堆字段拼接的取数接口,而是把它定义成一个工具:输入是股票代码、起始日期、结束日期、统计口径,输出是已经算好的收益率、波动率、最大回撤。智能体不需要懂底层数据库结构,只需要会调用这个工具。
我在几个原型项目里把常用查询包成 MCP 工具后感受很深:过去的做法是“教模型写代码去查数据库”,现在的做法是“教模型用工具”。前者容易产生幻觉,模型会猜字段名、猜口径;后者把口径和权限都固化在工具定义里,模型出错的空间小很多。
2.3 数据商会从 MCP 里得到什么,也要交出什么
对传统数据商来说,MCP 既可能是挑战,也可能是难得的转型窗口。
挑战很明显:MCP 把“数据访问”和“终端界面”彻底解耦了。过去终端是一个绑定生态,用户因为界面、插件、社区留在里面;而 MCP 时代,数据服务变成了标准化的工具包,哪个数据商的工具质量好、覆盖全、价格合理,智能体就优先调用谁。用户的迁移成本会显著下降。
机遇同样明显:哪家数据商先提供高质量的 MCP Server,把行情、公告、财务、事件这些能力按协议标准化地开放出来,谁就可能成为新一代智能体的默认数据源。这不是猜测,我在自己的项目里就明显感觉到,当智能体已经习惯用某个数据源的 MCP 工具之后,再去换另一家,需要改提示词、改工具调用习惯,成本很高。先发优势在智能体生态里被放大了。
3. 金融数据的真实工作流,为什么天然适合多智能体
3.1 一次投研决策,背后是几十个数据动作的接力
我经常拿一个真实的投研场景来说明多智能体为什么必要。假设一个研究员要跟踪“某新兴行业板块的投资机会”,这个任务看起来是一个问题,实际执行起来是一串动作:先拉宏观数据看行业景气度,再检索最近三个月该板块的政策新闻,然后逐家拉上市公司的财务数据,算同比环比增长,再看市场行情里的估值分位,还要看一眼舆情指标有没有突发异常。
这个链条里,有结构化数据查询,有非结构化文本分析,有时序计算,有横向对比。如果全部交给一个大模型,让它自己决定先干什么后干什么、自己做每个子任务,很容易发生两类问题:一类是上下文爆炸,模型记不清前面算过什么;另一类是工具选择错误率上升,模型在几十个工具里频繁选错。而多智能体的思路很简单:把一个复杂任务拆成几个子任务,每个智能体只负责其中一类,各用各的工具、各记各的上下文,最后由协调者合并结果。
3.2 数据智能体的专业分工:采集、清洗、计算、风控
在多智能体的架构里,金融数据场景下的智能体分工大致可以是下面这个样子:
| 智能体类型 | 核心职责 | 典型工具与数据源 | 输出物 |
|---|---|---|---|
| 采集智能体 | 从各数据源获取原始数据,处理限流、重试、增量同步 | 行情接口、公告接口、新闻流 | 规范化后的结构化数据包 |
| 清洗智能体 | 做字段映射、去重、时区统一、异常值标注 | 字段映射表、质量规则库 | 干净的宽表 |
| 计算智能体 | 执行指标计算、统计回归、组合分析 | 指标计算工具、历史行情工具 | 指标结果集 |
| 风控智能体 | 检查权限边界、识别敏感数据、校验结果一致性 | 权限服务、审计日志、口径规则 | 合规校验报告 |
这样的分工还有一个额外的好处:每个智能体可以单独训练提示词、单独调参、单独评测。采集智能体出了问题,不需要去动计算智能体的逻辑。我在项目里实际感受是,调一个“只会取数”的智能体,比调一个“什么都管”的超级智能体容易太多了。
3.3 协调者与复核机制:多智能体不是多模型轮播
有一点必须澄清:多智能体不是“我有三个模型,轮流出来回答”。那种做法本质上是模型路由,不是多智能体。真正的多智能体是有一套协作机制在里面的,核心是两类角色:
第一个是协调者(Coordinator),负责拆解任务、分派给各个智能体、收集结果、判断是否需要追问或二次迭代。协调者像是项目经理,它不需要自己动手造数据,但需要理解任务的依赖关系。
第二个是复核者(Reviewer),负责独立检验其他智能体的输出。这非常重要——金融数据场景里,单一智能体的计算错误如果没有被发现,直接进投研报告,后果比“暂时查不到数据”严重得多。让两个不同的智能体独立算同一个指标,结果一致才输出,不一致就触发人工复核,这个机制我用下来非常有效。
说到底,多智能体的本质是“数据的流动配上职责的分工”,它天然匹配金融数据的任务形态,而不是为了炫技而存在。
4. 从理论到骨架:一套可落地的多智能体金融数据架构
4.1 分层设计:界面层、协调层、数据能力层、数据源层
前两节讲了为什么,这一节讲怎么落地。我多次使用并验证过的一套分层架构是这样的:
| 层级 | 职责 | 需要注意的点 |
|---|---|---|
| 界面层 | 投研人员的对话界面/报表界面 | 展示结果时必须能下钻到数据来源 |
| 协调层 | 任务分解、调度、结果汇总、异常处理 | 必须有状态管理和幂等控制 |
| 数据能力层 | MCP Server 集群,把内部数据服务封装成工具 | 每个工具都要带权限、审计、口径说明 |
| 数据源层 | 传统终端 API、数据仓库、消息流、第三方数据 | 这一层尽量稳定,不要频繁改接口 |
最值得花精力的不是界面层,而是数据能力层。我为什么强调这一层?因为它是一个“翻译层”,把底层混乱的数据源统一成智能体友好的工具接口。数据源层今天换一家供应商、明天加一个字段,只要这个翻译层稳定,上层智能体完全不用改动。这层做得好不好,直接决定了整个系统的可维护性。
4.2 选型思路:协议优先于品牌,可追溯优先于炫技
关于选型,我的核心建议是:协议优先于品牌。不管选哪家框架,只要它遵循 MCP 协议,内部逻辑可以随时替换。这一点非常重要,因为多智能体领域迭代太快,今天选的编排框架,半年后可能就被另一个项目取代了。但 MCP 的工具定义、资源定义、调用方式是可以沉淀下来的资产。
模型选择上,我会刻意做“大小模型分层”。结构化计算、数据清洗、指标计算这些任务,优先用确定性程序或本地小模型,而不是把所有任务都丢给大模型。大模型只保留在最后综合判断、生成研究报告摘要、理解模糊语义这类任务上。原因很简单:确定性计算不准和模型能力无关,是因为代码写错了;小模型或程序处理这类任务,速度快、成本低、可重复。
会话和状态管理上,我建议用消息队列加持久化存储来维护任务状态。每个任务记录在哪个步骤、依赖哪些上游结果、输出是否已被复核,全部落库。这样即使某个智能体崩溃重启,协调者也能从持久化状态里恢复,而不是重新跑一遍。
4.3 最小可用原型:三个智能体跑通一次定时复核
我给出一个最简原型的伪代码结构,我自己在早期验证时就是这么写的,逻辑非常朴素但足够验证整个链路:
# 定义三个基础智能体 class MarketDataAgent: def fetch(self, symbol, start, end): tool = mcp_client.load_tool("market_quote_history") return tool.call(symbol=symbol, start=start, end=end, adjust="forward") class FinancialIndicatorAgent: def compute(self, df): tool = mcp_client.load_tool("financial_indicator") return tool.call(df=df, indicators=["roe", "gross_margin", "revenue_yoy"]) class ReportAgent: def summarize(self, indicator_result, market_result): prompt = load_prompt("quarterly_review_short") return llm.generate(prompt, context={ "indicators": indicator_result, "market": market_result }) # 协调者:负责任务拆解与结果整合 class Coordinator: def run(self, task): df = market_agent.fetch(task.symbol, "3y", "today") indicators = indicator_agent.compute(df) report = report_agent.summarize(indicators, df) return report这个原型跑通后,我马上加了一个“复核智能体”,让它用不用的计算口径独立再算一遍关键指标,两边一致才进报告。第一次跑的时候,两个智能体在“复权因子是否包含”这个口径上出现了不一致,幸好被复核机制拦住了。这个案例可以说明一个道理:最小原型不是拿来演示的,是拿来逼你面对口径问题、权限问题和审计问题的。
5. 多智能体不是银弹:数据质量、幻觉与审计的硬约束
5.1 数据血缘:每个数字都得能追回到源头
多智能体系统里最危险的事情不是智能体不够聪明,而是它把结果包装得太漂亮,没人知道数字怎么来的。所以我在任何设计里都把数据血缘放在第一位。
具体做法是:每个智能体返回的结果,必须携带数据引用信息,包括数据源标识、数据版本、时间戳、口径说明。比如“近三年毛利率均值 = 32.5%”这条结果,必须能追溯到“用的是哪份财报数据、哪个版本的字段映射、截至哪个时间点”。我在结果结构里固定了几个字段:source_id、data_version、as_of_time、caliber_desc。没有这四个字段的输出,一律视为无效结果。
为什么这么严格?因为金融数据的价值建立在可验证性上。你不验证,一次口径错误就能让整个分析失真。这个“带血缘”的约束,从第一个原型就要加进去,后面再加成本很高。
5.2 幻觉控制:把“不确定”作为一种法定输出
大模型在处理金融数值时会有一种很具迷惑性的表现:明明记不清某个数据,却会编一个看起来合理的数字填上。为了对抗这个问题,我给每个对接数据的智能体设定了三档输出:
- 确定:模型有充分依据。
- 低置信:推理过程合理,但数据完整性或时效性存疑。
- 不确定:缺少足够信息,不得编造。
只需一个很简单的规则:任何进入投研结果的数值,如果是“低置信”或“不确定”,必须显式标注,并触发协调者回源核实或者请求人工干预。把“不确定性”变成一种法定输出,而不是让模型自行吞掉,是我试过最有效的幻觉控制手段,它不增加多少成本,但极大降低了“漂亮错误”出现的概率。
5.3 权限留痕与合规边界:智能体执行,人类担责
多智能体系统里每个智能体都在执行操作,你可能以为只要系统层面有权限控制就够了,但没那么简单。任何权限控制,如果不落到“服务身份”和“审计日志”上,都是虚设。
我的建议是:每个智能体配置独立的服务账号,权限最小化。采集智能体只读行情和公告,计算智能体只有计算工具的权限,任何一个智能体都不应该有“拉全量数据库”的权限。同时,所有工具调用都会写入审计日志,记录哪个智能体、在哪个任务、出于什么原因、调了哪个工具、返回了什么内容。不要问“记录这些有什么用”,等到出问题需要回溯时,你只会嫌当时日志记录得太少。
另外有一条红线我强烈建议任何团队都不要踩:不要直接把敏感数据原样喂给大模型。在大模型里去识别敏感字段、做脱敏再传输的成本很低,但忽略它的后果往往会很严重。
5.4 成本和延迟的现实问题
纯理想地搭建多智能体架构很容易,但真实跑起来,成本和延迟会迅速教你做人。我遇到过的情况是:一个看起来简单的“行业对比分析”任务,如果每个子任务都调用大模型,一次任务消耗的令牌数量和等待时间甚至比人工查数据还慢。
解决思路就是前面提到的“大小模型分层 + 确定性程序优先”。能用一行 SQL 或一个统计函数完成的,绝不让大模型做;大模型只做语义理解和结果综合。成本优化不是上线后才做,而应该在做架构设计时就考虑进去。
6. 采用路线:先单点改造,再编排协同
6.1 第一步:把最常用的三类内部数据服务协议化
很多团队听到“多智能体”就觉得很宏大,想一步到位。我建议反过来,先挑最常用的三类数据服务做协议化改造:行情查询、公告检索、财务指标计算。这三类基本覆盖了投研日常 70% 以上的取数需求。
做法也很直接:用 MCP Server 把这几个服务封装成工具,定义好输入参数、输出结构、权限边界。暂时不搞智能体,先让团队里的工具能通过统一协议被调用。这一步的收益非常即时:内部不同系统之间互相调用变得规范了,字段口径问题在工具层就统一掉了,新来的工程师也不用再翻一堆 API 文档。
6.2 第二步:一个智能体试点,跑通“提问—取数—复核”闭环
协议化之后,再上第一个智能体,范围要窄。我建议只做一个“财报答疑智能体”,让它能回答公司财务指标类问题,每个回答必须附带数据来源和时间。同时加一套简单的评测集,里面放 50 个典型问题,每次改动后都跑一遍,观察三个指标:取数成功率、口径正确率、回复延迟。
我个人的经验是,这个阶段最花时间的不是智能体本身,而是评测集的积累。你不跑评测,永远不知道它在哪些边界问题上会犯错。我最初放过一个很冷门的问题进去,结果智能体居然从一个不相关的行业分类里找到了“答案”,数据链完全错了,但表面看起来很专业。评测集就是用来抓这种问题的。
6.3 第三步:双智能体互证,再考虑全流程编排
单点跑稳之后,再考虑多智能体。但不要直接上“十个智能体全流程自动跑”,我推荐从“双智能体互证”开始:一个计算智能体负责算指标,一个复核智能体用不同的口径独立再算一遍,两边结果一致才输出。这个机制只要跑顺了,就等于验证了整个协调、消息传递、结果对比、异常处理的技术栈。
在互证机制稳定前,我强烈建议不要上更复杂的编排,原因很简单:如果两个智能体的结果对不上你都处理不好,十个智能体协作时的“错位放大”只会更难看。一步步来,每一步都有明确的验证点,这是最稳妥的路径,也是我踩过坑之后总结出来的规律。
6.4 几个被代价打脸后的提醒
最后分享几条我在真实项目里付出过代价后总结出来的教训。
第一,不要让大模型直接读全量公告。公告动辄几十页,直接全塞进上下文,成本高、效果差。正确做法是先用工具做分块检索,只把相关段落传给模型。
第二,不要用同步阻塞方式等待所有智能体完成。金融数据任务里有些数据源响应很慢,一个拖住全部,整个链路就卡死。用异步编排加超时降级,宁可让某个子任务超时后给“不确定”结果,也不要卡住整个流程。
第三,不要跳过数据版本管理。我见过最严重的线上事故,就是上游数据源悄悄调整了历史口径,而下游还在用旧版本算出来的缓存结果,导致同一段时间内的回测和实盘指标对不上。数据版本、工具版本、映射表版本,全部标记清楚,宁可多做一轮校验。
第四,先跑影子模式再取代人工流程。影子模式不复杂,就是让智能体和人工流程并行跑三个月,只记录结果不实际影响决策。等到对比数据积累够了,人工流程自然就可以退居二线。跳过这一步看起来很高效,实际上是在用真实业务的风险为智能体的错误买单。
我在实际使用中最深的体会是:金融数据项目的成功,往往不取决于模型多聪明,而取决于数据工具层做得有多扎实、复核机制有多严密、审计链路有多完整。MCP 给了我们一个很好的协议底座,多智能体给了我们一个合理的任务组织方式,但它们都只是工具。真正把这些工具变成可信生产系统的,是一个团队对数据质量的敬畏心,和对每一步验证的坚持。接下来你完全可以先把自己的内部数据服务协议化,再从一个最小试点开始,慢慢搭出一套属于你自己的多智能体金融数据能力。