资讯动态

TradingAgents源码深度拆解:多智能体LLM如何协作完成金融决策

发布时间:2026/9/17 8:46:09 来源:尧图企业网站定制
1. 这个项目到底在解决什么问题第一次看到 TradingAgents 这个项目时我的第一反应其实是怀疑——LLM 做金融交易决策这东西靠谱吗市面上的“AI炒股”噱头太多了大多数要么是拿一个 prompt 包装成“智能投顾”要么就是纯统计模型配个聊天界面。但真正把整个项目的代码完整读下来之后我的看法有了明显改变。TradingAgents 不是“一个 prompt 问大模型买不买”那种玩具它是在多智能体 LLM 的框架下把一个真实的交易公司搬进了代码里。这个公司里有基本面分析师、情绪分析师、新闻分析师、研究员、交易员、风控员甚至还有投资组合经理。这些角色各自独立拥有不同的 prompt、不同的记忆、不同的工具调用权限通过多轮对话协作最终产出一个带仓位比例和止损止盈的完整交易决策。这个设计直觉上是对的。金融决策天然需要多角度信息交叉验证而不是某一个人“拍脑袋”。一个只靠单一 LLM 的决策系统相当于让一个全科医生同时做影像解读、病理分析、外手术——理论上什么都会一点但每个环节都缺乏深度。TradingAgents 的思路是把任务拆开让每个智能体专注一个细分领域然后用协作机制把分散的结论收敛成一条可执行的决策。整个框架对三类人很有价值想用 LLM 做量化决策研究的技术人关注多智能体协作模式的产品经理以及想从源码层面理解“多智能体系统到底怎么落地”的开发者。阅读这个项目不需要深厚的金融背景但最好对 Python、异步编程和 LLM API 调用有一定基础。接下来我会从代码设计的角度一层层拆解把每个角色、每条数据流、每个关键机制讲清楚最后附上完整的本地复现教程和踩坑记录。2. 角色体系把交易公司搬进代码里2.1 信息采集层三个分析师各司其职TradingAgents 的代码目录结构里agents/目录下是按角色拆分的 Python 文件每个文件对应一个智能体类。最底层的是三位分析师基本面分析师、情绪分析师、新闻分析师。这三个角色解决的是同一个问题——原始信息从哪来但各自的视角完全不同。基本面分析师的核心逻辑是“看财报、看估值”。它的 prompt 里明确要求关注营收增速、利润率和估值水平工具调用上会接入 yfinance 这类数据源拉取行情和财务数据。在源码层面它拿到公司 ticker 后会先调用数据工具获取历史价格和财务指标然后把这些结构化数据塞进一个精心设计的提示模板里让 LLM 输出对股票基本面状况的判断。这里有个细节值得注意分析师输出的不是一句“这只股票不错”而是一个结构化字典包含目标价、建议买入/持有/卖出和理由这个结构会直接影响后续角色能否顺利解析。情绪分析师和新闻分析师则处理另一类信息。情绪分析师侧重市场情绪指标比如恐惧贪婪指数、多空情绪、资金流向新闻分析师则会调用新闻搜索工具抓取近期关于目标标的的重大事件。有意思的是代码里给新闻分析师设计了一个“时效性权重”——越近的新闻在 prompt 里占的 token 权重越高这模拟了真实交易中“新信息比旧信息更有价值”的常识。这三个分析师并不是各干各的然后就结束了它们在设计上有层次递进的关系。情绪分析和新闻分析的结论会流向同一个汇总模块最终成为研究员做综合判断的素材。这个“采集-汇总-决策”的三层漏斗结构是整个项目的第一条主线。2.2 决策层研究员、交易员与风控员的制衡在信息采集层之上TradingAgents 搭建了一个包含制衡机制的决策层。研究员的职责是将三位分析师的结论整合成一份完整的研究报告交易员负责生成具体的交易决策包括方向做多/做空/观望、仓位比例、入场价、止损价和止盈价风控员则对交易员的方案进行审核判断风险是否符合约束条件。从代码结构上看交易员和风控员的 prompt 设计形成了一组天然的对抗关系。交易员被告知“相信自己的研究和分析敢于在分析结论正确时下重注”风控员则被要求“怀疑一切决策优先考虑极端情况下的亏损”。这种对抗不是偶然的它模仿了真实交易公司里 trader 和 risk manager 的紧张关系——一个负责进攻一个负责防守。最核心的部分是这三个角色的输出不是静态的。研究员的研究报告会反馈给分析师让他们知道自己的分析结论被如何使用从而在下一轮提供更有针对性的信息交易员的决策会交给风控员审核如果风控员认为风险过大系统会触发修正机制让交易员在当前价格区间内调整仓位或者放弃交易。这种反馈回路让整个系统不是“流水线式的单向传递”而是一个带有博弈特征的多轮协商过程。我还是建议你直接看代码验证这一点。在graph/目录下的编排逻辑中你会看到研究员完成输出后并不会直接把结果传给交易员而是先经过一层“格式校验”确保关键字段完整。这种防御式编程在 LLM 应用中特别重要——大模型输出的格式不稳定如果不做校验一次失败的解析就会让整个决策链崩溃。2.3 角色间的数据流与消息结构读 TradingAgents 源码时最开始让我有点绕的是它的消息传递结构。每个智能体之间的交互本质上是传递一个“字典对象”这个字典包含当前说话者、目标接收者、消息内容和额外的上下文元数据。消息内容本身也不是一段纯文本而是一个 JSON 结构里面有 thinking推理过程和 actions结构化决策两部分。我画了一个简化版的流程不用工具直接手画基本面分析师 → 汇总模块 → 研究员 → 交易员 → 风控员 情绪分析师 → 汇总模块 → 研究员 → 交易员 → 风控员 新闻分析师 → 汇总模块 → 研究员 → 交易员 → 风控员每一层之间都有明确的输入输出接口这让整个系统具备了很好的可替换性。比如你想把基本面分析师替换成一个自研的选股模型只要保证输出格式和原分析师一致其他角色完全不需要改动。这种松耦合设计正是多智能体框架最值得学习的地方。3. 核心机制多智能体协作的底层逻辑3.1 牛熊辩论从对抗中逼近真相TradingAgents 中最有辨识度的机制是“牛熊辩论”。在看代码之前我以为这只是一个简单的两轮对话——一个多头说买一个空头说不买。但实际实现比这复杂得多也有效得多。辩论流程被封装在agents.py的progressive_multi_agents方法里。整个流程是逐步迭代的多头先陈述看多逻辑空头提出质疑多头根据质疑修改自己的论点空头继续攻击更新后的论点。每一轮辩论双方都会收到对方的完整“思考过程”而不是一个简单的结论。这个设计背后的心理学原理是当一个人知道自己必须回应对手的观点时他给出的论点会比单方面陈述更严谨。代码里有一个细节很值得玩味——辩论轮数不是写死的而是由参数控制的。默认配置跑五轮但这个数字可以通过配置文件调整。轮数越少决策效率越高但结论可能比较粗糙轮数太多token 消耗会飙升而且多轮之后 LLM 常常开始自我重复。实测下来五轮是一个性价比比较高的平衡点这也是项目默认值为什么是五的原因。从技术实现上看牛熊双方并不是两个独立的 LLM 实例而是同一个模型在不同 prompt 下的两次调用。代码通过context上下文变量切换角色设定多头 prompt 里强调“你是坚定的看多者寻找所有可能推动股价上涨的因素”空头 prompt 里则强调“你是谨慎的风险厌恶者必须找出这笔交易的所有隐患”。这样做的好处是部署成本低——不需要为每个角色单独租用模型实例弊端是两个角色的“人格”差异完全由 prompt 决定如果 prompt 设计得不够鲜明辩论可能沦为同一种观点的复读。3.2 投资者的记忆和反思机制多智能体系统最容易陷入的坑是“每次都从零开始”。TradingAgents 的解决方案是用记忆机制和反思机制来克服这个问题。记忆机制在代码中体现为两类短期记忆和长期记忆。短期记忆就是当前决策回合内各角色的对话记录包含在上下文中传给每次调用长期记忆则是把上一轮交易决策的结果和反思结论存下来在新一轮决策开始时注入到相关角色的初始提示里。这是我看到的比较让我印象深刻的实现——它把“持续学习”的闭环真正落到了代码里。反思机制的处理方式也做了细致的设计每轮交易结束后系统会安排一个“反思智能体”负责复盘当天的决策流程。它看到的输入是完整的对话日志、最终交易决策和市场价格输出则是三块内容做对了什么、做错了什么、下次应该如何改进。这些反思结论会序列化后写入记忆文件在后续决策中作为参考。实际运行中反思机制的价值往往被低估。很多人觉得 LLM 做交易决策靠的是“推理能力”但真实场景里LLM 的推理能力在不同轮次之间波动非常大——同样的输入上午可能给出买入建议下午改成观望。反思机制不能消除这种波动但它可以把“为什么上次我给出了这个结论”这样的历史逻辑注入到新的上下文中让模型更容易保持一致性。3.3 工具调用与输出解析读 TradingAgents 源码时我发现多智能体框架中一个容易被忽视的核心工程问题其实是“工具调用和输出解析”。没有任何一个 LLM 能原生生成“格式完全正确的 JSON”但整个交易决策链要求每个节点都输出结构化的数据。项目的解决方案是双保险。第一层保险是在 prompt 中反复强调输出格式并给出标注了字段示例的 JSON 模板——比如“target_price 必须是数字reasoning 必须是中文且不少于 50 字”。这一层解决的不是格式问题而是让模型理解和遵循格式约束的能力。第二层保险才是关键解析层用了容错性很强的提取逻辑。如果你的输出中多了一个字段解析器不会报错它会丢弃多余字段如果你的输出中少了某个字段解析器会尝试从内容中寻找替代值如果 JSON 结构完全坏了解析器会触发重试机制把原始文本重新喂给模型并附带一条明确的提示“上一条输出格式不正确请严格按照 JSON 模板回答。”这套容错机制让我意识到——多智能体框架真正的技术难点其实不在于让智能体“更聪明”而在于让它们之间的通信足够稳定。智能体本身是概率性的但如果框架的“中间层通信协议”也是概率性的整个系统就完全不可控。把通信层做成确定性组件才是 TradingAgents 能跑通的关键。4. 复现与实操让代码在自己机器上跑起来4.1 环境准备与依赖安装如果你像我一样喜欢边读代码边跑实验建议直接用官方推荐的安装方式。项目基于 Python 3.10依赖管理使用 uv这在现代 Python 项目中越来越常见。uv 的优势是快——比传统的 pip 快一个数量级而且支持锁文件能保证依赖版本的一致性。安装步骤很直接我实际操作时没有遇到什么意外git clone https://github.com/TauricResearch/TradingAgents.git cd TradingAgents uv sync这里有一个容易踩的坑如果你本机的 Python 版本是 3.9 或者更低uv sync可能会直接报错提示找不到兼容的解释器。建议先检查一下版本python3 --version。如果版本不够可以用 conda 建一个 3.11 的独立环境。依赖安装完成后项目会在当前目录生成一个.venv虚拟环境后续所有命令都要用uv run前缀来执行。我不太建议手动 source 虚拟环境因为 uv 在锁文件层面做了很多环境治理手动激活反而容易引入版本错位。4.2 配置模型参数与 API 密钥在第一个版本中模型支持 OpenAI 和 Anthropic 两大类配置入口在.env.example和config.py里。复制.env.example为.env填入你使用的模型 API key。这是准备工作里的重中之重——很多人在这一步漏掉了模型名称的配置导致后续运行时反复报 model not found 的错误。cp .env.example .env # 编辑 .env 文件填入 OPENAI_API_KEY 或 ANTHROPIC_API_KEYTradingAgents 支持用同一个框架调用多种模型而且推荐的做法是“廉价模型处理大信息量、昂贵模型做最终决策”。比如新闻分析师每轮要处理文本量很大的新闻列表用大模型成本高这时可以切换到主打性价比的模型交易员和风控员是决策链条的核心输出质量要求更高用最新最强的模型更稳妥。这个配置思路值得借鉴到所有 LLM 应用里——不是每个角色都要用最强模型按需分配才是平衡成本和效果的正确姿势。在config.py中你还可以调整温度temperature和最大 token 数。许多初学者会误以为温度越高越好但在这个项目的场景里温度设置过高会让 JSON 输出格式变得不稳定触发大量的解析重试。我自己的经验是分析类角色温度调到 0.3~0.5 之间最终决策类角色保持在 0.1 以下。这个设置不是拍脑袋定的0.1 的高确定性能让交易员在类似输入下给出更加一致的逻辑更适合一致性要求高的场景。4.3 运行回测与查看决策日志配置完成后运行回测的命令是uv run python -m src.run_backtest --ticker AAPL --start-date 2024-06-01 --end-date 2024-12-31 --initial-balance 100000这里把代码读透之后你会发现回测无非是把主循环串起来的事情。主循环按交易日推进每个交易日都执行一次完整的“分析师 → 研究员 → 交易员 → 风控员”流程。如果你的股票池里有 10 只股票负责采集信息的分析师就要跑 N 次——假设每轮调用需要 30 秒10 只股票光分析阶段就要 5 分钟以上。这个体量在实际使用中体验比较重实时决策的能力天然受限。运行过程中项目会在logs/目录下生成完整的 JSON 对话日志。我建议你花点时间手动翻一下这些日志——它们记录了每一步决策的推理过程是理解整个框架最好的学习材料。日志里的“思考过程”部分会让你直观感受到多智能体和单 prompt 的本质差异每个角色都在用自己的视角质疑同一份数据最后的决策是多方博弈后的均衡结果。日志里还会记录每个交易日的期末持仓和收益回测结束后有一个汇总表展示策略总收益、最大回撤和夏普比率。这里我要泼一盆冷水回测结果好看不代表实盘能赚钱。TradingAgents 的决策速度以分钟计而真实市场的行情变化以毫秒计——这个框架更适合做“日频级别的辅助决策研究”而不是高频交易系统。把它当学习工具收获会更大。4.4 换成中文数据的适配方法很多国内读者关心的一个问题是能不能让这套框架处理中文股票数据答案是能但要动几个地方。首先是数据源。项目默认用 yfinance在国内访问本身就不太稳定如果你想分析 A 股或港股建议换用 akshare 或 tushare。具体做法是改tools/目录下的数据获取函数让它在返回结构上保持和原来一致——一个包含日期、开盘价、收盘价、成交量等字段的 DataFrame。其次是新闻搜索工具。项目默认走 Tavily你同样可以替换成中文财经新闻接口。理论上最省事儿的做法是保留工具接口只改工具内部的抓取逻辑。只要返回的数据结构不变后续所有分析智能体都能正常工作这个松耦合的设计在这里体现出了真正的价值。最后是 prompt。虽然有现成的中文翻译版本但直接翻译未必好用因为金融领域的专业术语如果翻译不准确分析质量会大打折扣。更合理的方式是按角色的核心目标重写 prompt——比如基本面分析师的 prompt你要保留“必须输出目标价、建议、理由”这三个核心要素但表达方式可以调成更贴中文语境的表述。5. 踩坑实录与排查技巧5.1 运行中的高频问题速查表实际操作 TradingAgents 时有几个问题是几乎每个人都会遇到的。我把我的排查经验整理成表格方便你对照处理。问题现象直接原因解决方法导入模块时报 ModuleNotFoundError项目根目录不在 PYTHONPATH 中运行前先执行export PYTHONPATH$(pwd)API 返回 RateLimitError多智能体并发调用超出速率限制在配置中增加延时间隔或使用支持高并发的 API 端点JSON 解析失败频繁触发重试模型输出格式不稳定温度设置过高降低 temperature尤其是决策类角色回测结果全是 None数据源返回空 DataFrameticker 代码不对单独测试数据接口确认返回数据不为空内存开销极大多天回测时把全部天的日志同时载入内存改用惰性加载或按天读取日志而不是一次性读取全部5.2 你在读代码时容易忽略的细节有几个容易被忽略但影响很大的实现细节值得多说几句。第一个是并发控制。TradingAgents 不是一个同步执行的项目它的智能体调用设计成了异步并发模式。在回测多个 ticker 时系统会同时启动多个分析流程。这个设计带来的好处是速度快副作用是如果你在代码里阻塞地等待某一个调用可能会引起死锁。最简单规避方式是不要改动主循环的异步逻辑只在传入数据层面做扩展就好。第二个是 token 消耗的估算。每次决策调用的 token 数非常可观分析师 研究员 交易员 风控员 反思机制单只股票单日可能消耗 3 万至 8 万 token。如果你用的是按量付费的 API跑一次覆盖 30 天的回测、每只股票都要完整评估费用可能超出预期。我在本地跑过一个 10 只股票的实验单日成本接近十几美元量级——虽然不至于破产但如果不做预算控制确实会肉疼。建议小规模验证时限制股票数量和回测天数。第三个是记忆文件的持久化格式。反思机制的长期记忆默认以 JSON 格式存储每次交易结束后重写整个文件。如果你同时跑多个 ticker 的并行任务或者每只股票会同时开多个进程多进程同时对同一个记忆文件写入可能造成文件覆盖和数据丢失的问题。我的处理方法是给每个 ticker 单独建一个记忆目录避免所有角色共用同一个文件。5.3 关于“幻觉”和决策可信度的一些体会读交易日志时你需要建立对“AI 幻觉”的敏感度。多智能体的“多”在某种程度上会把幻觉放大——因为你看到的“多方信息交叉验证”实质上可能只是同一个模型用不同 prompt 重复了一遍类似的错误。实测中最常见的幻觉是“编造财报数据”。当基本面分析师拿到的数据缺失时它倾向于用训练语料中类似的上市公司的数据来“脑补”而这种脑补出来的数字看起来非常合理几乎无法直观识别。想排查这个问题需要在数据采集阶段加一层日志把每次工具调用返回的真实数据记录下来和 LLM 输出的分析结论做比对。没有这层日志你根本无法确定一个看似专业的分析底层数据是不是假的。我的建议是不要轻易把 TradingAgents 的结论当作真实的投资依据。它更适合作为一个研究工具让你理解“多智能体协作如何影响决策结果”。如果你要把它用于实际交易必须叠加一套独立的校验机制至少要确保工具层的数据真实可靠。6. 从 TradingAgents 看多智能体框架设计的通用经验6.1 智能体间的“通信协议”就是核心架构读这一个项目给我最大的感悟是多智能体框架的核心架构归根结底在于——你如何定义智能体之间的通信协议。TradingAgents 的通信协议是“结构化 JSON 消息”。每个智能体的输出都包含了 thinking 和 actions 两个关键字段thinking 给链路中的下一个角色提供推理依据actions 提供结构化决策。这种设计的本质是通过限定消息格式来降低通信的熵——即使底层 LLM 是概率性的、不可靠的但只要它遵循了输出格式整条决策链就能稳定运转。如果你正在设计自己的多智能体系统我建议你一开始就花时间定义好消息 schema而不是等到联调时才补。我把这个经验类推到其他领域实践过——不管你是做客服机器人编排、代码评审 agent 还是内容生产团队清晰的通信协议都是第一优先级否则你只会陷入“每个智能体都正常工作但它们之间的对话却让人一头雾水”的泥潭。另外我在对比 AgentScope 这类多智能体框架时发现TradingAgents 的项目代码更像是一个“领域内专用框架”——它没有搞通用的组件抽象而是直接用角色名来定义模块把协作逻辑和领域逻辑强耦合在了一起。这种选择有利有弊优点是项目结构清晰业务人员也能看懂代码缺点是如果你想把它改造成一个通用平台要做大量的抽象重构投入产出比不高。如果你需要一个更通用的底座AgentScope 这类框架可能更合适但如果你想深入理解某个领域的多智能体落地方式TradingAgents 反而是更值得精读的教材。6.2 可扩展性设计怎么改而不破坏全局一个多智能体系统能不能长线维护取决于它是否允许你“替换一个模块而不炸掉整个系统”。TradingAgents 在这方面做得相当不错总结下来有三点设计功不可没。第一每个智能体都被封装成一个独立的类类与类之间没有直接引用关系。它们只知道接收某种消息格式、输出某种消息格式并不知道对方内部是怎么实现的。这意味着你可以轻松地把“基于 LLM 的基本面分析师”替换成“一个纯规则选股脚本”只要输出格式保持一致下游角色完全无感。第二配置层把几乎所有超参数外置了。辩论轮数、模型温度、记忆开关、token 上限、模型型号都在配置文件中管理。对于一个有实验性质的项目来说这是非常友好的——你可以只改配置就尝试完全不同的参数组合不需要改业务代码。第三工具层与智能体层是分离的。数据获取、新闻搜索、价格查询这些都是独立的工具函数智能体通过函数调用来使用它们。如果你不想用 Tavily写一个返回同样格式的搜新闻函数替换掉即可不用碰任何智能体代码。这种插件化的工具设计是我认为这类框架落地到真实生产环境的最重要条件。6.3 这套框架的天花板在哪里把 TradingAgents 的源码读完有一个结论需要坦诚地说多智能体 LLM 的金融交易框架在实际落地中会遇到非常硬的边界。第一个边界是延迟。完整的“分析 → 研究 → 交易 → 风控”链路在十几次甚至几十次 LLM 调用之间串行/并行穿梭一次决策可能长达数十秒甚至分钟级。这在日级交易场景勉强够用但任何需要秒级响应的策略都直接出局。第二个边界是成本。token 消耗与智能体数量、辩论轮数、上下文长度线性正相关而且往往呈指数级放大。当决策频率提高时成本曲线会变得非常陡峭这是纯 token 消耗和缓存之间的线性权衡没有边际成本递减。第三个边界是验证困难。你可以用历史数据回测但 LLM 的记忆污染问题让回测结果的可信度打折扣——模型可能已经从训练数据中见过这些历史事件。即便你严格隔离数据交易本身是一个多因子的动态博弈过程静态回测也很难逼近真实表现。但这三者并不妨碍这个框架的学习价值。恰恰因为它的边界清晰我们反而能更清楚地看到多智能体系统的能力边界与适用场景。它是理解“LLM Agent 如何协作”的优秀教材但如果你指望配置几个角色然后躺在家里收钱那失望是大概率事件。7. 写在最后我在实际运行中的几点体会跑完整个项目、翻了大量决策日志之后我最大的体会是多智能体系统的价值不在于“让 AI 替你赚钱”而在于“让决策过程从黑盒变成白盒”。传统量化模型的决策是一个人类难以解释的黑盒而 TradingAgents 的每一个决策步骤都留有完整推理痕迹。这种透明性本身就有巨大的研究价值。另外也分享一个小技巧如果你只是学习代码而不想花太多 API 费用可以把回测天数设短一点比如只跑 5 个交易日就足以观察完整的决策链路。配置里把反思机制的开关先关掉也能省一部分 token。最后想说的是不要被框架的名字吓到——它本质上不是一个投资工具而是一个多智能体协作模式的范例。你把金融场景换成医疗问诊、法务咨询、供应链管理框架的核心思想依然是成立的拆分任务、多角色协作、结构化通信、审慎风控。这才是这个项目最有迁移价值的部分。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价