尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

用AI Agent自动化投资研究:Prompt设计与Python实战

发布时间:2026/9/29 4:55:50

资讯中心
01
ARTICLE

用AI Agent自动化投资研究:Prompt设计与Python实战

用AI Agent自动化投资研究:Prompt设计与Python实战
1. 从手动翻研报到Agent自动跑流程我为什么把投资研究交给了AI做投资研究的人大概都有过这种体验早上八点半坐到工位打开邮箱是三十几封券商晨报Wind终端里躺着昨晚更新的财务数据雪球和几个行业群里还在刷某家公司的新产能消息而你今天的任务是把某个细分赛道里五家公司的毛利率变化拉出来做横向对比。这些活儿单拎出来都不难难的是它们分散在十几个不同的信息源里格式五花八门做完一轮下来半天就没了真正用来思考这家公司值不值得买的时间反而被压缩得所剩无几。我从两年前开始尝试用AI Agent来接管这类重复性的研究工作。一开始只是用Prompt让大模型帮我总结研报后来慢慢演进成一套由Python脚本、结构化Prompt和任务调度组成的半自动化流水线。到现在我日常跟踪的三十多家公司从财报数据抓取、关键指标计算、异动预警到初步的定性分析草稿基本都能在开盘前自动跑完一轮我只需要做最后的判断和修正。这套东西不是什么高深的技术架构核心就是把投资研究的流程拆解成Agent能执行的原子任务再用Prompt把每个任务的判断逻辑固化下来。这篇文章我想把这套经验完整地分享出来。适合的读者是有一定Python基础、对投资研究有实际需求、想用AI Agent提升效率但不知道从哪里下手的人。如果你完全不懂编程也不用急着关掉我会把每个环节的为什么这么做讲清楚你可以先理解思路再决定要不要动手。整篇内容围绕四个核心问题展开Agent在投资研究里到底能干什么、Prompt怎么写才能稳定输出、Python代码怎么和Agent配合、以及实际跑起来之后会遇到哪些坑。需要先说明一点AI Agent做投资研究定位是信息处理和初步分析的助手不是替你做决策的。它能帮你把数据整理好、把逻辑跑通、把明显的异常标出来但最终买不买、买多少还是得你自己判断。把这个边界想清楚后面的所有设计都会顺很多。2. 投资研究场景下Agent到底该接管哪些活儿2.1 先做任务盘点哪些环节适合交给Agent我刚开始的时候犯过一个错误就是想让Agent帮我分析这家公司好不好。结果就是它给我输出一堆正确的废话什么公司基本面良好但需关注行业竞争加剧的风险看完等于没看。问题出在我把分析这个太笼统的任务直接丢给了它而分析本身是由很多具体子任务组成的。后来我做了一件事拿一张纸把自己做一家公司研究时的完整流程写下来精确到每一步在干什么。写完之后我发现整个流程大概可以分成三类任务。第一类是信息采集类比如从指定网站抓取财报数据、从研报PDF里提取目标价和评级、监控新闻里是否出现某家公司的名字。这类任务的特点是规则明确、重复性高、不需要判断最适合Agent自动化。第二类是数据处理类比如计算营收同比增速、把不同来源的财务数据对齐到同一张表里、算出某指标的历史分位数。这类任务有明确的计算逻辑Python脚本比人快得多也准得多。第三类是初步分析类比如根据财务数据判断公司处于什么发展阶段、对比同行业公司的估值水平、从新闻里提取可能影响股价的关键事件。这类任务需要一定的判断但判断逻辑是可以被结构化的适合用Prompt来约束Agent的输出。真正需要人来做的是第四类综合判断和决策。这部分Agent替代不了也不应该替代。我的经验是把80%的时间花在采集和数据处理上20%的时间花在判断上这个比例是健康的。如果你发现自己80%的时间都在整理数据那说明Agent该上场了。2.2 一个具体的任务拆解示例拿跟踪某家制造业公司的季度经营情况这个任务来说我拆解之后大概是这样的每季度财报发布后自动从指定数据源抓取营收、净利润、毛利率、经营现金流四个核心指标把当期数据和过去八个季度的数据放在一起计算同比和环比变化如果毛利率环比下降超过2个百分点触发预警自动去新闻源里搜索该公司近一个月的相关报道把抓到的新闻标题和摘要喂给Agent让它判断是否有实质性利空最后生成一份包含数据表格和初步判断的简报推送到我的邮箱这五步里前三步是纯自动化的第四步是Agent做初步筛选第五步是汇总输出。我早上到工位的时候这份简报已经在邮箱里了我只需要看第四步Agent标出来的疑似利空是否成立然后决定要不要进一步深挖。这个拆解方式的好处是每一步的输入输出都很明确出了问题容易定位。比如某天简报里毛利率数据明显不对我一看就知道是第一步抓取环节出了问题而不是Agent判断错了。2.3 哪些任务不要交给Agent有几类任务我试过之后放弃了。一类是需要实时性的任务比如盘中监控某只股票的异动。Agent的响应链路比较长从触发到输出往往要几十秒甚至几分钟做实时监控不现实这种活儿还是交给专门的行情软件。另一类是需要深度推理的任务比如判断一家公司的护城河是否可持续。这种问题需要结合行业格局、管理层能力、技术路线等多个维度做综合判断Agent目前的能力还撑不起来强行让它做只会得到似是而非的结论。还有一类是涉及合规边界的任务比如自动下单。这个不用多说投资决策的最终执行必须由人来做Agent只负责提供信息。3. Prompt设计让Agent的输出从正确的废话变成能用的结论3.1 为什么你的Prompt总是输出废话我见过很多人写投资研究的Prompt是这样的请分析一下这家公司的财务状况。然后Agent输出一段四平八稳的话看起来什么都说了实际上什么都没说。问题出在Prompt没有给Agent任何约束。大模型的默认行为是安全地回答问题也就是说它会倾向于输出不会出错的内容。而投资研究恰恰需要的是有观点、有依据、有明确指向的判断。你不给它约束它就会选择最安全的表达方式也就是废话。我的做法是给Prompt加上三层约束角色约束、格式约束、判断标准约束。角色约束是告诉Agent你是谁。比如你是一名有十年经验的制造业行业分析师擅长从财务数据中识别经营拐点。这个设定会影响Agent的用词和关注点。格式约束是告诉Agent输出长什么样。比如用表格输出第一列是指标名称第二列是当期值第三列是同比变化第四列是你的判断改善/持平/恶化。格式约束能逼着Agent把模糊的判断变成明确的分类。判断标准约束是告诉Agent什么情况算好什么情况算差。比如毛利率同比提升超过1个百分点算改善下降超过1个百分点算恶化中间算持平。这个约束是最关键的它把Agent的主观判断变成了可复现的规则。3.2 一个可以直接抄的Prompt模板下面是我在用的一个财务数据初步分析的Prompt模板你可以根据自己的需求改你是一名专注于制造业的资深分析师。请根据以下财务数据对该公司本季度的经营情况做出判断。 数据如下 - 营收{revenue}去年同期{revenue_last_year} - 毛利率{gross_margin}去年同期{gross_margin_last_year} - 经营现金流{cash_flow}去年同期{cash_flow_last_year} 判断标准 1. 营收同比增速超过15%为强劲增长5%-15%为稳健增长0%-5%为增长放缓负增长为下滑 2. 毛利率同比变化超过1个百分点为显著改善或显著恶化0.5-1个百分点为小幅改善或小幅恶化0.5个百分点以内为基本持平 3. 经营现金流与净利润的比值低于0.8为现金流质量存疑 请严格按照以下格式输出 | 指标 | 当期值 | 同比变化 | 判断 | |------|--------|----------|------| | 营收 | ... | ... | ... | | 毛利率 | ... | ... | ... | | 经营现金流 | ... | ... | ... | 最后用一句话总结本季度经营情况的核心变化不超过50字。这个模板的关键在于它把分析这个模糊的任务拆成了按标准分类这个明确的任务。Agent不需要自己判断什么是好只需要按照给定的标准做分类。这样输出的结果既稳定又可复现。3.3 Prompt的迭代从能用到好用上面那个模板不是一次写成的。我最初的版本只写了请分析财务数据输出全是废话。然后我加了格式约束输出变成了表格但判断那一列还是模糊的。再加判断标准约束输出才变得可用。迭代的过程中我总结了几个经验。第一判断标准要尽量量化能用数字说清楚的就不要用形容词。第二输出格式要尽量结构化表格比段落好分类比描述好。第三每次只让Agent做一件事不要在一个Prompt里既让它分析财务又让它分析新闻分开做效果更好。还有一个技巧是给Agent提供示例。在Prompt里加一句参考以下示例的输出风格然后附上一个你满意的输出样例Agent的输出质量会明显提升。这个技巧在需要特定表达风格的时候特别有用。注意Prompt不是越长越好。我试过写一个两千字的Prompt结果Agent反而抓不住重点。一般来说核心约束控制在300字以内加上数据和示例总共不超过800字效果最好。4. Python在Agent流水线里的角色不是主角但缺了它转不起来4.1 数据抓取Agent的眼睛Agent本身不能上网抓数据它只能处理你喂给它的文本。所以数据抓取这一步必须用Python来做。我常用的工具是requests和BeautifulSoup前者负责发请求后者负责解析HTML。举个实际的例子我要从某个财经网站抓取某家公司的最新财报数据。流程大概是先用requests请求页面拿到HTML然后用BeautifulSoup定位到财务数据所在的表格最后把表格里的数字提取出来存成结构化数据。import requests from bs4 import BeautifulSoup def fetch_financial_data(stock_code): url fhttps://example.com/financial/{stock_code} headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) } response requests.get(url, headersheaders, timeout10) soup BeautifulSoup(response.text, html.parser) table soup.find(table, class_financial-table) data {} for row in table.find_all(tr): cells row.find_all(td) if len(cells) 2: key cells[0].get_text(stripTrue) value cells[1].get_text(stripTrue) data[key] value return data这段代码看起来简单但实际跑起来会遇到各种问题。比如网站有反爬机制请求被拒绝比如表格结构变了定位不到数据比如数字格式不统一有的是1,234.56有的是1234.56。这些问题都需要在代码里做处理。我的经验是抓取代码要写得防御性一点。每个可能出错的地方都加上异常处理抓不到数据的时候不要直接崩溃而是记录日志然后返回空值。这样即使某个数据源出了问题整个流水线还能继续跑。4.2 数据清洗把脏数据变成能用的数据抓下来的数据很少能直接用。常见的问题包括数字带单位1.2亿、百分比带符号15.3%、缺失值用-表示、不同来源的数据口径不一致。清洗这一步我一般用pandas来做。pandas的好处是它处理表格数据非常方便而且和后面的分析环节衔接顺畅。import pandas as pd def clean_financial_data(raw_data): df pd.DataFrame(raw_data) # 处理带单位的数字 def parse_number(value): if pd.isna(value) or value -: return None value str(value).replace(,, ) if 亿 in value: return float(value.replace(亿, )) * 100000000 if 万 in value: return float(value.replace(万, )) * 10000 return float(value) df[数值] df[数值].apply(parse_number) df df.dropna(subset[数值]) return df清洗环节最重要的是统一口径。比如有的数据源用营业收入有的用营业总收入你得把它们统一成同一个字段名。有的数据源按季度披露有的按年度披露你得把它们对齐到同一个时间维度。这些工作看起来琐碎但如果不做后面的分析全是错的。4.3 把Python和Agent串起来调度逻辑怎么写Python负责数据处理Agent负责判断和输出两者之间需要一个调度逻辑把它们串起来。我的做法是写一个主流程函数按顺序调用各个模块。def daily_research_flow(stock_list): results [] for code in stock_list: # 第一步抓取数据 raw_data fetch_financial_data(code) # 第二步清洗数据 clean_data clean_financial_data(raw_data) # 第三步调用Agent做初步分析 prompt build_prompt(clean_data) analysis call_agent(prompt) # 第四步汇总结果 results.append({ code: code, data: clean_data, analysis: analysis }) # 第五步生成简报并推送 report generate_report(results) send_email(report) return report这个流程的关键是每一步的输入输出都要明确。第一步输出原始数据第二步输出清洗后的数据第三步输出Agent的分析文本第四步输出汇总结果。这样如果某一步出了问题很容易定位。还有一个细节是错误处理。如果某只股票的数据抓取失败了不要让整个流程崩溃而是跳过这只股票记录错误继续处理下一只。我一般会在流程最后统计一下成功和失败的数量如果失败率超过20%就发个告警提醒我检查。5. 实际跑起来之后那些文档里不会写的坑5.1 Prompt被拦截不是你的错但得知道怎么绕用Agent做投资研究最常遇到的意外是Prompt被拦截。有时候你写了一段完全正常的PromptAgent却返回invalid prompt: your prompt was flagged as potentially violating our usage policy。这种情况在涉及具体公司名称、财务数据、股价预测的时候特别容易出现。我一开始很困惑后来慢慢摸清了规律。大模型的安全机制对某些类型的表述比较敏感比如涉及具体投资建议的、涉及具体公司负面评价的、涉及股价预测的。即使你的本意是客观分析也可能触发拦截。应对方法有几个。第一把建议改成分析不要说这家公司值得买入而是说根据财务数据这家公司的毛利率处于历史高位。第二把具体公司名替换成代号比如用公司A代替真实名称分析完再映射回去。第三把敏感的判断拆成多个步骤先让Agent提取数据再让Agent做分类最后自己综合判断。实测下来把Prompt里的投资建议买入卖出这类词去掉拦截率会下降很多。Agent做的是信息处理不是投资顾问这个定位在Prompt里也要体现出来。5.2 会话锁死Agent跑着跑着不动了另一个常见的坑是Agent会话锁死。有时候你发了一个请求Agent半天不回复最后报错agent failed before reply: session file locked。这个问题在同时跑多个任务的时候特别容易出现。原因是Agent的会话文件被上一个任务占用了新的任务拿不到锁。解决办法有两个一是串行执行不要同时跑多个Agent任务一个跑完再跑下一个二是加超时和重试机制如果某个任务超过一定时间没响应就强制终止并重新发起。import time def call_agent_with_retry(prompt, max_retries3, timeout60): for attempt in range(max_retries): try: result call_agent(prompt, timeouttimeout) return result except SessionLockedError: if attempt max_retries - 1: time.sleep(5) continue else: raise我现在的做法是给每个Agent任务设置60秒超时超时后等5秒重试最多重试3次。这样即使偶尔遇到锁死也能自动恢复不会卡住整个流程。5.3 数据源变动今天能抓明天可能就抓不到了做数据抓取的人都知道网站改版是家常便饭。今天还能正常抓取的页面明天可能就换了结构你的代码直接报错。我的应对策略是多数据源备份。同一个指标至少从两个不同的来源抓取如果一个失败了自动切换到另一个。同时每次抓取之后做一个简单的合理性检查比如营收数据不能是负数毛利率不能超过100%如果发现异常值就标记出来人工检查。还有一个经验是把抓取逻辑和解析逻辑分开。抓取逻辑负责发请求拿HTML解析逻辑负责从HTML里提取数据。这样网站改版的时候只需要改解析逻辑抓取逻辑不用动。5.4 Agent的幻觉它可能会编数据这是最危险的一个坑。Agent在处理数据的时候偶尔会编造一些不存在的信息。比如你给它一组财务数据让它分析它可能会在输出里加上一个你没提供的指标而且数值看起来还挺合理。我的应对方法是在Prompt里明确约束只使用我提供的数据不要引入任何外部信息。如果某个判断需要的数据没有提供请标注数据不足。同时在流程里加一个校验步骤把Agent输出里的数字和原始数据做比对如果发现不一致就标记出来人工检查。这个校验步骤很重要。我一开始没做结果有一次Agent在分析里写了一个净利润同比增长23%但我提供的原始数据里根本没有净利润这一项。如果我没发现这个错误的数据就可能影响我的判断。6. 从单机脚本到稳定流水线我的迭代路径6.1 第一阶段能跑就行我最开始的版本就是一个Python脚本硬编码了几只股票代码跑完输出到控制台。没有错误处理没有日志数据源挂了就手动改。这个阶段的目标是验证Agent能不能做这件事答案是能但很脆弱。这个阶段大概持续了两周。我每天手动跑一次遇到问题就改代码。慢慢地脚本从只能处理一只股票变成能处理十只从只能抓一个数据源变成能抓三个从输出到控制台变成输出到Excel。6.2 第二阶段加上调度和告警当股票数量增加到三十多只的时候手动跑就不现实了。我加了一个定时任务每天早上七点自动跑。同时加了邮件推送跑完把简报发到我邮箱。这个阶段遇到的主要问题是稳定性。有时候某个数据源挂了整个流程就卡住了。我加了超时和重试机制加了错误日志加了失败告警。慢慢地流程从经常出问题变成偶尔出问题。6.3 第三阶段模块化和可配置到了这个阶段我意识到代码需要重构。原来的脚本是一个大函数所有逻辑混在一起改一个地方容易影响另一个地方。我把它拆成了几个模块数据抓取模块、数据清洗模块、Agent调用模块、报告生成模块。每个模块有明确的输入输出可以独立测试。同时我把配置抽了出来股票列表、数据源地址、Prompt模板都放在配置文件里改配置不用改代码。这样我想加一只新股票只需要在配置文件里加一行不用动代码。6.4 现在的状态半自动人做最后判断现在这套流水线每天早上自动跑一轮输出一份包含数据表格和初步分析的简报。我看完简报之后对其中标记为异常的公司做进一步的手动研究。整个流程大概帮我节省了每天两到三个小时的数据整理时间让我能把精力集中在真正需要判断的地方。我觉得这个状态是比较理想的。Agent负责它擅长的部分重复性的数据采集、处理、初步分类。人负责自己擅长的部分综合判断、决策、对异常情况的深入分析。两者各司其职效率最高。7. 几个容易被忽略但很重要的细节7.1 数据的时间对齐做财务分析的时候时间对齐是个大问题。有的公司财年不是自然年有的数据源按季度披露有的按半年度披露。如果你不把这些数据对齐到同一个时间维度算出来的同比环比全是错的。我的做法是统一用自然季度作为时间维度所有数据都转换到这个维度上。如果某个数据源只有半年度数据就用插值的方式估算季度数据并在报告里标注估算值。7.2 Prompt的版本管理Prompt是会不断迭代的。今天觉得好用的Prompt过一个月可能就觉得不够用了。如果不做版本管理改来改去最后自己都不知道哪个版本效果好。我的做法是把Prompt存在单独的文件里每次修改都记录修改日期和修改原因。这样如果新版本效果不好可以快速回滚到旧版本。7.3 输出结果的存档Agent每天输出的简报我都会存档。一方面是为了追溯如果某天发现一个判断错了可以回去看当时的原始数据和Prompt。另一方面是为了优化积累一段时间的输出之后可以分析哪些类型的判断容易出错针对性地改进Prompt。7.4 不要追求全自动我见过一些人想把投资研究做成全自动的从数据采集到决策建议全部由Agent完成。我的看法是至少在目前的技术水平下这个目标不现实也不安全。投资决策涉及真金白银让Agent做最终判断风险太大。比较务实的做法是半自动Agent负责信息处理人负责判断决策。Agent把数据整理好、把明显的异常标出来、把初步的分析写好人只需要做最后的确认和修正。这样既提高了效率又保留了人的判断权。8. 关于工具选型的一点个人看法市面上做AI Agent的工具很多有开源的框架有商业化的平台也有自己用Python搭的。我用过几种最后选择了自己搭。原因很简单投资研究的需求比较个性化现成的工具很难完全匹配我的流程自己搭虽然前期投入大一点但后期调整灵活。如果你刚开始尝试我的建议是先用最简单的方案跑通一个最小闭环。不需要一上来就搞复杂的架构一个Python脚本加一个Agent接口就够了。跑通之后再根据实际遇到的问题逐步优化。这样学习曲线比较平缓也不容易因为前期投入太大而放弃。至于具体的工具选择Python生态里的requests、BeautifulSoup、pandas这几个库基本够用了。Agent接口方面选择你用得顺手的就行关键是Prompt的设计和流程的编排工具本身反而是次要的。我在实际使用中最大的体会是这套东西的价值不在于技术多先进而在于它能不能稳定地帮你节省时间。一个简单的脚本如果能每天早上准时把数据整理好发到你邮箱它的价值就比一个功能强大但经常出问题的复杂系统大得多。所以我的建议是从最简单的方案开始先让它跑起来再慢慢优化。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。