夜雨聆风学习资料网

ARTICLE · 1118904

搭一套AI投研系统, 哪些开源能力值得借?

搭一套AI投研系统, 哪些开源能力值得借?

从Dexter的自然语言筛选,到财报检索,再到Qlib与RD-Agent:结合源码和本地对照,拆解哪些能力值得借、接在哪里,以及接入的先后顺序。

搭AI投研系统,很容易碰到一份看起来足够完整的技术清单:用金融API取数据,用Agent找股票,用检索框架读财报,再接一个量化平台验证想法。

每项都有现成项目。可放进自己的系统后,最先改善哪一步,往往没有项目介绍写得那么清楚。

我在做的AlphaSeeker,是一套把量化筛查、AI调查和候选比较连起来的股票研究系统。最近一轮开源调研,我把候选能力放回这些具体工作里,查源码,再用本地材料做对照。

目前最值得借的有三类:让AI能提出并执行筛选条件的查询工具;按研究问题定位财报原文的阅读工具;能接上自己的数据、和简单方法比较的量化实验组件。

财务工具还有一项更直接的工作:把已经算出的结果送到研究Agent手里。几次检查下来,这件事的优先级高于再接一套金融Agent。

下面这些取舍,主要来自9月的固定版本源码研究和本地试验。我也回查了后续实现,区分哪些当时只跑过原型,哪些已经接进当前代码。

先借查询能力,让AI能问出一个股票池

很多研究工具从“输入股票代码”开始。它能回答一家公司怎么样,却没有解决前一步:今天该研究哪些公司?

Dexter里值得看的是股票筛选入口。它先读取数据供应商支持的字段,再把自然语言问题转成明确的过滤条件,最后调用结构化筛选接口。模型负责理解问题,实际筛选由数据工具执行。

这条路径给AI增加了一种能力:把“我想看看什么”变成可执行的查询。它可以先提出条件,收到结果后再决定读哪些资料。

但借到这里,还没完成A股适配。供应商有哪些字段,字段适用于哪个市场,某个财务比率怎样计算,哪些数据在查询时点已经公开,都要由本地工具说清楚。

我会把接口拆成两步:先告诉Agent“当前可以查什么”,再让它提交有字段、有操作符、有日期的条件。工具返回证券、命中依据和缺项原因。自由现金流没有覆盖,就明确返回不支持;不能让模型把缺值当成0继续筛。

9月16日的本地原型验证了这种做法。行情底稿有4,344只证券,其中4,181只满足本次比较条件;但公告缓存只覆盖21家公司、67篇材料。这个覆盖差别必须放在结果旁边,否则“查询了一个大股票池”很容易被误读成“AI已经翻遍全市场公告”。

其中一组查询把“公告正文提到项目延期”和“指定交易日涨跌幅绝对值不超过2%”放在一起,找到了符合条件的材料。它能把文本事实与量化条件合起来,交给下一步研究。

这几组条件是检查材料后人工编写的,行情与材料也各有截止日期,所以它证明的是查询工具可用。自主提出更好问题、发现更值得研究的公司,还需要带工具的Agent实际比较。

我选择借Dexter的字段发现和查询设计,再接自己的A股数据。 当前AlphaSeeker已有可查字段描述和候选查询工具,结果进入原有研究资源分配与公司研究流程。这里采用的是工具设计,没有把Dexter整套运行环境搬进来。

Financial-API则更接近A股的数据接入:证券与板块查询、财务报表、候选集合的批量估值,以及行情落入本地数据库后的重复筛选。把查询结果留在程序侧,只向模型返回必要字段,也值得借鉴。

不过,公开仓库提供的是客户端、接口契约和Agent工具,底层数据仍由托管服务供应。它没有在这轮本地试验中实际调用;采用前还要核对覆盖范围与历史版本。

比如“2025年年报”是报告期间,“2026年某日披露”是公开时间。如果供应商只返回后来修订过的最新数值,即便给了这两个日期,也未必能还原历史那一天看到了什么。

所以,对我的系统来说,这类API首先是取数适配候选。只有数据口径、公开时间和原文来源能接回本地研究,它才真正减少工作。

图1|从研究问题到查询结果,再进入原有研究流程。机制示意。

财报检索先做轻,再决定要不要上重框架

PageIndex吸引人的地方,在于它把长文档组织成有层级的结构,让模型沿着目录和内容寻找答案所在的位置。面对数百页报告,这比把全文一口气塞进上下文更值得研究。

不过,接入前我得先知道:现有阅读工具到底漏在哪里。

9月16日的对照用了三份中报,共464页,固定了12个困难问题。比较时保留现有的原件、页码和邻近上下文,再试人工定向关键词、简单词重叠和BM25。BM25可以理解为一种根据词项匹配程度给文本排序的方法。

结果最有用的是下面几行。表中的字符数,是各题读取原文去重后再累计的数量。

找页方法
目标页齐全
原文字符
现有查找:首个主题词
8/12
189,000
现有查找:人工定向词
11/12
150,000
词重叠+完整前后页
12/12
132,000
BM25+完整前后页
12/12
126,000

这组结果改变了我的接入顺序。

先把首个主题词换成人工选定的定向关键词,现有工具就从8题补到了11题。再把候选页的前后页保留完整,简单词匹配也能覆盖全部预列目标页。BM25少读了一些原文,但在这组材料上没有独有的正确性增量。

因此,第一步值得做的是问题检索、候选页和完整邻页的组合。没必要把阅读能力的改善全部押在一个新框架上。

这个12/12只表示预先列出的证据页到达了阅读范围,没有运行12道模型答案的正确率测试。问题还参与过开发对照,它也不能代表所有财报。对技术选型而言,这个范围已经足以支持先接一层轻量工具。

后续AlphaSeeker的代码里加入了按问题搜索来源的工具,使用中文双字切分和文本匹配,并继续保留精确查找。PageIndex没有作为当前运行依赖接入。

完整研究还会出现单独找页试验看不到的成本。9月28日另一次两题研究对照中,常规路径和证据定位路径都保留了8项决定性事实;后者累计输入Token却从约72.9万增加到87.7万。

这不是前面12题检索试验的续测,但它提醒我:工具多了一步调用,可能又把目录、候选片段和正文重复送进模型。局部少读字符,不能直接写成整个研究更省钱。

PageIndex仍值得作为后续候选。等轻量方法在真实材料里反复漏掉跨章节关系,再用同一批问题比较它能补回什么、整个研究多花多少成本,采用理由会更充分。

找到那一页之后,数字还要能用

财报阅读还有两类工作,容易被“加一个检索框架”掩盖:表格数值的提取,以及提取结果怎样交给Agent。

一次Direct研究调用链检查发现,本地已经有财务工具,研究输入也支持财务目录,但构建任务时没有把预制工具传进去。

在同一份材料的隔离对照里,向研究输入补入预制财务工具后,财务条目从0变成了10。这里还没比较模型回答;它先确认了一件具体的事:原来已经具备的计算能力,没有完整到达消费者。

当时另一项解析检查还发现,合并利润表里一行带附注编号的“营业收入”被漏掉。定向适配后才恢复出来。缺项的原因是解析规则,企业原文中有这个数字。

这两项检查让我把工作顺序排得更清楚:先接通已有财务结果,再处理真实漏行,随后才比较新的财务组件。 后续当前代码已补入Direct预制工具的构建和传递;新增解析能力仍要按自己的样例验证,不能与“10项已到达输入”合并成一次成功。

FinRobot这类项目有财务分析与估值组件可参考,但换一个会输出估值的Agent,不能替代这段接线。它需要的财务期间、数据结构和假设,仍得由调用方准备好。

更难的是跨页表格。有一份中报的并购数据横跨两页,文本抽取把表格中的数字拆开了。人看PDF能认出完整金额,计算工具却无法把拼出来的数字绑定到原文。

到这一步,值得尝试的是Docling的表格结构识别一类能力:同时恢复单元格、表头、期间和单位。单纯增加摘要,无法补回丢掉的行列关系。

这轮没有运行Docling识表,因而它还只是针对困难页面的候选。验证目标很具体:把这张表正确还原,数字能回到原单元格,随后能被计算工具引用。没有必要为两页失败先更换全部PDF处理流程。

对于财务工具,我想要的输出也很具体:一个数值,带着它的报告期间、单位、原文位置,以及必要的计算过程。这样后续Agent既能拿它分析,也能在有疑问时回去查。

图2|找页、读表与使用数值分别解决不同问题;困难表格适配仍待验证。

Qlib用来检验模型,RD-Agent用来组织实验

Qlib和RD-Agent经常同时出现在量化AI项目清单里,但我会把它们放在不同位置。

Qlib这条线,先看能否接上自己的数据,完成模型训练和信号评价。RD-Agent则更靠近研究循环:提出因子或模型假设,生成实现,运行实验,再根据反馈调整下一步。

前者帮我把一次实验做出来;后者试图让实验过程继续推进。要不要采用第二种能力,取决于第一种实验是否已经有足够可信的数据和比较方法。

9月的本地试验从Qlib固定版本中复用了原有的LinearModel类和calc_ic函数,通过自己的数据接口运行,没有安装整套平台。模型用12项价格形态、波动和量价特征,预测未来五个交易日的下行幅度:五日收益为负时取其绝对值,为正时记0。

这个目标让我们可以检查模型是否把下跌更重的样本排在前面。它不是亏损概率,也不是收益预测。

模型用2022年的样本训练,在2023和2024年各48个观察日上评价。先和单一波动率比较,再补了一项简单振幅模型作诊断。风险Rank IC衡量预测排序与实际下行幅度排序的相关程度,下面是按观察日平均的结果。

方法
2023
2024
单一波动率
0.161
0.124
Ridge模型
0.190
0.153
单振幅模型:事后诊断
0.180
0.139

只看前两行,Ridge有改善。加入第三行后,增量缩小了;相对振幅模型的差异区间,在两年都跨过0,现有样本不足以确认它稳定更好。

振幅基线是在看到模型结果后补做的,所以它的用途是诊断,不能包装成提前设计好的独立确认。历史数据还存在股票范围、公司行动和可交易时点等限制;这两年的材料也曾用于其他研究,不能当作从未看过的留出集。

我保留Qlib组件的理由很实在:它能接入本地数据,用相同口径训练、输出和比较。评价结果告诉我这个模型哪些地方值得继续,哪些主张暂时站不住。Ridge本身仍是普通算法,框架名称不会额外创造预测能力。

因此,这次的取舍是复用实验组件,风险模型继续留在研究阶段。不能把组件跑通写成已经有全市场生产预测,更不能据此宣传选股收益。

RD-Agent也值得借鉴,尤其是把假设、代码、实验结果和下一步调整组织起来。但这轮没有运行它的自动实验循环。如果现在就让Agent不断生成更多因子,首先扩大的会是待检验的想法数量。

等数据与评价条件准备好,我会优先试它能否减少一次完整实验中的人工衔接,而不是只数它生成了多少个策略。

我的接入清单

如果今天继续建设这套系统,我会先投入三个位置。

查询入口。 借Dexter的字段发现与结构化筛选设计,让现有Agent能询问本地数据,并把结果交回原来的研究流程。金融API封装按市场和数据条件选,不把供应商支持的字段当成全系统能力。

研究工具。 接好已有财务结果,保留原文和计算关系;用轻量问题检索加完整邻页改善阅读。PageIndex和Docling分别留给跨章节导航、困难表格这些明确的问题,带着失败样本再比较。

实验环境。 复用Qlib里可以独立接入的模型与评价组件,坚持加入简单对照。RD-Agent先作为实验组织方法的参考,自动搜索等数据和评价条件成熟后再试。

这几项都有明确的接入位置,也能分别检查是否有用:查询是否扩大了可问的问题,阅读是否补到了缺失证据,财务结果是否真正进入分析,模型是否超过简单方法。

我目前的选择,就是先把这些接口做扎实。下一次再看一个开源项目时,也能带着实际缺口去判断:它能替我完成哪一段工作,接上之后,又该用什么结果证明这次选择值得。


项目与材料说明

文中技术判断对应2026年9月固定版本源码和本地材料,后续实现只读核对至10月1日。查询、找页、财务输入和量化模型是不同试验,不能合并为一次完整产品验收。本文讨论技术选型,不构成投资建议。

相关项目:Dexter筛选入口、Financial-API、PageIndex、BM25组件、FinRobot财务组件、Docling表格处理、Qlib线性模型、RD-Agent。开源软件的使用许可与其调用的数据服务、模型权重分别核对。

相关学习资料