1. 为什么我要把投资研究这件事交给AI Agent最早动这个念头是去年整理一份行业研究材料的时候。那天晚上我对着三张Excel表、十几个PDF年报、还有一堆从各处复制来的零散笔记从晚上八点干到凌晨两点最后发现有一半时间花在了“找数据”和“对齐口径”上真正用来思考“这家公司到底值不值得关注”的时间不到两小时。那一刻我就想能不能让机器把那些重复性的信息采集、清洗、初步归纳的活儿接过去我只负责判断和决策。这个想法后来落地成了一个用AI Agent辅助投资研究的工作流。它不是那种“输入一个股票代码就告诉你买不买”的黑箱工具而是一个能帮我自动完成信息搜集、财报要点提取、行业对比、风险点罗列、甚至初步估值测算的协作系统。核心思路是把投资研究拆成若干个可标准化的环节每个环节交给一个专门的Agent去处理最后我来做综合判断。适合谁来参考这篇内容如果你是有一定投资研究基础、会写一点Python、对Prompt设计有基本概念的人这套东西能帮你省下大量重复劳动的时间。如果你完全不懂编程也没关系我会把每个环节的逻辑讲清楚你可以用现成的工具组合来实现类似效果。最怕的是那种既不想学工具、又想直接拿结论去操作的人那这套东西不适合你因为Agent给你的永远是“半成品”最终判断必须你自己来做。我用的核心工具组合是Python做数据处理和调度Prompt做Agent的行为控制OpenClaw做本地化的Agent运行环境。为什么选OpenClaw而不是直接用云端服务两个原因一是投资研究涉及的数据很多是本地文件放在本地处理更顺手二是OpenClaw的会话管理和工具调用机制比较灵活我可以给每个Agent配不同的工具集比如有的Agent只能读PDF有的Agent可以调Python算估值权限分得清楚不容易乱。2. 整体架构设计与核心思路拆解2.1 为什么要把研究流程拆成多个Agent一开始我试过用一个“全能Agent”搞定所有事Prompt写了两千多字结果发现它经常在“提取财报数据”和“写行业分析”之间来回跳输出质量极不稳定。后来我想明白了这就像让一个人同时干会计、分析师、编辑三个岗位的活儿他肯定晕。正确的做法是拆成流水线每个Agent只干一件事干完把结果传给下一个。我最终的架构是这样的一个调度Agent负责接收我的研究需求然后按顺序调用四个专业Agent——信息采集Agent、财报解析Agent、行业对比Agent、风险扫描Agent。每个Agent的输出都存成结构化文件最后我再人工过一遍把关键判断补上。这样做的好处是每个环节都可追溯、可复现出了问题我知道是哪个Agent的锅改那一个就行不用推倒重来。2.2 工具选型背后的考量Python在这个流程里扮演的是“胶水”角色。数据清洗用pandasPDF解析用pdfplumber估值计算用numpy这些库成熟稳定遇到问题网上能搜到答案。Prompt的设计原则是“角色任务约束输出格式”四段式比如财报解析Agent的Prompt开头就是“你是一个专注于A股上市公司财报的分析助手你的任务是从给定的年报文本中提取营收、净利润、毛利率、经营现金流四个核心指标输出格式为JSON如果某个指标在文本中找不到填null不要编造数据”。OpenClaw的配置我踩过不少坑。最开始用默认配置Agent经常在调用工具时卡住后来发现是会话锁的问题报错信息是“agent failed before reply: session file locked (timeout 60000ms)”。解决办法是在配置文件里把会话超时时间调大同时确保同一时间只有一个Agent在写同一个会话文件。另外OpenClaw的本地部署对系统资源有一定要求我是在Ubuntu环境下跑的Python版本建议3.10以上低于这个版本有些依赖装不上。2.3 数据流的闭环设计整个流程的数据流向是这样的我输入一个研究标的比如某家上市公司调度Agent生成任务清单信息采集Agent去抓取公开信息公告、新闻、行业数据财报解析Agent从年报PDF里提取关键财务数据行业对比Agent把这家公司的指标和同行业其他公司做对比风险扫描Agent从公告和新闻里找潜在风险点比如诉讼、减持、监管问询。所有结果汇总到一个Markdown报告里我再基于这个报告做深度分析。这个闭环的关键在于“可验证”。每个Agent的输出都带来源标注比如财报数据会注明“来自2025年年报第23页”行业对比数据会注明“来自某某行业数据库”。这样我在做判断时能快速回溯到原始信息不会被Agent的“幻觉”带偏。实测下来这套流程能把初步信息整理的时间从原来的六到八小时压缩到四十分钟左右而且因为数据来源清晰后续复核也快了很多。3. 核心环节的实操细节与避坑要点3.1 信息采集Agent的Prompt设计与工具配置信息采集Agent的核心任务是“找到并整理公开信息”。我的Prompt是这样写的你是一个信息采集助手负责从公开渠道搜集指定公司的相关信息。你的工具包括网页搜索、PDF下载、文本提取。你的输出必须包含三部分公司基本信息全称、行业、上市板块、近期公告列表标题日期链接、行业新闻摘要不超过五条每条不超过一百字。如果某个信息找不到明确写“未找到”不要用推测内容填充。这里有个坑网页搜索的结果质量参差不齐有些是旧闻有些是营销软文。我的做法是在Prompt里加一条约束——“优先选择最近六个月内的信息来源优先级为官方公告权威财经媒体行业研究机构其他”。另外采集Agent不要给它太高的自主权我试过让它自己决定搜什么关键词结果它搜了一堆无关的宏观新闻回来。后来改成我预先给关键词列表它只负责按列表执行效率高很多。工具配置方面我给这个Agent配了三个工具一个搜索工具可以用现成的搜索API也可以用本地爬虫看你的数据源、一个PDF下载工具、一个文本提取工具。OpenClaw的工具注册机制比较直观在配置文件里声明工具名称、调用方式和参数格式就行。注意搜索工具要设频率限制不然容易被目标网站封IP我一般设成每分钟不超过五次请求。3.2 财报解析Agent的Prompt工程与数据校验财报解析是整套流程里最考验Prompt设计的环节。年报PDF动辄两三百页直接扔给Agent让它“提取财务数据”它大概率会漏或者错。我的策略是分两步第一步先用Python把PDF按章节拆开定位到“主要会计数据和财务指标”那一节只把这几页文本传给Agent第二步在Prompt里明确告诉它要找哪几个指标以及每个指标可能出现的表述方式。具体Prompt示例你是一个财报数据提取助手。以下文本来自某公司年报的“主要会计数据”章节。请提取以下指标营业收入、归属于上市公司股东的净利润、归属于上市公司股东的扣除非经常性损益的净利润、经营活动产生的现金流量净额、基本每股收益、加权平均净资产收益率。输出格式为JSON键名用英文值用数字单位元如果原文单位是万元或亿元请换算成元。如果某个指标在文本中找不到值填null。这里的关键是“单位换算”和“找不到填null”。我踩过的坑是早期没写单位换算结果Agent把“营业收入万元”直接当成元填进去了导致后续估值算出来差了四个数量级。另外“找不到填null”这条约束非常重要不加的话Agent会自己编一个看起来合理的数字这种幻觉在投资研究里是致命的。数据校验环节我加了一个Python脚本对Agent输出的JSON做三项检查一是数值范围检查比如营收不能是负数毛利率不能超过100%二是同比变化检查如果某指标同比变化超过500%标记出来人工复核三是交叉验证用净利润除以营收算净利率和Agent单独提取的净利率做对比差异超过两个百分点就报警。这套校验跑下来数据准确率能到95%以上剩下5%人工过一眼就行。3.3 行业对比Agent的指标选取与可视化行业对比Agent的任务是把目标公司的财务指标和同行业公司做横向比较。这里有个设计决策比哪些指标我最终选了六个——营收规模、营收增速、净利润率、ROE、资产负债率、经营现金流/营收。为什么选这六个因为它们分别对应“体量、成长性、盈利能力、股东回报效率、财务风险、盈利质量”六个维度基本能勾勒出一家公司的财务画像。Prompt设计上我让Agent先从行业分类数据里找到同行业公司列表一般取市值前五到前八家然后对每家公司重复调用财报解析Agent提取上述六个指标最后生成一个对比表格。输出格式要求是Markdown表格每行一家公司每列一个指标最后一列是目标公司在行业中的排名比如“净利润率排名第3/8”。可视化部分我用Python的matplotlib做雷达图把六个指标归一化后画在一张图上目标公司用粗线行业平均用虚线。这样一眼就能看出目标公司的优势和短板在哪里。注意雷达图的归一化方式要统一我一般用“该指标在行业中的百分位”来做归一化这样不同量纲的指标可以放在同一张图上比较。3.4 风险扫描Agent的信息源与判断逻辑风险扫描Agent是我后来加的起因是有一次我差点忽略了一家公司的商誉减值风险年报里提了一句“商誉账面价值较大”但没展开说。后来我想这种“轻描淡写但可能致命”的信息正是Agent应该帮我抓出来的。这个Agent的Prompt设计比较特殊我让它扮演一个“谨慎的审计师”角色你是一个风险扫描助手你的任务是找出给定公司可能存在的风险点。你的信息源包括公司公告、监管问询函、诉讼公告、股东减持公告、行业政策变化。对每个风险点你要输出风险类型财务/法律/经营/行业、风险描述不超过五十字、信息来源、严重程度高/中/低。如果信息不足以判断严重程度填“待确认”。判断逻辑上我给了Agent几条硬规则一是“连续两年经营现金流为负”标记为高风险二是“控股股东质押比例超过70%”标记为高风险三是“收到交易所问询函”标记为中风险四是“行业出现新的监管政策”标记为待确认。这些规则是我自己研究经验的外化Agent负责执行我负责定期更新规则库。4. 实操全流程从零搭建一个投资研究Agent4.1 环境准备与OpenClaw本地部署先说环境。我用的是Ubuntu 22.04Python 3.10.12。为什么强调Python版本因为OpenClaw的某些依赖在3.9以下会报错在3.12以上又有兼容性问题3.10和3.11是最稳的。安装Python的步骤不复杂但要注意不要覆盖系统自带的Python用pyenv或者conda建一个独立环境最稳妥。OpenClaw的安装我走的是源码编译路线因为需要改一些配置。克隆仓库后先装依赖pip install -r requirements.txt。这里有个坑requirements里有个包需要系统级的编译工具Ubuntu下要先装build-essential和python3-dev不然会报“gcc failed”之类的错。装完之后配置文件在config目录下主要改三个地方一是会话存储路径改成你本地的一个固定目录二是工具注册文件把你需要的工具搜索、PDF解析、Python执行注册进去三是超时设置把session timeout从默认的60秒改成300秒避免长任务被中断。启动命令是python -m openclaw.server启动后默认监听本地的某个端口。你可以用curl测一下服务是否正常。如果报“session file locked”的错检查是不是有多个Agent实例在同时写同一个会话文件解决办法是给每个Agent分配独立的会话ID。4.2 调度Agent的Python实现与任务编排调度Agent我是用Python写的一个简单脚本没有用OpenClaw的Agent机制因为它只需要做任务编排不需要复杂的推理。核心逻辑是一个任务队列我输入研究标的名称脚本生成一个任务列表然后按顺序调用各个Agent的API每个Agent的输出存成文件最后汇总。代码结构大致是这样的定义一个run_research(company_name)函数里面依次调用collect_info(company_name)、parse_financials(company_name)、compare_industry(company_name)、scan_risks(company_name)每个函数内部通过HTTP请求调用OpenClaw上注册的对应Agent。每个函数的返回值是一个字典最后用json.dump存成报告文件。这里有个实用技巧给每个Agent的调用加一个重试机制。网络请求偶尔会超时或者Agent返回的格式不对重试两到三次基本能解决。重试间隔设成指数退避第一次等2秒第二次等4秒第三次等8秒。另外每个Agent的输出都要做格式校验不符合预期格式的不要往下传直接报错让我人工介入。4.3 财报PDF的预处理与关键信息定位前面提到财报解析Agent只处理“主要会计数据”章节这个章节的定位我用的是pdfplumber加关键词匹配。具体做法是先用pdfplumber把PDF每一页的文本提取出来然后找包含“主要会计数据”或“主要财务指标”的页面把这些页面的文本拼起来传给Agent。如果找不到这个章节就退而求其次找包含“营业收入”和“净利润”的页面。这里有个细节不同公司的年报章节名称不一样有的叫“主要会计数据和财务指标”有的叫“公司主要会计数据和财务指标”还有的放在“管理层讨论与分析”里面。我的做法是维护一个关键词列表包含“主要会计数据”“主要财务指标”“营业收入”“净利润”“经营现金流”等只要某页包含其中两个以上关键词就认为是目标页。PDF解析的另一个坑是表格。很多财务数据是以表格形式呈现的pdfplumber提取表格的能力一般有时候会把两列数据混在一起。我的解决办法是对表格区域单独用pdfplumber的extract_table方法处理如果提取失败就退回到文本模式让Agent从文本里找数字。实测下来文本模式的准确率反而更高因为Agent对“营业收入 1,234,567,890”这种格式的识别能力很强。4.4 估值测算模块的Python实现估值测算我单独写了一个Python模块没有交给Agent做因为估值涉及明确的数学公式用代码实现更可靠。我实现的是简化版的DCF现金流折现和相对估值PE、PB两种方法。DCF的核心参数有三个自由现金流、折现率、永续增长率。自由现金流我用“经营现金流减去资本开支”来近似折现率我一般用10%这是个人偏好你可以根据自己的风险偏好调整永续增长率用3%。代码逻辑是预测未来五年的自由现金流用历史增速做线性外推然后折现加总再加上永续价值最后除以总股本得到每股内在价值。相对估值更简单用目标公司的PE和PB和行业平均PE、PB做对比如果低于行业平均20%以上标记为“可能低估”高于20%以上标记为“可能高估”。注意这里要区分静态PE和动态PE我一般用动态PE基于最近四个季度净利润因为静态PE反映的是过去参考价值有限。估值结果我会和Agent生成的报告放在一起但明确标注“估值结果仅供参考不构成投资建议”。这不是免责声明而是事实——估值模型对参数极其敏感折现率从10%调到12%结果可能差30%。所以我的做法是给出一个估值区间而不是一个精确数字。5. 常见问题与排查技巧实录5.1 Agent输出格式错乱的排查思路最常见的问题是Agent不按Prompt要求的格式输出。比如要求输出JSON它给你输出一段带解释的文字。排查思路分三步第一步检查Prompt里的格式要求是否足够明确我一般会在Prompt末尾加一句“只输出JSON不要输出任何其他文字”第二步检查传给Agent的输入是否太长超过模型上下文限制时输出质量会急剧下降解决办法是分段处理第三步检查温度参数温度太高会导致输出随机性大我一般设成0.1到0.3之间。如果以上都试了还是不行那就加一个后处理脚本用正则表达式从Agent输出里提取JSON部分。比如用re.search(r{.*}, output, re.DOTALL)来抓取大括号里的内容。这个办法虽然笨但很有效我现在的流程里每个Agent输出都会过一遍这个后处理。5.2 数据源不稳定时的降级方案公开数据源有时候会挂或者改版导致爬虫失效。我的降级方案是准备两套数据源主数据源用API稳定但可能收费备用数据源用网页爬取免费但不稳定。当主数据源请求失败时自动切换到备用数据源。如果两个都失败Agent输出“数据获取失败请人工补充”而不是硬编一个数据。另外对于财报PDF我本地会缓存一份。每次解析前先检查本地有没有缓存文件有的话直接用没有再下载。这样既省时间又避免了重复下载被封IP。缓存文件按“公司代码_年份.pdf”命名放在一个固定的缓存目录里。5.3 OpenClaw会话锁问题的彻底解决前面提到的“session file locked”问题我后来找到了根本原因OpenClaw默认用文件锁来保证会话的原子性但如果一个Agent任务执行时间超过锁的超时时间锁会被释放另一个任务拿到锁后前一个任务再写文件就会冲突。解决办法有两个一是把锁的超时时间设得足够长我设成600秒二是确保同一个会话同一时间只有一个任务在跑。具体操作是在OpenClaw的配置文件里找到session相关的配置项把lock_timeout从默认值改成600000单位是毫秒。另外在调度脚本里加一个简单的互斥锁用Python的threading.Lock或者文件锁都行确保不会并发调用同一个Agent。5.4 Prompt被标记违规的应对方法有时候Prompt里包含某些敏感词或者特定表述会被模型的安全机制拦截报错信息是“invalid prompt: your prompt was flagged as potentially violating our usage policy”。这种情况在投资研究里偶尔会遇到比如Prompt里出现了“内幕”“操纵”之类的词。应对方法很简单换一种表述。比如“内幕信息”改成“非公开信息”“操纵股价”改成“异常交易行为”。另外Prompt里不要出现具体的股票代码加“买入”“卖出”这样的组合改成“分析”“评估”这类中性词。如果还是被拦截就把Prompt拆成两段分两次调用每次的内容少一点触发拦截的概率会降低。5.5 常见问题速查表问题现象可能原因排查方法解决方案Agent输出格式错乱Prompt格式约束不明确检查Prompt末尾是否有“只输出XX”加后处理正则提取数据提取数值偏差大单位未换算对比原始PDF和Agent输出Prompt里明确单位换算规则会话锁超时任务执行时间过长查看OpenClaw日志调大lock_timeout加互斥锁Prompt被拦截包含敏感表述查看报错信息换中性表述拆分Prompt搜索工具被封请求频率过高查看HTTP状态码加频率限制切换数据源估值结果异常参数设置不合理检查折现率和增长率给出区间而非精确值6. 我在这套流程上踩过的坑和总结的经验第一个坑是“过度信任Agent的输出”。早期我拿到Agent生成的报告直接就用后来发现有一次它把一家公司的营收数据搞错了原因是那家公司的年报里有两个“营业收入”口径一个是合并报表一个是母公司报表Agent取了母公司报表的数据。从那以后我养成了一个习惯关键数据必须交叉验证至少两个来源对得上才用。第二个坑是“Prompt写得太长”。我试过写一个三千字的Prompt想把所有情况都覆盖到结果Agent反而抓不住重点。后来我学乖了每个Agent的Prompt控制在五百字以内只写最核心的角色、任务、约束和输出格式其他细节用工具或后处理脚本来补。第三个坑是“忽略数据新鲜度”。投资研究对信息的时效性要求很高一份三个月前的行业数据可能已经过时了。我现在在信息采集Agent的Prompt里强制要求标注每条信息的日期超过六个月的信息自动标记为“可能过时”需要人工确认。第四个坑是“没有做版本管理”。Agent的Prompt和配置改来改去有时候改完发现效果不如以前想回退却找不到旧版本。现在我所有的Prompt和配置文件都用Git管理每次改动都写commit message注明改了什么、为什么改、效果如何。这个习惯看起来麻烦但关键时刻能救命。最后分享一个实用技巧给每个Agent的输出加一个“置信度”字段。让Agent自己评估它对输出结果的把握程度比如“高”“中”“低”。置信度低的输出我会重点人工复核。这个做法不能完全避免错误但能帮我快速定位需要重点检查的部分效率提升很明显。这套东西我陆陆续续打磨了大半年现在基本稳定了。它不是那种“一键生成研究报告”的神器而是一个帮我省时间的工具。真正的判断还是得我自己来做。毕竟投资这件事工具能帮你整理信息但帮不了你承担决策的责任。