AI 怎么拿到实时行情和财报
- 说清一次工具调用真实发生的四步,能判断眼前这个数字是模型查来的还是它自己写的
- 认出工具环节最容易出事的三类情况:空值分不清、结果被截断、数据源被自动换掉
- 拿到一套评估 AI 投研系统的新视角——评的不是模型多聪明,是它接的那几根管子有多可靠
你让 AI 帮你看一家公司,随口问了一句:它最近一个季度的营业收入是多少。
它答了。一个具体的数,后面还跟着同比变化,措辞干脆利落,没有半点犹豫。
现在请你诚实地回答自己一个问题:你怎么知道这个数是它查来的,还是它自己写的?
从屏幕上看,这两种情况长得一模一样。都是一个数,都很笃定,都没有「我不太确定」这四个字。而这两种情况在投研里的分量,差了十万八千里——一个是可以往下走的事实,一个是能把你整条推理链带沟里去的假货。
要分得清,就得知道它拿数据这件事,底下到底是怎么运转的。
玻璃房子里的分析师
先不管技术。想象一个场景。
你雇了一个分析师,把他关在一间玻璃房子里。房子隔音、没有网线、没有手机信号,只有一个小窗口。他手边有的只有他脑子里读过的那些东西。
你问他一个问题。他有两个选择。
第一个选择:凭记忆答。他读过的东西多,很多问题他确实答得上来——但他脑子里的东西停在某一天,之后发生的一概不知,而且他自己意识不到这件事。
第二个选择:写一张条子从窗口递出去。条子上写着「请帮我取某某公司最近八个季度的利润表」。窗外站着一个跑腿的,接过条子,出门去查,回来把材料从窗口塞进去。
关键在这儿:分析师本人从头到尾没出过那间屋子。 他不会上网,不会连数据库,不会打电话。他唯一多出来的能力,是「会写条子」。
材料准不准、全不全、是不是最新的,取决于跑腿的那个人靠不靠谱、去的是哪家资料室、路上有没有偷懒。跟玻璃房子里那位有多聪明,一点关系都没有。
这就是工具调用。你听到的「AI 能查实时行情」「AI 能读财报」,说的其实是这套跑腿机制,不是模型本身长出了新器官。
这件事对做投研意味着什么
这个区分不是抠字眼,它直接改变你该盯哪儿。
第一,数据质量的责任在工具那边,不在模型那边。
你换一个更聪明的模型,玻璃房子里换了个更资深的分析师,条子写得更专业了——但跑腿的还是那个人,资料室还是那家。数据错了还是错,缺了还是缺。很多人花大力气比较用哪个模型,却从没问过一句「它的数据是从哪儿来的」,这个精力分配是反的。
第二,评估一套 AI 投研系统,重点是评那几根管子。
问题清单应该是:行情从哪来、有没有复权、财报是原始申报口径还是加工过的、更新到什么时候、A 股港股美股是不是同一个源、拿不到的时候会怎么样。这些问题一个都不涉及模型,但它们决定了输出能不能用。
第三,也是最实用的一条:你可以直接问它「这个数你是查的还是想的」。
在一个把工具调用记录留下来的系统里,这个问题是有答案的——哪一步调了什么工具、传了什么参数、返回了什么,都是可以摊开的。这也是逼它交出处那套做法能成立的技术前提,怎么逼它把出处交出来 那篇专门讲怎么把这件事变成固定动作。而在一个没有工具、只有一个聊天框的地方问同样的问题,你只会得到另一段听着很像出处的话。
一次工具调用,实际发生了什么
现在拆开看。以开源 AI 投研项目 Vibe-Trading 为例,它的工具层结构很干净,正好拿来说明。
第一步,把工具做成一张说明书。
每个工具在代码里是一个类,必须写清三样东西:名字、一句给模型看的描述、以及参数格式。比如取行情那个工具,名字叫「取市场数据」,描述里写明「在你自己动手写抓取脚本之前,先用这个」,参数包括标的代码、起止日期、数据源、K 线周期。
然后有一个方法,把这三样东西打包成模型能读懂的格式,交给模型。注意,交过去的只是说明书,不是工具本身。 模型看到的是「有这么个东西,叫这个名,能干这个,要这几个参数」——就像玻璃房里贴了一张纸,写着窗外能帮你办哪些事。
第二步,模型输出一个调用请求。
模型这一轮不再吐一段分析,而是吐一个结构化的东西:工具名 + 一组参数。这就是那张条子。写完它这一轮就停了。
这一步是整件事的命门:模型做的全部动作,就是「写条子」。 它没有执行任何东西,也没有能力执行任何东西。
第三步,外面的程序去执行。
有一个注册表,按名字找到对应的工具,把参数传进去跑。这里有两个细节值得记住:找不到这个名字,返回一条错误;执行过程中报错,捕获下来,也返回一条错误。
第四步,结果作为一条新消息塞回对话里。
跑腿的把材料从窗口塞回去,模型接着往下想。
四步走完,你屏幕上才出现那个数。而你看到的只是最后一句话,中间三步默认是不显示的。
顺带说一句,这四步是 Agent 循环里的一环,循环本身的问题——比如它该调工具的时候没调、或者反复调同一个——是另一个话题,Agent 循环 那篇在说。这里只盯着「拿数据」这一段。
坑一:空值,和「我没查到」长得一模一样
看一个真实的设计细节。那个查大宗交易的工具,代码注释里写了一句:返回空列表,是一个合法的、非错误的结果——因为这段时间确实可能一笔都没有。
这句话完全正确,工程上也只能这么处理。但它带来一个后果:
「这只票最近一个月没有大宗交易」和「我这次没查着」,在返回值上是同一个东西——一个空列表。
模型看到一个空列表,它无法区分这两种情况。而它偏偏又是一台被训练成「总能接上话」的机器。于是常见的两种翻车方式是:
一种是把「查不到」说成「没有发生」。空的就当没有,写进结论里变成「未见异常」。在投研里,「没有」和「不知道」是两个完全不同的证据,前者能支持判断,后者只能支持继续查。
另一种更糟:它拿记忆去填那个空。手上没有数据,但报告需要一个数才显得完整,于是从训练语料里翻出一个印象中的数字放上去。这类事情不是偶发意外,是这台机器的默认行为,幻觉与事实核验 那篇把它的成因说得更透。
自查动作很简单:凡是「未发现」「无异常」「没有相关记录」这类否定结论,都要单独回去确认一次——确认的是查询本身跑通了没有,而不是结论本身。
坑二:结果被悄悄剪掉,它当成了全部
这个坑更隐蔽,而且我在源码里读到的那段注释,是这一整篇里最值得你记住的东西。
工具返回的材料可能非常长——几十个季度的利润表、几百行行情。但塞进对话的内容有长度上限(代码里是一个常量,属于当前默认值,可配置)。超了怎么办?剪掉。
问题是剪的方式。项目里那段注释写得很直白,大意是:悄悄剪掉的结果,和一个完整的答案在模型看来毫无区别,于是模型会把开头那一小截当成全部,照着往下讲。
紧接着注释里记了一次实测:调用财报工具取某只美股的季度报表,本该返回四十个报告期,静默剪掉之后,真正送到模型面前的大概只有十来个。
请把这个后果在脑子里过一遍。你让它「看看这家公司过去十年的利润趋势」,它只看到了最近三年,然后给你写了一段关于十年趋势的分析——语气一样自信,结构一样完整,唯一的区别是那七年它根本没见过,而它不知道自己没见过。
这个项目的处理办法是:剪的时候必须留一句明确的话,写清送了多少、总共多少、剩下的没送,并且告诉模型别把这当成完整结果,要么缩小范围重问,要么用分页参数再取一次。
从「悄悄剪」改成「剪了并且说」,代码没多几行,但这是诚实和不诚实的分界线。 你评估任何一套 AI 投研工具,都可以拿这条去量:它遇到装不下的时候,是闭着眼睛剪,还是剪完告诉你。
坑三:数据源被自动换掉了,你不知道这个价是谁给的
再看取行情那个工具的参数。数据源那一项是个枚举,列了将近二十个可选项——各家免费的、要钱的、覆盖 A 股的、覆盖美股港股的、覆盖加密货币的。默认值是「自动」。
「自动」的说明里写着:根据标的代码的格式判断该用哪个源,并且带回退。
回退就是:首选的那个源没响应,换下一个。这个设计在工程上非常合理,不这么做系统会经常性罢工。但对投研来说,它意味着一件事:
你今天拿到的这根 K 线,和上周那根,可能来自两个不同的数据商。
不同数据源之间,复权方式可能不同、停牌日怎么填可能不同、盘后修正什么时候同步可能不同、小数位怎么取舍可能不同。单看一根线你看不出任何异样,但你要是拿这些数去算收益率、去比对两个时间段,差异就悄悄进去了。
而模型对此一无所知——它拿到的是一张表,表上没写「本次由备用源提供」。
这一条和量化里那个老问题是同一个病根:你以为你在用同一套数据,实际上底下换过。时点数据的那套讲究——时点数据——之所以要抠到「当时能看到的版本」,就是因为数据这东西比人想的活。
自查动作:任何要做纵向比较、要算收益率的场合,先确认整段数据来自同一个源。 拿不准就别比。
坑四:报错也只是一条普通的文字
前面说过,工具执行失败会被捕获,然后返回一条内容是错误信息的消息。
注意这个「返回」的性质。它返回的是一段文字,跟正常的数据一样,作为一条普通消息塞回对话里。它不是一个红色警告框,也不会让整个流程停下来。
于是模型完全可以选择——不是恶意的选择,只是它接话的天性——绕过去。上一步取数失败了,它可以不提,转而用一些不依赖那个数的表述把这一段圆过去:「从行业整体情况来看」「结合此前的公开信息」。段落读起来是通的,你根本看不出这里缺了一块。
这就是静默降级:流程没断,输出照给,只是里面少了一块,而且没人告诉你少了哪一块。
对付它只有一个办法,就是别只看最后那段结论。要么看得到工具调用的执行记录,要么在指令里明确要求「任何一次取数失败必须在正文里单独列出来」。把这条写进提示词是有用的,虽然不是百分之百可靠——所以能看记录的时候,永远优先看记录。
最危险的一种情况:报告写得完整、流畅、有理有据,但它建立在一段残缺的数据上。 你从文字里读不出残缺。残缺不体现为语气犹豫,也不体现为结论保守——它体现为一段本该更谨慎的话,被讲得和别的部分一样自信。所以在 AI 投研里,判断可信度的着力点不在文字质量上,在数据链路上。
那到底该怎么用
给你四个可以立刻执行的动作。
一、把关键数字回到原始文件里对一遍。 不是全部,是那几个真正撑着你结论的数。这一步永远省不掉,怎么用好一手资料 那篇讲的就是这个习惯。
二、优先用能看到调用记录的工具。 只给你一段漂亮结论、不给你中间过程的产品,你没有办法验证它。同样一段话,一个可查、一个不可查,价值完全不同。
三、否定结论单独确认。 「没查到」和「不存在」,只有你自己能分清。
四、要求长任务分段做。 与其让它一次读完十年财报,不如按年分批取、每批让它明确报告取到了什么。这样截断和失败都会暴露出来。想让工具环节更规范一些,把接口标准化是一个方向,MCP 那篇会说到,也可以顺着 AI 联网检索 那篇看联网取材这一类工具的特殊之处。
最后必须讲清一条边界。这一整篇讲的都是取数据这类工具,也就是只读的、拿回来给你看的。工具体系里还有另一类是能对外产生动作的——下单、划转、修改配置。这两类的风险完全不在一个量级:取数错了你损失的是判断质量,动作错了损失的是真金白银,而且不可撤销。任何涉及动作类工具的场景,都必须有明确的授权边界、额度上限、随时可中断的开关和完整的审计记录,缺一条都不该开。本篇讲的是怎么把材料拿准,不是怎么让它替你按按钮。
小结
- 模型不会上网也不会查库。它只会输出一个「我要调某个工具」的请求,真正执行的是外面的程序。它是玻璃房子里那个只能写条子的分析师。
- 数据质量的责任在工具那边。 换更聪明的模型不解决数据问题;评估一套 AI 投研系统,重点评它接的那几根管子。
- 空列表既可能是「真的没有」,也可能是「没查到」,两者长得一样。否定结论必须单独确认。
- 结果超长会被剪掉,悄悄剪和完整答案在模型看来无法区分——源码注释里那个「四十个报告期只送到十来个」的实测,是这一整套坑里最该记住的一件事。
- 数据源可能被自动回退换掉,你拿到的两段数据未必同源。做纵向比较前先确认。
- 工具报错只是一条普通消息,模型可能绕过去接着说,这就是静默降级。只看结论永远发现不了它。
- 取数类工具和动作类工具风险不在一个量级,后者必须有授权边界、额度限制、可中断、可审计。
一句话记住这篇:它说得再准,也只是转述了跑腿的人递进来的那张纸——你要盯的是那个跑腿的,不是它。
本文所引源码均来自上述快照版本,是阅读代码与注释得出的机制说明,不是运行结果。本文不评价任何工具或方法的盈利能力。回 量化与 AI 投研概念库 看其它概念;本站内容为投资教育,不构成任何投资建议,边界见 免责声明。
本文为投资教育整理,关键数据与结论请结合下列权威来源验证。