最近“AI工具搞了146个达不溜”这类标题频繁出现在各个平台。达不溜就是“万”146万确实是个能刺激眼球的数据但作为技术从业者我第一反应不是羡慕而是想拆开看看这类标题背后真正值得研究的东西到底是什么如果把这件事拆成技术问题你会发现它其实指向一个正在快速成熟的赛道——AI投研。也就是说用AI工具做财报分析、价值投资研究再用Agent智能体把整套流程自动化。146万能不能复制我没法验证也不建议你把“复制收益”当作目标。但工具链、方法论、Agent设计思路是完全可迁移的。这篇文章我想讲清楚几件事为什么AI工具做投研不只是概念而是一个真实可落地的工程问题四位投资大师的方法论如何转成AI能执行的Agent工作流多智能体做投研协作时角色怎么分、任务怎么拆、结果怎么验证以及作为开发者你如何用开源项目搭出自己的第一套AI投研工具链。先说结论AI在投资研究里最大的价值不是预测涨跌而是把一位分析师过去需要一周完成的案头工作压缩到半天并且逼你按照可复制的流程去思考。真正值得你花时间研究的是这套流程本身。1. 这篇文章真正要解决的问题如果你做过财报分析大概能理解为什么传统投研极度消耗精力。一家上市公司的年报动辄几百页其中真正影响决策的关键数据可能只占很小一部分。你需要从几百页PDF里找到营业收入、净利润、现金流、资产负债率、应收账款周转率还要算同比环比再结合行业数据判断这些数字是否合理。过去做这件事往往依靠人工成本高且容易遗漏。另一个痛点是“研究靠感觉”。很多投资者看了一堆资料最后决策依据还是某个消息带来的直觉而不是一套可重复的验证清单。这本质上不是知识问题而是流程问题没有把决策拆成可自动化、可检查的步骤。AI工具和Agent智能体解决的主要是这两个问题信息提取自动化用开源项目把财报PDF转成结构化文本再由大模型抽取关键财务指标把“读几百页PDF”变成“几十秒拿到一张指标表”。分析流程结构化把投资大师们公开的检查清单改造成Prompt模板和Agent任务。每个Agent只做一件事比如算安全边际、看ROE趋势、扫描行业空间最后再汇总。所以这篇文章会分成两条主线。如果你偏技术可以看第3章到第6章重点是一个财报分析Agent怎么写多智能体怎么编排。如果你偏应用可以看第2章和第7章重点是大方法论怎么落地以及哪些坑不能踩。一句话总结这篇文章的真实题目不是“怎么用AI赚钱”而是“怎么用AI把投研工作流变成可以重复执行的工程系统”。2. 四位投资大师的方法论如何转成AI投研Agent标题里的“四位投资大师”并不是来自某个真实存在的AI工具箱网络上并不存在“巴菲特亲测AI工具”。更靠谱的理解方式是把四位大师当成四种投资范式——他们留下的公开方法论恰恰是设计AI投研Agent最好的需求文档。我选了四位有代表性且方法论差异明显的投资大师格雷厄姆、巴菲特、费雪、彼得·林奇。他们的核心思想完全可以用Prompt和Agent任务复刻。投资大师核心范式典型问题对应的Agent能力格雷厄姆低估与安全边际股价比内在价值低多少财务筛选与估值计算Agent巴菲特护城河与长期复利这家公司凭什么持续赚钱商业模式质检Agent费雪成长股与深度调研行业空间和公司成长质量如何成长趋势分析Agent彼得·林奇生活化选股与分类管理公司属于哪一类合理的预期是什么公司分类扫描Agent先解释含义。格雷厄姆范式是经典的“捡烟蒂”逻辑不预测未来只看现在资产和利润是否被低估。转换到Agent上就是一组计算任务——提取每股净资产、净利润、市盈率、市净率再计算安全边际寻找“价格低于内在价值”的候选标的。这类技能最容易自动化因为它本质是数学公式和阈值判断。巴菲特范式关心的不是“便宜”而是“为什么值得长期持有”。他看ROE是否长期稳定、自由现金流是否健康、护城河是否存在。对应到Agent就需要让模型不只是算数字还要输出对商业模式的分析。比如从年报“管理层讨论”里提取竞争优势信息判断这家公司的利润来源是成本优势、品牌溢价、网络效应还是行政壁垒。这部分正好是大模型的强项。费雪范式偏向成长股研究核心问题是行业空间够不够大、公司能不能持续成长。对应Agent需要处理行业增速数据、研发投入趋势、产能扩张计划。这种分析要求上下文更广适合让Agent调用外部搜索工具补充行业信息。彼得·林奇范式更接地气。他会把公司分为缓慢增长型、稳定增长型、快速增长型、周期型、困境反转型等类型然后针对不同类型给出不同估值逻辑。这个分类任务非常适合做成多分类Prompt再配合不同的后续分析模板。所以所谓“用四位大师的AI工具”更准确的表述是把四位大师公开的决策清单转译成结构化Prompt和自动执行流程。真正值钱的不是某款工具而是这套转译的工程化能力。你不需要让机器“学会”价值投资只需要把投资大师们本来就会做的事一步一步拆成Agent可执行的小任务。3. AI投研工具链拆解从财报PDF到投资备忘录在进入代码之前先理清一条完整的AI投研工具链。很多人一上来就试图用大模型直接读PDF这其实绕了远路。更合理的思路是分层处理。整个工具链从下到上可以分为五层第一层是数据获取。数据来源必须合法合规。A股公司财报可以从交易所官网、巨潮资讯等公开渠道获取PDF海外公司财报可以从公司IR页面获取。不要使用来路不明或非法抓取的数据接口。数据获取的关键是“稳定”因为后续所有分析都建立在原始数据质量之上。第二层是解析清洗。PDF不是文本它是版式文件。直接用大模型读PDF既费Token又容易丢数据。常见做法是先使用开源项目把PDF转成Markdown或纯文本比如微软开源的MarkItDown就是一个专门做文档转Markdown的工具再用正则或者规则做一轮分节清理。这样处理完之后大模型拿到的输入是干净的结构化文本抽取效果会好很多。第三层是特征抽取。把文本映射成财务指标。这里最推荐的做法是使用大模型的输出约束能力让模型按照预定义的JSON Schema输出结构化字段。例如营收增速、净利率、ROE、自由现金流、资产负债率等。只要Prompt设计得当大模型抽取数字的准确率能达到可用水平。第四层是推理验证。这一层容易出现幻觉。模型抽取完成后不能直接相信要让Agent调用外部工具去校验。比如你抽取出的营收是127亿就需要让Agent把这个数和大模型从原文引用的原始句子比对或者与另一个独立数据源的数值做交叉验证。用工具调用代替凭空推理是减少幻觉的关键。第五层是输出沉淀。最终生成一份结构化的投资备忘录包含公司概况、关键指标、大师检查清单逐项点评、风险提示。这个备忘录最好以Markdown文件保存纳入版本管理。这样做的好处是每一份研究都有留痕几个月后还能复盘当初的判断依据。从一份财报到一份投研备忘录数据流就是PDF → 解析 → 结构化文本 → 特征抽取 → 交叉验证 → 研究备忘录。这条链路并不复杂但每一步都有成熟的开源工具支持。下面从最小闭环开始写代码。4. 搭建最小财报分析Agent的完整示例这一章会从一个最小示例开始逐步搭建财报分析Agent。需要提前说明的是我不会给出任何投资建议只会演示技术流程。代码覆盖了“PDF解析 → LLM抽取 → 指标计算 → Agent工具调用”这一整条路径。4.1 环境准备建议使用Python 3.10及以上版本并新建一个虚拟环境。本文示例的依赖库包括pip install openai pydantic requests pypdf如果你的PDF需要转成Markdown也可以额外安装微软开源的MarkItDownpip install markitdown[all]版本请以实际安装为准。大模型API部分本文以OpenAI兼容接口为例实际项目中你也可以换成DeepSeek、通义千问等支持OpenAI协议的服务只需要修改base_url和api_key。环境变量建议放到项目根目录的.env文件里或者在命令行中显式声明不要把密钥写进代码export OPENAI_API_KEYyour-api-key export OPENAI_BASE_URLhttps://api.openai.com/v14.2 第一步把财报PDF转成文本我们先不讨论“哪个解析库最好”直接从“能跑通”开始。读取PDF并提取文本# 文件路径pdf_parser.py from pypdf import PdfReader def extract_text_from_pdf(pdf_path: str) - str: reader PdfReader(pdf_path) pages [] for page in reader.pages: text page.extract_text() if text: pages.append(text) return \n.join(pages) if __name__ __main__: text extract_text_from_pdf(sample_annual_report.pdf) print(len(text)) with open(annual_report.txt, w, encodingutf-8) as f: f.write(text)这一步的作用是得到可供大模型阅读的纯文本。财报PDF经常有分栏、页眉页脚、表格错位等问题如果抽取效果不理想可以考虑使用MarkItDown转换或者引入OCR。这一步的目的不是完美而是“可用”。4.3 第二步用大模型抽取关键财务指标拿到文本后下一任务是抽取关键指标。这里不建议直接把整本财报丢给模型而是把财报文本截断成分段文本或者先定位到财务报表相关章节。以下代码展示如何通过一个结构化Prompt让模型返回JSON。# 文件路径extract_metrics.py import os from openai import OpenAI client OpenAI( api_keyos.getenv(OPENAI_API_KEY), base_urlos.getenv(OPENAI_BASE_URL), ) SYSTEM_PROMPT 你是一名严谨的财报分析助手。 请从财报文本中抽取下列指标并以JSON格式输出 1. 营业收入及其同比增速 2. 净利润及其同比增速 3. 净资产收益率(ROE) 4. 自由现金流 5. 资产负债率 6. 经营活动现金流净额 要求 - 数字必须来自原文不得猜测。 - 如果原文没有该指标输出 null不要编造。 - 输出格式必须是合法的JSON对象。 def extract_financial_metrics(text: str) - dict: resp client.chat.completions.create( modelgpt-4o-mini, messages[ {role: system, content: SYSTEM_PROMPT}, {role: user, content: f以下是财报文本请抽取指标\n{text[:8000]}}, ], response_format{type: json_object}, ) import json return json.loads(resp.choices[0].message.content) if __name__ __main__: with open(annual_report.txt, r, encodingutf-8) as f: text f.read() metrics extract_financial_metrics(text) print(metrics)这段代码有三个关键点。第一是response_format{type: json_object}它让模型输出结构化JSON避免后期解析失败。第二是系统提示词明确要求“如果原文没有该指标输出null”这是防止幻觉的第一道防线。第三是截断到8000字符因为财报太长时模型可能丢失细节截断会增加抽取稳定性。4.4 第三步用Pydantic做输出校验大模型返回的JSON并不保证字段齐全。用Pydantic定义Schema并校验能让后续代码更可靠。# 文件路径schemas.py from pydantic import BaseModel, Field from typing import Optional class FinancialMetrics(BaseModel): revenue: Optional[float] Field(None, description营业收入单位亿元) revenue_yoy: Optional[float] Field(None, description营业收入同比增速百分比) net_profit: Optional[float] Field(None, description净利润单位亿元) net_profit_yoy: Optional[float] Field(None, description净利润同比增速百分比) roe: Optional[float] Field(None, description净资产收益率百分比) free_cash_flow: Optional[float] Field(None, description自由现金流单位亿元) debt_ratio: Optional[float] Field(None, description资产负债率百分比)校验方法from schemas import FinancialMetrics import json def validate_metrics(data: dict) - FinancialMetrics: return FinancialMetrics(**data)如果字段缺失或类型错误Pydantic会在这一层抛出异常。这比在后续计算里发现None值更早暴露问题。4.5 第四步Agent工具函数计算安全边际投资大师的检查清单里很多指标需要二次计算。例如格雷厄姆的安全边际需要对比价格与内在价值。这里做一个简化的估值工具函数# 文件路径valuation_tools.py def calculate_safety_margin( current_price: float, intrinsic_value: float ) - float: 计算安全边际率。 安全边际率 (内在价值 - 当前价格) / 内在价值 * 100% 正值表示存在安全边际负值表示没有安全边际。 if intrinsic_value 0: raise ValueError(内在价值必须大于0) return round((intrinsic_value - current_price) / intrinsic_value * 100, 2) def calculate_roe_growth_consistency(roe_history: list[float]) - dict: 查看ROE的稳定性和趋势用于巴菲特范式的质检。 if not roe_history: return {avg_roe: None, trend: unknown} avg_roe sum(roe_history) / len(roe_history) if len(roe_history) 3: recent_avg sum(roe_history[-3:]) / 3 past_avg sum(roe_history[:-3]) / len(roe_history[:-3]) if len(roe_history[:-3]) 0 else avg_roe trend up if recent_avg past_avg * 1.05 else down if recent_avg past_avg * 0.95 else stable else: trend not_enough_data return {avg_roe: round(avg_roe, 2), trend: trend}calculate_safety_margin是典型的量化计算工具Agent在需要判断“贵不贵”时调用它。calculate_roe_growth_consistency用于判断一家公司是否长期稳定地创造回报这正好对应巴菲特关注ROE长期表现的思路。4.6 第五步把工具接入Agent最小Agent不需要一个复杂框架直接用函数路由器就能实现。判断用户意图调用相应工具再把结果交给大模型组织成回答。# 文件路径mini_agent.py import json from extract_metrics import extract_financial_metrics from valuation_tools import calculate_safety_margin, calculate_roe_growth_consistency TOOL_FUNCTIONS { calculate_safety_margin: { function: calculate_safety_margin, params: [current_price, intrinsic_value], }, calculate_roe_growth_consistency: { function: calculate_roe_growth_consistency, params: [roe_history], }, } def run_agent(query: str): # 简化版关键词路由。生产环境请使用函数调用或专用Agent框架。 if 安全边际 in query: tool TOOL_FUNCTIONS[calculate_safety_margin] result tool[function](current_price10.5, intrinsic_value15.0) return {tool: calculate_safety_margin, result: result} if ROE in query: tool TOOL_FUNCTIONS[calculate_roe_growth_consistency] result tool[function](roe_history[12.1, 14.3, 15.2, 16.0, 16.5]) return {tool: calculate_roe_growth_consistency, result: result} return {message: 未匹配到已有工具建议换一种提问方式} if __name__ __main__: print(run_agent(这家公司的ROE趋势怎么样))这段代码展示了Agent最核心的抽象工具注册、意图路由、结果返回。大模型本身不负责计算它只负责理解用户意图并选择工具。这在后面的多智能体协作中同样适用。5. 多智能体投研协作模拟一场“大师讨论”单一的Agent能力有限因为在真实投研里一个分析过程往往需要多个视角交叉验证。多智能体的价值不只是“多个Agent一起干活”更重要的是让不同角色相互质疑从而降低幻觉和盲区。5.1 为什么需要多智能体而不是一个超长Prompt一个超长Prompt让模型扮演多个角色在简单场景下可行但有两个问题一是上下文窗口有限多个角色的上下文容易互相干扰二是缺少显式的交叉验证机制一旦模型顺着同一个错误逻辑一路走到底没人拦得住。多智能体把任务拆给不同角色每个角色有独立人设、独立上下文、独立输出。最后的结论需要经过一个汇总或评审环节相当于企业内部的质量委员会。5.2 角色设计一个简单的投研协作团队可以包含四个角色正好可以对标四位投资大师的分工角色名人设主要职责财务数据Agent格雷厄姆范式严谨、保守负责校验财务数字计算估值和安全边际商业模式Agent巴菲特范式关注长期竞争力负责分析护城河、ROE质量、商业模式成长扫描Agent费雪范式关注行业空间负责搜索行业数据判断成长空间挑战Agent林奇范式保持怀疑负责提出反对意见质疑前几步的结论每个角色在系统里是一个独立的模型调用携带各自的System Prompt共享同一个财报文本底稿。5.3 多Agent编排示例实际工程上可以直接使用CrewAI这类多智能体框架。下面是一个使用CrewAI风格定义的示例注意这是高度简化的示意代码# 文件路径crew_agents.py # 说明以下代码用于展示多智能体编排思路框架版本以官方文档为准。 from crewai import Agent, Task, Crew, Process financial_agent Agent( role财务数据专家, goal从财报中提取财务指标判断估值和安全边际。, backstory你严格遵循格雷厄姆的投资理念只相信数字对任何没有依据的数据都会提出质疑。, verboseTrue, ) business_agent Agent( role商业模式分析专家, goal评估这家公司的护城河和长期竞争优势。, backstory你习惯从长期视角看待企业关注ROE稳定性、现金流质量和品牌壁垒。, verboseTrue, ) challenge_agent Agent( role挑战者, goal对分析结论提出反对意见寻找逻辑漏洞。, backstory你是一名挑剔的投资者善于发现报告中的模棱两可之处。, verboseTrue, ) task_financial Task( description阅读已提取的财报文本输出关键财务指标表。, agentfinancial_agent, expected_output一份包含营收、净利、ROE、资产负债率的指标表。, ) task_business Task( description基于财务指标评价公司护城河与商业模式质量。, agentbusiness_agent, expected_output一段商业模式质量分析指出优势与风险。, ) task_challenge Task( description针对财务数据Agent和商业模式Agent的结论提出至少三条反对意见。, agentchallenge_agent, expected_output反对意见列表。, ) research_crew Crew( agents[financial_agent, business_agent, challenge_agent], tasks[task_financial, task_business, task_challenge], processProcess.sequential, verboseTrue, ) result research_crew.kickoff() print(result)这个示例展示了多智能体最基础的工作方式顺序执行每个Agent处理上一Agent的输出。更进阶的写法可以增加反馈循环让挑战Agent的反对意见回到前两个Agent再修正一轮形成多轮迭代。5.4 多智能体的输出验证多智能体跑完并不代表结论正确。验证环节至少要做三件事数字回溯每个结论里的关键数字必须能指回财报原文中的具体句子或段落。交叉验证至少有一个Agent专门做“挑刺”反对意见必须被记录不能删除。格式校验每个Agent的输出都要符合约定Schema方便下游继续处理。这里真正容易出错的地方是Agent之间的上下文传递是全量文本还是摘要。如果传递全量文本Token成本高如果传摘要中间信息损失大。建议根据任务复杂度动态决定关键数字相关任务传原文段落观点类任务传结构化摘要。6. 开源项目盘点与选型建议搭建一套完整的AI投研工具链没必要所有环节都自己造轮子。下面是按用途分类的开源项目清单都是从公开渠道可以获取的项目选型时请自行核实开源协议和更新情况。用途开源项目说明文档解析MarkItDown微软开源支持将PDF、Office等文件转为Markdown文档解析PyMuPDF / pypdfPython读取PDF的常用库Agent编排CrewAI多智能体协作框架角色化分工方便Agent编排LangGraph以图结构编排复杂Agent工作流适合更强控制力的场景RAG/检索LlamaIndex连接私有文档与大模型适合投研知识库构建金融数据AkShare开源财经数据接口库注意使用前确认数据源授权金融数据Tushare国内常用金融数据接口部分接口需要积分金融数据yfinance海外行情数据接口非官方接口注意频率限制选型建议分为两套方案。第一套是轻量自用方案pypdf OpenAI兼容API 一个脚本Agent。适合只想验证“财报指标自动提取”是否可行的读者。优点是依赖少、上手快缺点是缺少可视化和多轮协作能力。第二套是进阶生产方案MarkItDown LlamaIndex做投研知识库 CrewAI或LangGraph做多智能体编排 Langfuse做链路追踪。适合想把投研流程工程化、甚至沉淀成团队工具的读者。优点是组成完整工具链缺点是维护成本高。这里需要提醒的是金融数据接口存在明显差异正式商用必须确认数据版权即使是开源接口也建议先在小范围验证数据准确性和更新频率。不要因为某个接口免费就直接用于生产环境。7. AI投研的常见误区和安全边界AI投研热度高误解也多。如果不加分辨很容易踩坑。下面列出最常见的几个问题。问题现象可能原因排查方式解决方案财报指标提取出错PDF解析不完整或表格错位对比原文段落与抽取结果先用PDF解析工具转Markdown再做规则清理模型编造不存在的数字提示词未禁止猜测检查输出字段是否为null在Prompt中强制“原文没有就输出null”多Agent结论互相矛盾角色上下文不一致查看每个角色的输入输出日志统一共享事实底稿只允许在结论层出现分歧模型无法处理最新财报训练数据截止时间较早检查发布时间与模型知识范围打开联网搜索或RAG检索补充最新信息回测效果好但实盘失效回测过拟合检查是否用了未来数据做样本外测试减少参数调整次数这些坑在任何一个垂直领域都会出现但投研场景中有两个特别值得注意。第一是数字幻觉的代价极高。在代码生成场景里一个幻觉函数最多报错在投研场景里幻觉数字可能导致错误的分析结论。所以一切关键数字都要用规则或工具函数二次校验不能把大模型输出直接视为事实。第二是“AI推荐股票”这个概念的边界。技术模型不具备预测股价的能力更不能替代人的判断。作为技术文章这里必须强调所有自动化输出只能作为研究辅助不能作为独立投资依据。尤其是自动化交易必须经过充分回测、模拟盘验证并遵守交易所和开户券商的合规要求。涉及真实交易时建议严格限制Agent权限做到最小授权、完整留痕、随时可暂停。另外个人信息和投资数据尽量在本地处理。如果使用云端大模型API要确认数据隐私政策避免把敏感持仓或身份证信息传入未知服务。8. 从这篇博文到实战落地路线图与最佳实践技术文章写到这里最怕读者收藏后一篇都不跑或者一上来就搭全套多智能体。我的建议是把目标拆小按下面这个路径推进。第一步先跑通“财报PDF → 解析 → 文本抽取 → 指标校验”最小链路。这一步不需要任何Agent框架甚至不需要多智能体只需要一个脚本和一次大模型API调用。目标是把一段财报文本变成一张结构化指标表。第二步建立你的检查清单Prompt库。把第2章四位大师的方法论改写成一份一份的Prompt模板。每一份Prompt只针对一个具体问题例如“判断这家公司的ROE趋势是否符合长期稳定标准”。这些模板会成为Agent系统的知识资产。第三步加入工具函数做交叉验证。为上一步的指标表补充工具调用比如安全边际计算、同比增速计算、ROE趋势判断把简单的算术交给代码而不是语言模型。第四步再加入多智能体协作。当单个Agent无法覆盖完整流程时再引入多Agent编排。建议先复制第5章的“财务数据Agent 商业模式Agent 挑战Agent”结构把每一步的输出都记录下来观察协作效果。工程实践上几个建议供参考明确每个Agent的输出Schema。没有Schema的Agent协作到最后一定是文本灾难。每次分析都生成带时间戳的研究记录纳入版本管理。这样三个月后可复盘当初判断的依据。大模型只负责分析和判断工具调用不负责编造事实。事实校验交给解析层和规则层。Token成本要提前估算。一份财报文本可能几万字符建议先用摘要和分段策略控制成本而不是盲目截断。日志记录要多智能体协作中的关键输入与输出。否则后期排错会非常痛苦。最后一条建议其实是最重要的你第一个Agent的输出不需要完美但格式必须稳定。先把“读财报→抽指标→出表格”这条链路固定下来让每一次输出结果都结构一致你才敢在上面叠加更复杂的判断和多智能体协作。与其追求一次搭一个完整投研AI系统不如先让一条最朴素的自动化流水线稳定运行三个月。
