从 0 到 1 搭建你的第一个金融投研 Agent(附架构图与核心代码)
从 0 到 1 搭建你的第一个金融投研 Agent(附架构图与核心代码)
关键词:金融投研 Agent、LangChain、大语言模型 LLM、向量数据库 ChromaDB、信息抽取、事件驱动、量化分析
摘要:本文将以「搭建一个能帮你分析苹果公司财报、看新闻、画趋势图的投研小助手」为目标,用「把大象装冰箱」的三步式思维,带你从 0 到 1 拆解金融投研 Agent 的核心逻辑,理解它为什么像「金融界的哆啦A梦口袋+放大镜+计算器」,并用 Python + LangChain + GPT-4o-mini + ChromaDB + Yahoo Finance + Plotly 写出完整可运行的代码。不管你是刚入门AI的小白,还是想在金融领域试水AI的程序员,读完这篇都能拥有自己的第一个投研小工具!
背景介绍:金融投研为什么需要「哆啦A梦」?
目的和范围
目的
很多人做金融投研都会遇到三个「超级头疼的问题」:
- 信息太多了,根本看不完:苹果出财报、库克演讲、中美贸易摩擦新闻、股价K线图……一周下来几百条内容,看的头晕眼花还抓不住重点;
- 知识太杂了,根本串不起来:想知道「苹果Vision Pro发布后对2024Q3营收的影响」,得先找Vision Pro的销量新闻、找2024Q2的AR/VR营收数据、找分析师对Q3的预测、找苹果供应链的股票联动——手动找简直像大海捞针;
- 重复工作太多了,根本没时间思考:每个季度都要整理财报的核心指标(营收、净利润、毛利率、EPS)、每个月都要对比竞品的股价趋势——这些活要是让机器干,我们就能专心做更有价值的判断了!
这三个问题,正是大语言模型(LLM)+ Agent技术能完美解决的!Agent就像「金融界的哆啦A梦」——它有「搜索引擎」这个任意门(找信息),有「记忆面包」这个向量数据库(记信息),有「计算器」这个量化工具(算数据),还有「放大镜」这个LLM本身(分析信息)。
范围
为了让大家能轻松上手,我们的投研Agent不会搞太复杂——它只做这3件事:
- 回答公司基本面问题:比如「苹果2024Q2的净利润是多少?毛利率同比增长了多少?」;
- 回答事件驱动问题:比如「2024年6月苹果发布Vision Pro正式版后,股价当天涨了多少?最近一周有什么相关的利好/利空新闻?」;
- 画简单的量化分析图:比如「帮我画苹果2024年1月到6月的收盘价趋势图,对比一下谷歌和微软的」。
等你把这3件事做好了,再慢慢扩展功能(比如加实时预警、加股票推荐、加回测系统)就容易多啦!
预期读者
这篇文章适合三类人:
- 刚入门AI的小白:你不需要懂太多深度学习,只要会一点点Python基础(比如会写print、会用pip安装包),就能跟着做;
- 想在金融领域试水AI的程序员:你可能懂Python,但对LangChain、向量数据库、金融数据接口不太熟,这篇文章会帮你快速入门;
- 对金融投研感兴趣的普通人:你可能不懂编程,但可以先看看Agent的逻辑,等以后学会Python了再动手——或者直接用我们提供的代码,找个会Python的朋友帮你跑!
文档结构概述
我们的文章结构就像「搭积木」——先搭地基(核心概念),再搭框架(系统架构),再装零件(核心代码),最后装饰一下(实际应用、未来趋势)。具体分为以下几个部分:
- 背景介绍:就是现在这部分,告诉你为什么要做投研Agent;
- 核心概念与联系:用「给小学生讲故事」的方式,解释LLM、Agent、LangChain、向量数据库、信息抽取这些核心概念,还要画架构图和流程图;
- 问题拆解与解决思路:把「搭建投研Agent」这个大问题,拆成「找数据」「存数据」「理解问题」「调用工具」「整合答案」五个小问题,逐个解决;
- 数学模型与公式:简单讲一下向量数据库用到的「余弦相似度」,还有计算EPS同比增长的公式——别担心,都是初中数学就能看懂的;
- 项目实战:完整可运行的代码:先讲开发环境怎么搭,再一步一步写代码,每一行代码都有详细的注释;
- 实际应用场景:看看我们的投研Agent能在哪些地方用到(比如个人投资者选股、基金公司研究员辅助、券商投顾写报告);
- 工具和资源推荐:给大家推荐一些好用的金融数据接口、LLM平台、Agent框架;
- 行业发展与未来趋势:用表格讲一下投研Agent的发展历史,再聊聊未来可能遇到的挑战(比如数据准确性、合规性、黑箱问题);
- 总结:学到了什么?:用「小学生能听懂的话」再回顾一遍核心概念;
- 思考题:动动小脑筋:给大家留几个小问题,鼓励大家进一步思考和扩展;
- 附录:常见问题与解答:解答大家可能遇到的问题(比如怎么申请OpenAI API Key、怎么解决网络问题);
- 扩展阅读 & 参考资料:给大家推荐一些好的书籍、文章、视频。
术语表
为了让大家不会被「专业术语」吓到,我们先列一个简单的术语表——后面还会用「讲故事」的方式再解释一遍哦!
核心术语定义
| 术语 | 专业定义 | 通俗比喻 |
|---|---|---|
| 大语言模型(LLM) | 一种基于深度学习的语言模型,通过训练海量的文本数据,能够理解和生成人类语言 | 金融界的「超级大脑+翻译官+分析师」——它读过几乎所有的公开文本(财报、新闻、研报),能听懂你的问题,还能给你分析出结论 |
| Agent | 一种能够自主感知环境、做出决策、执行动作的智能体 | 金融界的「哆啦A梦助手」——它不是只会回答问题的机器人,而是会主动帮你找数据、存数据、算数据、整合答案的小助手 |
| LangChain | 一个用于开发LLM应用的框架,提供了很多现成的工具(比如连接LLM、连接向量数据库、连接外部API) | 金融界的「工具箱」——里面有扳手(连接LLM)、螺丝刀(连接向量数据库)、钳子(连接外部API),你不需要自己造工具,直接拿过来用就行 |
| 向量数据库(Vector DB) | 一种专门用来存储和检索「向量」的数据库——向量就是把文字、图片、音频等非结构化数据转换成的一串数字 | 金融界的「记忆面包+搜索引擎」——它能把所有的财报、新闻、研报都「吃」进去(转换成向量存起来),然后当你问问题时,它能快速找到最相关的内容(像搜索引擎一样,但比搜索引擎更懂「语义」) |
| 信息抽取(Information Extraction,IE) | 从非结构化文本(比如财报、新闻)中提取结构化信息(比如公司名称、时间、营收、净利润)的技术 | 金融界的「放大镜+摘抄本」——它能从厚厚的财报中,快速找到你需要的核心数据,然后抄在一个整齐的表格里 |
| 事件驱动(Event-Driven) | 一种根据特定事件(比如公司发布财报、产品发布、政策变化)来做出决策的投资策略 | 金融界的「闹钟+温度计」——当有重要事件发生时,它会像闹钟一样提醒你,然后像温度计一样测量这个事件对股价的影响 |
相关概念解释
| 术语 | 解释 |
|---|---|
| 财报 | 上市公司定期发布的财务报告,包括资产负债表、利润表、现金流量表——相当于公司的「体检报告」 |
| EPS(每股收益) | 净利润除以总股本——相当于「每一股股票赚了多少钱」,是衡量公司盈利能力的重要指标 |
| 毛利率 | (营业收入-营业成本)除以营业收入——相当于「每卖100块钱的东西,赚了多少毛利」,是衡量公司产品竞争力的重要指标 |
| 余弦相似度 | 一种用来衡量两个向量之间相似程度的指标——值越接近1,说明两个向量越相似;值越接近0,说明两个向量越不相似;值越接近-1,说明两个向量完全相反 |
缩略词列表
| 缩略词 | 全称 |
|---|---|
| LLM | Large Language Model(大语言模型) |
| Agent | 智能体(无全称,是人工智能领域的通用术语) |
| LangChain | LangChain(框架名称,无全称) |
| Vector DB | Vector Database(向量数据库) |
| IE | Information Extraction(信息抽取) |
| EPS | Earnings Per Share(每股收益) |
| API | Application Programming Interface(应用程序编程接口) |
| OpenAI | OpenAI(公司名称,开发了GPT系列模型) |
| ChromaDB | ChromaDB(向量数据库名称,无全称) |
| Yahoo Finance | Yahoo Finance(金融数据平台名称,无全称) |
| Plotly | Plotly(数据可视化库名称,无全称) |
核心概念与联系:金融投研 Agent 到底是怎么工作的?
故事引入
想象一下,你是一个刚上小学三年级的小朋友,你妈妈让你帮她做一件事:「今天晚上我们要做苹果派,你帮我找一下我们家的苹果,然后数一下有多少个,再挑几个又大又红的,最后告诉我苹果够不够做派(妈妈说需要6个)。」
你会怎么做呢?
- 首先,你得理解妈妈的问题:「找苹果」「数苹果」「挑苹果」「判断够不够」——这四个步骤你得记清楚;
- 然后,你得调用「工具」:
- 找苹果:调用「你的眼睛」这个工具,去厨房、客厅、冰箱里找;
- 数苹果:调用「你的手指头」这个工具,一个一个数;
- 挑苹果:调用「你的眼睛+手」这个工具,看颜色红不红、摸起来硬不硬;
- 判断够不够:调用「你的脑子」这个工具,把数出来的苹果数和6比一下;
- 最后,你得整合答案:比如「妈妈,我找到了8个苹果,其中有5个又大又红的,还差1个,要不要我去楼下便利店买?」
哇!你看——你刚才的整个过程,其实就是一个简单的Agent!而我们要搭建的金融投研Agent,就是把「你」换成「LLM」,把「眼睛、手指头、脑子」换成「搜索引擎、向量数据库、量化工具」,把「找苹果做派」换成「找苹果公司的信息做投研」!
是不是很简单?接下来,我们就用「给小学生讲故事」的方式,详细解释一下金融投研Agent的核心概念!
核心概念解释(像给小学生讲故事一样)
核心概念一:大语言模型(LLM)——金融界的「超级大脑+翻译官+分析师」
想象一下,你有一个超级厉害的哥哥,他读过所有的小学课本、中学课本、大学课本、百科全书、报纸、杂志、小说——哦不对,他还读过所有的上市公司财报、新闻、研报、政策文件!
这个哥哥有三个超能力:
- 超能力一:理解你的问题:不管你说的是中文、英文、还是夹杂着数字和符号的话(比如「帮我算一下苹果2024Q2的EPS同比增长了多少」),他都能听懂;
- 超能力二:生成人类语言:不管你问的是简单的问题(比如「苹果2024Q2的净利润是多少」),还是复杂的问题(比如「Vision Pro发布后对苹果2024Q3营收的影响」),他都能用通俗易懂的话给你解释清楚;
- 超能力三:推理和分析:如果你给他一些数据(比如苹果2024Q2的AR/VR营收是15亿美元,2023Q2是12亿美元),他能帮你推理出「AR/VR营收同比增长了25%」;如果你给他一些新闻(比如「Vision Pro正式版发布后,首周销量突破了100万台」),他能帮你分析出「这对苹果2024Q3的营收是利好消息」。
这个超级厉害的哥哥,就是大语言模型(LLM)!现在最有名的LLM有OpenAI的GPT系列(比如GPT-4o、GPT-4o-mini)、Google的Gemini系列、Anthropic的Claude系列——我们今天要用的是GPT-4o-mini,因为它既便宜又好用!
核心概念二:Agent——金融界的「哆啦A梦助手」
刚才的超级哥哥虽然厉害,但他有一个致命的缺点:他记不住太多东西(虽然他读过很多书,但你问他昨天看的苹果2024Q2财报里的具体数字,他可能记不太准),而且他不会主动帮你找东西(比如你问他「苹果最近一周有什么利好新闻」,他只能靠他脑子里的旧知识回答,不会去网上找最新的新闻),更不会画图和算复杂的数学题(比如你让他画苹果2024年1月到6月的股价趋势图,他只能给你描述一下,不会给你画出来)。
那怎么办呢?我们需要给这个超级哥哥配一个「哆啦A梦助手」——这个助手有三个宝贝:
- 宝贝一:记忆面包(向量数据库):把所有的财报、新闻、研报都「吃」进去(转换成向量存起来),当超级哥哥记不住的时候,助手就从记忆面包里找出来给他看;
- 宝贝二:任意门(外部API):比如「搜索引擎任意门」(去网上找最新的新闻)、「金融数据任意门」(去Yahoo Finance找股价数据)、「计算器任意门」(去算复杂的数学题)、「画图任意门」(去画股价趋势图);
- 宝贝三:任务清单(Prompt Engineering):告诉超级哥哥和助手「第一步做什么、第二步做什么、第三步做什么」,比如「第一步先从记忆面包里找苹果2024Q2的财报,第二步用计算器任意门算EPS同比增长,第三步用人类语言把答案说出来」。
这个配了三个宝贝的超级哥哥,就是金融投研 Agent!它不是只会回答问题的机器人,而是会自主感知环境(比如知道有没有最新的新闻)、做出决策(比如知道该用哪个宝贝)、执行动作(比如去网上找新闻、去算数学题、去画图)、整合答案的小助手!
核心概念三:LangChain——金融界的「工具箱」
刚才的哆啦A梦助手有三个宝贝,但如果我们要自己造这三个宝贝,那可太麻烦了——比如造记忆面包(向量数据库)需要懂深度学习和数据库,造任意门(外部API)需要懂HTTP请求,造任务清单(Prompt Engineering)需要懂怎么和LLM沟通。
那怎么办呢?我们有一个现成的工具箱——这个工具箱里已经有了造记忆面包的「面粉和酵母」(连接向量数据库的工具)、造任意门的「木材和钉子」(连接外部API的工具)、造任务清单的「纸和笔」(Prompt Engineering的模板)——你不需要自己造材料,直接拿过来组装就行!
这个现成的工具箱,就是LangChain!它是现在最流行的LLM应用开发框架,不管你是想做投研Agent、客服机器人、还是学习助手,都能用它快速搭出来!
核心概念四:向量数据库(ChromaDB)——金融界的「记忆面包+语义搜索引擎」
想象一下,你有一个超级大的书包,里面装了所有的上市公司财报、新闻、研报——有几万本甚至几百万本!如果妈妈让你找「苹果2024Q2的财报里的净利润数字」,你会怎么做呢?
你可能会一本一本地翻——那可太费时间了,翻一天都不一定能找到!
那有没有更聪明的办法呢?有!你可以先把每本书的核心内容「浓缩」成一张小卡片(比如苹果2024Q2财报的小卡片上写着「公司名称:苹果;时间:2024Q2;净利润:217亿美元;毛利率:43.3%;EPS:1.46美元」),然后把这些小卡片按「相似程度」排好(比如把所有苹果公司的小卡片放在一起,把所有2024Q2的小卡片放在一起)——这样当你找「苹果2024Q2的财报里的净利润数字」时,你就能快速找到苹果公司的那堆小卡片,再找到2024Q2的那一张,然后直接看到净利润数字!
这个「浓缩」小卡片的过程,就是把非结构化文本转换成向量;这个按「相似程度」排小卡片的书包,就是向量数据库;我们今天要用的向量数据库是ChromaDB——因为它是免费的、开源的、而且非常容易上手!
那什么是「语义相似程度」呢?比如你找「苹果Vision Pro的销量」,普通的搜索引擎只会找包含「苹果」「Vision Pro」「销量」这三个词的内容,但向量数据库能找「语义上相关」的内容——比如「苹果头显的销售情况」「Vision Pro首周的订单量」「AR/VR设备的市场份额」这些内容,虽然没有完全包含你找的三个词,但语义上是相关的,向量数据库也能找出来!
是不是很厉害?这就是向量数据库和普通搜索引擎的最大区别!
核心概念五:信息抽取——金融界的「放大镜+摘抄本」
刚才的小卡片上的内容(比如「公司名称:苹果;时间:2024Q2;净利润:217亿美元」),是怎么从厚厚的财报里「浓缩」出来的呢?
这就需要用到**信息抽取(IE)**技术了!信息抽取就像一个「放大镜+摘抄本」——它先拿着放大镜仔细看厚厚的财报,然后把你需要的核心信息(比如公司名称、时间、营收、净利润)抄在一个整齐的小卡片上!
信息抽取有两种方法:
- 方法一:规则抽取——比如你给它定一个规则「找到‘净利润’这个词,然后看它后面跟着的数字和单位」,它就会按照这个规则找;
- 方法二:LLM抽取——比如你给LLM说「帮我从这段财报里提取公司名称、时间、营收、净利润、毛利率、EPS,然后用JSON格式输出」,它就会帮你提取!
我们今天要用的是LLM抽取——因为它更灵活,不需要你定复杂的规则!
核心概念六:事件驱动——金融界的「闹钟+温度计」
想象一下,你有一个「股票闹钟+温度计」——当有重要事件发生时(比如苹果发布财报、库克演讲、中美贸易摩擦升级),它会像闹钟一样提醒你;然后它会像温度计一样测量这个事件对股价的影响(比如是利好还是利空、影响有多大)!
这个「股票闹钟+温度计」,就是事件驱动!事件驱动是一种非常流行的投资策略——很多基金公司和券商都在用!
我们的投研Agent虽然不会做实时预警(以后可以扩展),但它能根据特定事件来分析股价的影响——比如你问它「2024年6月苹果发布Vision Pro正式版后,股价当天涨了多少?最近一周有什么相关的利好/利空新闻?」,它就能帮你找到答案!
核心概念之间的关系(用小学生能理解的比喻)
刚才我们讲了六个核心概念——LLM、Agent、LangChain、向量数据库、信息抽取、事件驱动——它们就像一个团队,一起合作完成金融投研的任务!
团队角色分配
| 核心概念 | 团队角色 | 通俗比喻 |
|---|---|---|
| Agent | 队长 | 负责指挥整个团队,告诉大家第一步做什么、第二步做什么、第三步做什么 |
| LLM | 核心队员(分析师) | 负责理解问题、推理分析、生成答案 |
| LangChain | 后勤部长 | 负责给团队提供工具(比如连接LLM、连接向量数据库、连接外部API) |
| 向量数据库 | 档案管理员 | 负责存储和检索所有的财报、新闻、研报 |
| 信息抽取 | 档案整理员 | 负责把厚厚的财报、新闻、研报整理成整齐的小卡片 |
| 事件驱动 | 情报员 | 负责收集和分析重要事件对股价的影响 |
团队合作流程
想象一下,你是一个投资者,你问这个团队一个问题:「帮我分析一下苹果2024年6月发布Vision Pro正式版后,对2024Q3营收的影响。」
这个团队会怎么合作呢?
- 第一步:队长(Agent)接收问题:队长先把问题记下来;
- 第二步:队长(Agent)分配任务:队长告诉后勤部长(LangChain)「给我提供三个工具:档案管理员(向量数据库)、情报员(事件驱动)、金融数据任意门(Yahoo Finance)」;
- 第三步:情报员(事件驱动)收集事件信息:情报员先从金融数据任意门(Yahoo Finance)找「Vision Pro正式版发布的时间(2024年6月7日)」,再从档案管理员(向量数据库)找「最近一周关于Vision Pro的新闻」,然后整理成「事件清单」;
- 第四步:档案管理员(向量数据库)找历史数据:档案管理员找「苹果2023Q2的AR/VR营收数据」「苹果2024Q2的AR/VR营收数据」「分析师对苹果2024Q3 AR/VR营收的预测」,然后整理成「数据清单」;
- 第五步:核心队员(LLM)推理分析:核心队员把「事件清单」和「数据清单」拿过来,用它的超能力推理分析「Vision Pro发布后对2024Q3营收的影响」;
- 第六步:核心队员(LLM)生成答案:核心队员用通俗易懂的话把答案说出来;
- 第七步:队长(Agent)把答案告诉你:队长把核心队员生成的答案传给你!
是不是很清晰?接下来,我们就用专业的架构图和Mermaid流程图把这个团队合作流程画出来!
核心概念原理和架构的文本示意图(专业定义)
我们的金融投研Agent的核心架构可以分为五层:
- 用户交互层:负责接收用户的问题,然后把答案传给用户——可以是网页、微信公众号、钉钉机器人、或者直接在命令行里输入;
- Agent协调层:负责整个Agent的协调和调度——包括理解用户的问题、规划任务步骤、分配任务给各个工具、整合各个工具的返回结果;
- LLM层:负责理解问题、推理分析、生成答案、信息抽取——我们用的是GPT-4o-mini;
- 工具层:负责给Agent提供各种工具——包括向量数据库工具(ChromaDB)、金融数据工具(Yahoo Finance)、数据可视化工具(Plotly)、网络搜索工具(Tavily Search,后面会讲);
- 数据层:负责存储各种数据——包括结构化数据(比如财报的核心指标、股价数据)和非结构化数据(比如财报原文、新闻、研报)。
文本示意图如下:
┌─────────────────────────────────────────────────────────────────────────────┐
│ 用户交互层(User Interface) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 命令行输入 │ │ 网页界面 │ │ 微信公众号 │ │ 钉钉机器人 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────────┐
│ Agent协调层(Agent Orchestration) │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ 问题理解模块 │ │ 任务规划模块 │ │ 结果整合模块 │ │
│ └──────────────────┘ └──────────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────────┐
│ LLM层(LLM Layer) │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ 理解与生成模型 │ │ 推理分析模型 │ │ 信息抽取模型 │ │
│ │ (GPT-4o-mini) │ │ (GPT-4o-mini) │ │ (GPT-4o-mini) │ │
│ └──────────────────┘ └──────────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────────┐
│ 工具层(Tool Layer) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 向量数据库 │ │ 金融数据 │ │ 数据可视化 │ │ 网络搜索 │ │
│ │ (ChromaDB) │ │ (Yahoo Fin)│ │ (Plotly) │ │ (Tavily) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────────┐
│ 数据层(Data Layer) │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ 结构化数据 │ │ 非结构化数据 │ │
│ │ ┌──────────────┐│ │ ┌──────────────┐│ │
│ │ │ 财报核心指标 ││ │ │ 财报原文 ││ │
│ │ │ 股价数据 ││ │ │ 新闻 ││ │
│ │ │ 分析师预测 ││ │ │ 研报 ││ │
│ │ └──────────────┘│ │ └──────────────┘│ │
│ └──────────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
Mermaid 架构图与交互关系图
为了让大家更直观地看到这个架构,我们用Mermaid画两个图:一个是ER实体关系图(表示各个核心概念之间的关系),另一个是交互关系图(表示整个Agent的工作流程)。
ER实体关系图(Mermaid)
ER实体关系图用来表示各个「实体」(比如用户、Agent、LLM、工具、数据)之间的「关系」(比如用户提问给Agent、Agent调用LLM、Agent调用工具、工具访问数据)。
交互关系图(Mermaid)
交互关系图用来表示整个Agent的工作流程——从用户提问开始,到Agent把答案传给用户结束。
注意:Mermaid流程节点中不要有括号、逗号等特殊字符,所以我们会把一些长的名字简化一下(比如把「ReAct Agent」简化成「ReActAgent」,把「ChromaDB向量数据库」简化成「ChromaDB」,把「Yahoo Finance金融数据接口」简化成「YahooFinance」,把「Tavily网络搜索工具」简化成「Tavily」,把「Plotly数据可视化工具」简化成「Plotly」)。
问题拆解与解决思路:把「搭建投研Agent」这个大问题拆成小问题
问题背景
刚才我们讲了金融投研Agent的核心概念和架构,但如果我们要直接写代码,可能还是会觉得无从下手——因为「搭建投研Agent」这个问题太大了!
那怎么办呢?我们可以用**「把大象装冰箱」的三步式思维**——不对,我们可以用**「更细的五步式思维」**——把「搭建投研Agent」这个大问题,拆成五个小问题,逐个解决!
问题描述
我们的目标是搭建一个能做这三件事的投研Agent:
- 回答公司基本面问题:比如「苹果2024Q2的净利润是多少?毛利率同比增长了多少?」;
- 回答事件驱动问题:比如「2024年6月苹果发布Vision Pro正式版后,股价当天涨了多少?最近一周有什么相关的利好/利空新闻?」;
- 画简单的量化分析图:比如「帮我画苹果2024年1月到6月的收盘价趋势图,对比一下谷歌和微软的」。
问题拆解
我们把这个大问题拆成五个小问题:
- 小问题一:怎么获取金融数据?——包括结构化数据(比如财报核心指标、股价数据)和非结构化数据(比如财报原文、新闻);
- 小问题二:怎么存储和检索金融数据?——把非结构化数据转换成向量,存到向量数据库里,然后当用户问问题时,快速找到最相关的内容;
- 小问题三:怎么让Agent理解问题和规划任务?——用Prompt Engineering告诉Agent「怎么理解问题」「怎么规划任务步骤」「怎么调用工具」;
- 小问题四:怎么让Agent调用工具?——用LangChain把各个工具(ChromaDB、Yahoo Finance、Plotly、Tavily)包装成Agent能调用的格式;
- 小问题五:怎么让Agent整合答案和输出结果?——用LLM把各个工具的返回结果整合起来,生成通俗易懂的答案,或者画出漂亮的趋势图。
问题解决
接下来,我们就逐个解决这五个小问题!
小问题一:怎么获取金融数据?
我们需要获取两类数据:结构化数据和非结构化数据。
结构化数据的获取
结构化数据就是「整齐的表格数据」——比如财报的核心指标(营收、净利润、毛利率、EPS)、股价数据(开盘价、收盘价、最高价、最低价、成交量)。
我们用Yahoo Finance来获取结构化数据——因为它是免费的、开源的、而且数据非常全!我们可以用Python的yfinance库来连接Yahoo Finance。
非结构化数据的获取
非结构化数据就是「不整齐的文本数据」——比如财报原文、新闻、研报。
我们用Tavily Search来获取最新的新闻——因为它是专门为LLM设计的网络搜索工具,搜索结果非常准确,而且能直接返回文本内容!我们可以用Python的tavily-python库来连接Tavily Search。
我们还可以用SEC EDGAR来获取美国上市公司的财报原文——因为它是美国证券交易委员会的官方网站,所有美国上市公司的财报都在这里!不过SEC EDGAR的API有点复杂,我们今天就先不用了——我们可以手动下载苹果2024Q2的财报PDF,然后用Python的PyPDF2库来提取文本内容。
小问题二:怎么存储和检索金融数据?
我们用ChromaDB来存储和检索非结构化数据——因为它是免费的、开源的、而且非常容易上手!
具体步骤如下:
- 第一步:把非结构化数据切成小块——因为LLM的上下文窗口是有限的(比如GPT-4o-mini的上下文窗口是128k tokens,也就是大约10万字),如果我们把整个财报都传给LLM,它可能处理不过来——所以我们要把非结构化数据切成「小块」(比如每块1000个token);
- 第二步:把小块转换成向量——用「Embedding模型」把每一小块文本转换成一串数字(向量)——我们用的是OpenAI的
text-embedding-3-small模型,因为它既便宜又好用; - 第三步:把向量存到ChromaDB里——把向量和对应的小块文本一起存到ChromaDB里;
- 第四步:当用户问问题时,检索最相关的小块——把用户的问题也转换成向量,然后用「余弦相似度」在ChromaDB里找最相关的前N个小块(比如前5个)。
小问题三:怎么让Agent理解问题和规划任务?
我们用Prompt Engineering和ReAct Agent来让Agent理解问题和规划任务!
什么是Prompt Engineering?
Prompt Engineering就是「怎么和LLM说话」——就像你怎么和你的超级哥哥说话一样,如果你说的话很清楚、很具体,他就能给你更好的答案;如果你说的话很模糊、很笼统,他可能就不知道该怎么办。
什么是ReAct Agent?
ReAct Agent是一种非常流行的Agent架构——它的名字来源于「Reasoning(推理)」和「Acting(行动)」两个词。ReAct Agent的工作流程是:
- Thought(思考):Agent先思考「我现在需要做什么?」;
- Action(行动):Agent然后采取行动「调用某个工具」;
- Observation(观察):Agent接着观察「工具返回了什么结果」;
- 重复:Agent重复「思考-行动-观察」这个流程,直到它觉得不需要再调用工具了;
- Answer(答案):Agent最后生成答案。
我们可以用LangChain的create_react_agent函数来创建ReAct Agent!
小问题四:怎么让Agent调用工具?
我们用LangChain的Tool类来把各个工具(ChromaDB、Yahoo Finance、Plotly、Tavily)包装成Agent能调用的格式!
具体步骤如下:
- 第一步:定义工具函数——比如定义一个「get_stock_price」函数,用来获取股价数据;
- 第二步:用Tool类包装工具函数——给工具起个名字、写个描述(告诉Agent这个工具是用来做什么的);
- 第三步:把包装好的工具传给ReAct Agent。
小问题五:怎么让Agent整合答案和输出结果?
我们用LLM把各个工具的返回结果整合起来,生成通俗易懂的答案!如果用户需要画图,我们就用Plotly画趋势图,然后保存成HTML文件或者直接显示出来!
数学模型与公式:简单但重要的初中数学
余弦相似度:向量数据库的核心
刚才我们讲了,向量数据库用「余弦相似度」来衡量两个向量之间的相似程度——那什么是余弦相似度呢?
想象一下,你有两个向量A和B——它们就像两个从原点出发的箭头。余弦相似度就是这两个箭头之间的夹角的余弦值!
余弦值的范围是[-1, 1]:
- 如果两个箭头的方向完全相同,夹角是0度,余弦值是1——说明两个向量完全相似;
- 如果两个箭头的方向垂直,夹角是90度,余弦值是0——说明两个向量完全不相似;
- 如果两个箭头的方向完全相反,夹角是180度,余弦值是-1——说明两个向量完全相反。
余弦相似度的数学公式是:
cosine similarity(A,B)=A⋅B∥A∥×∥B∥ \text{cosine similarity}(A, B) = \frac{A \cdot B}{\|A\| \times \|B\|} cosine similarity(A,B)=∥A∥×∥B∥A⋅B
其中:
- A⋅BA \cdot BA⋅B 是向量A和向量B的点积——也就是把两个向量对应的元素相乘,然后加起来;
- ∥A∥\|A\|∥A∥ 是向量A的模长——也就是把向量A的所有元素的平方加起来,然后开平方根;
- ∥B∥\|B\|∥B∥ 是向量B的模长——和向量A的模长计算方法一样。
举例说明
假设我们有两个向量:
- 向量A = [1, 2, 3]
- 向量B = [4, 5, 6]
我们来计算一下它们的余弦相似度:
- 第一步:计算点积:A⋅B=(1×4)+(2×5)+(3×6)=4+10+18=32A \cdot B = (1 \times 4) + (2 \times 5) + (3 \times 6) = 4 + 10 + 18 = 32A⋅B=(1×4)+(2×5)+(3×6)=4+10+18=32;
- 第二步:计算向量A的模长:∥A∥=12+22+32=1+4+9=14≈3.7417\|A\| = \sqrt{1^2 + 2^2 + 3^2} = \sqrt{1 + 4 + 9} = \sqrt{14} \approx 3.7417∥A∥=12+22+32=1+4+9=14≈3.7417;
- 第三步:计算向量B的模长:∥B∥=42+52+62=16+25+36=77≈8.77496\|B\| = \sqrt{4^2 + 5^2 + 6^2} = \sqrt{16 + 25 + 36} = \sqrt{77} \approx 8.77496∥B∥=42+52+62=16+25+36=77≈8.77496;
- 第四步:计算余弦相似度:cosine similarity(A,B)=323.7417×8.77496≈3232.833≈0.9746\text{cosine similarity}(A, B) = \frac{32}{3.7417 \times 8.77496} \approx \frac{32}{32.833} \approx 0.9746cosine similarity(A,B)=3.7417×8.7749632≈32.83332≈0.9746。
哇!余弦相似度约等于0.9746——非常接近1!说明向量A和向量B非常相似!
EPS同比增长:衡量公司盈利能力的重要指标
EPS同比增长是指「今年某一季度的EPS和去年同一季度的EPS相比,增长了多少百分比」——它是衡量公司盈利能力的重要指标!
EPS同比增长的数学公式是:
EPS同比增长=(今年Qx的EPS−去年Qx的EPS去年Qx的EPS)×100% \text{EPS同比增长} = \left( \frac{\text{今年Qx的EPS} - \text{去年Qx的EPS}}{\text{去年Qx的EPS}} \right) \times 100\% EPS同比增长=(去年Qx的EPS今年Qx的EPS−去年Qx的EPS)×100%
举例说明
假设苹果2024Q2的EPS是1.46美元,2023Q2的EPS是1.26美元——我们来计算一下它的EPS同比增长:
- 第一步:计算分子:1.46−1.26=0.201.46 - 1.26 = 0.201.46−1.26=0.20;
- 第二步:计算分母:1.261.261.26;
- 第三步:计算比值:0.20/1.26≈0.15870.20 / 1.26 \approx 0.15870.20/1.26≈0.1587;
- 第四步:转换成百分比:0.1587×100%≈15.87%0.1587 \times 100\% \approx 15.87\%0.1587×100%≈15.87%。
哇!苹果2024Q2的EPS同比增长了约15.87%——非常不错!
项目实战:完整可运行的代码
开发环境搭建
在开始写代码之前,我们需要先搭建开发环境——我们用的是Python 3.10或更高版本!
第一步:安装Python
如果你还没有安装Python,可以去Python的官方网站(https://www.python.org/)下载最新版本的Python,然后按照提示安装——安装的时候记得勾选「Add Python to PATH」!
第二步:创建虚拟环境(可选但推荐)
为了避免依赖冲突,我们最好创建一个虚拟环境——虚拟环境就像一个「独立的小房间」,里面的东西不会影响外面的环境!
打开命令行(Windows用户用CMD或PowerShell,Mac/Linux用户用Terminal),然后输入以下命令:
# 创建虚拟环境(名字叫finance_agent_env)
python -m venv finance_agent_env
# 激活虚拟环境
# Windows用户用CMD:
finance_agent_env\Scripts\activate.bat
# Windows用户用PowerShell:
finance_agent_env\Scripts\Activate.ps1
# Mac/Linux用户用Terminal:
source finance_agent_env/bin/activate
如果虚拟环境激活成功,命令行的开头会出现(finance_agent_env)!
第三步:安装需要的库
我们需要安装以下库:
langchain:LLM应用开发框架;langchain-openai:连接OpenAI的LLM和Embedding模型;langchain-chroma:连接ChromaDB向量数据库;langchain-community:连接第三方工具(比如Tavily Search);yfinance:连接Yahoo Finance金融数据接口;plotly:数据可视化库;PyPDF2:提取PDF文本内容;
更多推荐

所有评论(0)