TradingAgents 介绍

TradingAgents 是一个基于多代理系统的金融交易框架,专为复杂市场环境中的决策支持而设计。它模拟真实交易公司的工作流程,通过多个专门的人工智能代理共同分析市场数据,做出交易决策。

核心特点:

# 项目核心文件
main.py
pyproject.toml
requirements.txt

项目采用模块化设计,核心功能集中在 main.py 文件中,依赖管理通过 pyproject.toml 和 requirements.txt 实现。

📖
扩展知识点:多代理系统在金融领域的前景

多代理系统(Multi-Agent System,MAS)是人工智能领域一个重要的研究方向,其核心理念是将复杂任务分解为多个子任务,由专门的代理协作完成。在金融交易领域,这种架构特别适合,因为金融市场本身就是由众多参与者构成的复杂系统。传统量化交易系统通常依赖单一的数学模型或规则引擎,难以应对突发的市场变化。而多代理系统中的每个代理可以从不同角度分析市场——新闻分析师关注信息面,技术分析师关注价格走势,风控经理关注下行风险——最终的综合决策比任何单一分析更加稳健。TradingAgents 正是将这一学术理念工程化落地的一个优秀案例。

🎯
扩展知识点:TradingAgents 与传统量化交易的区别

传统量化交易系统通常基于统计学模型(如均值回归、动量策略)或机器学习模型(如随机森林、神经网络),它们通过分析历史价格数据来预测未来走势。TradingAgents 则采用了一种截然不同的方法:它不直接预测价格,而是模拟一个投资团队的决策过程。每个代理都有自己的角色设定、专业知识和分析视角,它们之间通过辩论和协商达成共识。这种方法的优势在于可解释性更强——你可以清楚地知道为什么系统建议买入或卖出,因为每一步推理过程都是可见的。此外,通过调整代理的角色设定,你可以快速改变系统的投资风格,而不需要重新训练模型。

📊

数据驱动决策

TradingAgents 整合新闻舆情、技术指标、基本面数据等多维度信息源,让交易决策不再依赖单一数据维度,而是全方位、立体化的市场洞察。

🤖

AI 代理协作

多个专业化的 AI 代理各司其职,从不同角度分析同一只股票,模拟真实投资团队的工作方式,实现更全面的分析覆盖。

⚖️

辩论式风控

通过激进派、保守派和中立派的模拟辩论,让系统在做出决策前充分考虑正反两面因素,避免过度乐观或过度悲观。

TradingAgents 的主要目标是什么?

01

认识 TradingAgents

一个让 AI 代理团队帮你做交易决策的 Python 框架

想象一下这个场景

你是一名投资者,每天需要阅读大量新闻、财报、社交媒体讨论,才能决定"这只股票该买还是该卖?"。这项工作费时费力,而且人类很难做到完全客观。

TradingAgents 就是来帮你解决这个问题的。它不是简单的"AI 选股器"——它更像是一个AI 代理团队,每个代理各有分工,共同完成从信息收集到最终决策的完整流程。

💡
关键洞察

TradingAgents 的核心理念来自一个重要的软件工程原则:职责分离。就像一个真实的投资公司里有分析师、研究员、交易员、风控经理一样,每个角色只专注于自己最擅长的事情,最终由投资组合经理综合所有人的意见做出决策。

一次完整的分析流程

假设你想分析 NVIDIA(NVDA)这只股票。以下是 TradingAgents 内部发生的事情:

👤
📊
分析师
🔬
研究员
💰
交易员
⚖️
风控辩论
🎯
组合经理
点击「下一步」开始

代码长什么样?

TradingAgents 的核心入口是一个 ,叫 TradingAgentsGraph。下面是它最核心的使用方式:

代码
from tradingagents.graph.trading_graph import TradingAgentsGraph

ta = TradingAgentsGraph()

result = ta.propose(
    "NVDA",
    "2024-05-10"
)
大白话

从项目中导入主要的交易分析工具

创建一个分析器实例

启动分析流程,告诉它:

我要分析 NVIDIA 公司的股票

使用 2024 年 5 月 10 日的市场数据

等待结果返回——包含完整的分析报告和交易建议

📌
你知道吗?

这短短几行代码背后,系统会启动 10+ 个 AI 代理,进行数十次 API 调用,涉及新闻分析、技术指标计算、风险评估等多个环节。你看到的只是冰山一角。

项目结构一览

这个项目的代码组织得非常清晰,每个文件夹对应一种职责:

tradingagents/ 项目核心代码
agents/ 所有 AI 代理的定义:分析师、交易员、风控等
graph/ 编排所有代理协作的工作流图
dataflow/ 数据获取:新闻、股价、社交媒体
tools/ 代理可以使用的工具(搜索、计算等)
config.py 项目配置:API 密钥、模型选择等

为什么选择多代理架构?

你可能会问:为什么不直接用一个强大的 AI 模型来完成所有分析?答案涉及多个重要方面:

🎯

专业化深度

每个代理只需要专注于一个领域,它的 System Prompt 可以针对该领域精心优化。一个"万事通"的 AI 不如在各个领域都有专家。

🔄

并行处理

多个分析师可以同时工作,互不干扰。比如新闻分析师和情绪分析师可以同时收集数据,大大缩短整体分析时间。

🛡️

辩论制衡

风控模块中三个不同立场的代理互相辩论,避免单一视角的偏见。这种"对抗性分析"能发现单个代理容易忽略的风险。

📌
从软件工程角度理解

多代理架构本质上是经典的"关注点分离"原则在 AI 领域的应用。就像微服务架构将单体应用拆分成独立服务一样,TradingAgents 将一个复杂的分析任务拆分成独立的代理。好处类似:更容易维护、更容易测试、更容易扩展。如果你需要增加一个新的分析维度(比如链上数据分析),只需要增加一个新的分析师代理即可。

TradingAgents 的核心设计理念是什么?

02

AI 代理团队

认识 TradingAgents 中的每个"角色"以及它们的职责

为什么需要多个代理?

想象你是一个管弦乐队的指挥。如果你要求一个小提琴手同时演奏小提琴、大提琴和定音鼓,结果一定是一团糟。同样,如果你让一个 AI 同时分析新闻、计算技术指标、评估风险……它大概率每件事都做得不够深入。

TradingAgents 的解决方案很简单:让每个 代理 只做一件事,做到极致。

📊

市场分析师

负责收集和分析特定维度的市场数据——新闻、技术面、基本面、社交媒体情绪等

🔬

研究经理

汇总所有分析师的报告,制定一份综合投资计划

💰

交易员

把抽象的投资计划变成具体的买卖建议

⚔️

风控辩论员

从激进、保守、中立三个角度对交易建议进行辩论

🎯

投资组合经理

听完辩论后,做出最终决策:买、卖还是持有

团队是怎么沟通的?

在 TradingAgents 中,代理之间通过一个共享的状态来传递信息。让我们看一段模拟对话:

交易员代理的代码

让我们看看"交易员"代理是怎么用代码实现的。它的任务是把研究员的投资计划变成具体的交易建议:

代码
def create_trader(llm):
    def trader_node(state, name):
        company = state["company_of_interest"]
        plan = state["investment_plan"]

        messages = [
            {"role": "system",
             "content": "You are a trading agent..."},
            {"role": "user",
             "content": f"Based on analysis...
              {plan}..."}
        ]

        return {"trader_investment_plan": result}
大白话

创建交易员代理,给它一个 AI 大脑(llm)

定义交易员的工作函数

从共享状态中获取:要分析哪家公司

从共享状态中获取:研究员的投资计划

给 AI 发送消息:

第一条:告诉 AI "你是交易员"

第二条:告诉 AI "根据这份投资计划,做出具体建议"

把交易建议写回共享状态

💡
关键洞察

注意看 state["investment_plan"] 这行——交易员直接从共享状态中读取研究员的计划。这就是代理间的通信方式:不打电话、不发消息,而是读写一个共享的数据板。这就像医院里不同科室的医生都查看同一份病历一样。

每个代理的"性格"是怎么设定的?

每个代理都有自己独特的 System Prompt,告诉它应该以什么身份、什么风格来分析问题。让我们看看几个关键的设定:

新闻分析师 "You are a news analyst..." — 专注于新闻事件如何影响股价
技术分析师 专注于价格趋势、均线、MACD 等技术指标
激进辩论员 被设定为偏激进的风格,倾向于抓住每一个上涨机会
保守辩论员 被设定为偏保守的风格,总是提醒注意下行风险

风控辩论:三视角碰撞

TradingAgents 最独特的设计之一就是风控模块的辩论机制。三个不同立场的代理分别从激进、保守、中立三个角度对交易建议进行质疑和论证。

代码
def create_risk_debaters(llm):
    bull = create_bull_researcher(llm)
    bear = create_bear_researcher(llm)
    neutral = create_neutral_researcher(llm)

    def debate_node(state):
        plan = state["trader_investment_plan"]
        bull_view = bull(state)
        bear_view = bear(state)
        neutral_view = neutral(state)
        return {
            "bull_debate": bull_view,
            "bear_debate": bear_view,
            "neutral_debate": neutral_view
        }
    return debate_node
大白话

创建三个风控辩论员

激进派(Bull):寻找看涨的理由

保守派(Bear):寻找看跌的风险

中立派(Neutral):客观分析利弊

辩论函数:获取交易员的计划

三个辩论员分别从自己的立场分析

将三种观点都写回状态,交给最终决策者

💡
为什么辩论比单一判断更好?

研究表明,单一 AI 判断在金融领域容易受到"确认偏差"的影响——如果你让 AI 做看涨分析,它倾向于只找利好因素。通过强制三个不同立场的代理互相辩论,系统能更全面地评估风险和机会。这就像法庭上的控辩双方制度——真相往往在争论中浮现。

深入理解代理设计

📖
扩展知识点:代理的可替换性与可组合性

TradingAgents 的一个重要设计原则是代理的可替换性。由于所有代理都遵循相同的接口约定——接收状态、返回新字段——你可以自由替换任何一个代理而不影响其他部分。例如,你可以把新闻分析师从基于 GPT 的实现换成基于 Claude 的实现,只需要保持输出格式不变。更进一步,你可以为同一个角色创建多个不同风格的实现,然后通过配置选择使用哪个。这种可组合性让 TradingAgents 可以快速适应不同的投资风格和市场环境。想象一下,你可以为美股市场配置一套代理组合,为加密货币市场配置另一套,只需修改配置文件即可切换。

🎯
扩展知识点:数据获取层的设计智慧

TradingAgents 的 dataflow 模块负责从各种数据源获取原始数据,包括 Finnhub(股票行情和新闻)、Yahoo Finance(历史价格)、Reddit 和 Twitter(社交媒体情绪)等。这些数据获取函数被设计为独立的工具,分析师代理通过函数调用来使用它们。这种设计的巧妙之处在于:代理不需要知道数据从哪里来,只需要告诉工具需要什么数据,工具会自动完成数据获取和预处理。如果未来某个数据源不可用了,你只需要修改对应的工具函数,不需要修改任何代理的代码。

🔌

工具层抽象

数据获取逻辑封装为独立工具,代理通过统一的函数调用接口访问,实现数据源和代理的解耦。

🎭

角色可替换

每个代理遵循相同的接口约定,可以自由替换实现或切换不同风格,不影响整体工作流。

📋

状态驱动

所有代理通过共享状态通信,新代理只需知道读取哪些字段、写入哪些字段,无需了解其他代理的存在。

TradingAgents 中的代理之间是如何传递信息的?

风控辩论机制的核心优势是什么?

核心概念

TradingAgents 的核心是多代理架构,每个代理负责特定的市场分析任务,通过协同工作做出综合决策。

分析师:根据最新财报,建议增持
交易员:收到,正在评估买入时机
风控:请注意当前市场波动风险

主要组件:

class TradingAgentsGraph:
  def __init__(self):
    self.analysts = [...]
    self.researchers = [...]

TradingAgentsGraph 类是系统的核心,负责初始化各个代理并管理它们之间的协作。

📖
扩展知识点:LangGraph 工作流编排

TradingAgents 底层使用 LangGraph 来编排代理之间的工作流。LangGraph 是 LangChain 生态系统中的工作流引擎,它把复杂的代理协作过程建模为一个有向图(Directed Graph)。图中的每个节点代表一个代理或一个处理步骤,边代表数据流向。LangGraph 提供了条件分支、循环和并行执行等能力,让 TradingAgents 可以灵活地编排不同代理的执行顺序。例如,市场分析师可以并行工作(同时分析新闻和技术面),但风控辩论必须等交易员给出建议后才能开始。这种基于图的编排方式比传统的线性流水线更加灵活,可以根据中间结果动态调整后续流程。

🎯
扩展知识点:共享状态的设计哲学

TradingAgents 中的所有代理通过一个共享的状态字典传递信息。这个设计选择看似简单,实际上有深层的工程考量。与消息传递模式相比,共享状态有几个优势:第一,所有代理都可以看到完整的分析过程,而不只是前一个代理的输出;第二,调试时可以直接检查状态内容,理解每一步的推理过程;第三,新增代理不需要修改其他代理的代码,只需要读取它需要的状态字段并写入新的字段。这种模式在软件工程中被称为"黑板模式"(Blackboard Pattern),最早用于人工智能领域的语音识别系统,后来被广泛应用于多专家系统的协作场景中。

📌
扩展知识点:代理的 Prompt 工程技巧

TradingAgents 中每个代理的效果很大程度上取决于它的 System Prompt 质量。一个好的 Prompt 需要包含:明确的角色定位(你是一个什么样的专家)、具体的任务说明(你需要分析什么)、输出格式要求(按什么结构返回分析结果)和约束条件(注意什么风险)。TradingAgents 的开发者通过反复实验优化每个代理的 Prompt,确保输出格式统一、分析深度足够、且不会产生幻觉。你可以通过修改这些 Prompt 来定制系统的投资风格——比如让保守辩论员更加强调止损策略,或者让技术分析师更关注长期趋势而非短期波动。

以下哪个组件负责最终交易决策?

03

实践应用

从配置到运行,掌握 TradingAgents 的完整使用流程

安装与环境配置

在开始使用 TradingAgents 之前,你需要完成以下配置步骤:

代码
# 克隆项目
git clone https://github.com/TauricResearch/TradingAgents.git
cd TradingAgents

# 安装依赖
pip install -r requirements.txt

# 配置环境变量
# 创建 .env 文件:
OPENAI_API_KEY="your-api-key"
FINNHUB_API_KEY="your-finnhub-key"

# 启动 CLI 交互
python main.py --ticker NVDA --date 2024-05-10
大白话

从 GitHub 克隆项目代码

安装所有 Python 依赖包

配置 AI 模型的 API 密钥(用于调用 GPT 等)

配置金融数据 API 密钥(用于获取实时股票数据)

运行分析:指定股票代码和分析日期

⚠️
API 费用提醒

每次完整的分析会消耗大量的 API 调用(通常 10-20 次以上)。如果使用 GPT-4,单次分析成本可能在 $0.5-2 之间。建议在开发阶段使用 GPT-3.5 或更便宜的模型进行测试,确认效果后再切换到更强的模型。

LangGraph 工作流

TradingAgents 使用 LangGraph 来编排多个代理的协作流程。理解这个工作流图是掌握整个系统的关键:

👤
用户输入
📊
分析师组
🔬
研究经理
💰
交易员
⚖️
风控辩论
🎯
组合经理
点击「下一步」开始

完整分析示例

让我们看一个完整的分析流程,了解每个阶段会产出什么样的信息:

如何扩展新的分析师?

TradingAgents 的模块化设计让你可以轻松添加新的分析维度。假设你想增加一个"链上数据分析师":

代码
def create_onchain_analyst(llm):
    def onchain_node(state):
        company = state["company_of_interest"]
        
        # 获取链上数据
        onchain_data = fetch_onchain_metrics(company)
        
        messages = [
            {"role": "system",
             "content": "You are an on-chain data analyst..."},
            {"role": "user",
             "content": f"Analyze {company}: {onchain_data}"}
        ]
        
        result = llm.invoke(messages)
        return {"onchain_report": result.content}
    return onchain_node
大白话

创建一个新的链上数据分析师

定义它的核心工作函数

从共享状态中获取要分析的公司

调用自定义函数获取链上数据(比如 TVL、交易量等)

给 AI 设定角色:"你是链上数据分析专家"

把链上数据交给 AI 分析

将分析报告写回共享状态

📌
扩展要点

添加新分析师需要三个步骤:(1) 在 agents/ 目录下创建新文件定义代理函数;(2) 在 dataflow/ 中添加数据获取函数;(3) 在 graph/ 的工作流图中注册新节点。整个过程不需要修改现有代码,完美符合开闭原则。

生产环境优化建议

📖
扩展知识点:API 成本优化策略

TradingAgents 每次完整分析会消耗大量 LLM API 调用。在生产环境中,成本优化是一个重要课题。以下是几个实用策略:第一,对分析师使用较小的模型(如 GPT-3.5-Turbo),只在最终决策阶段使用大模型(如 GPT-4);第二,实现缓存机制——对于同一天同一只股票的分析结果进行缓存,避免重复分析;第三,使用流式输出减少超时风险,同时让用户更快看到中间结果;第四,设置合理的 Token 上限,避免代理输出过长的分析报告。通过这些优化,你可以将单次分析成本从 2 美元降低到 0.3 美元以内,同时保持分析质量基本不变。

🎯
扩展知识点:从分析到实盘的注意事项

TradingAgents 是一个研究项目,其输出仅供参考,不构成投资建议。如果你打算将系统的分析结果应用于实盘交易,需要注意以下几点:第一,回测偏差——系统基于历史数据训练和分析,但过去的表现不代表未来;第二,市场冲击——当你的交易规模较大时,实际成交价可能显著偏离分析时的价格;第三,延迟问题——从分析开始到决策输出可能需要几分钟,在此期间市场可能已经变化;第四,合规要求——在大多数国家和地区,自动化交易系统需要符合金融监管要求。建议先在模拟环境中充分验证系统表现,再谨慎地用于实盘。

💰

分级模型策略

分析师用小模型降低成本,最终决策用大模型保证质量。在成本和效果之间找到最佳平衡点。

📦

结果缓存

对同一股票同一天的分析结果进行缓存,避免重复调用 API。使用 Redis 或文件系统存储缓存。

🧪

模拟验证

在 Paper Trading 环境中验证系统表现,记录胜率、盈亏比等关键指标,持续优化代理配置。

TradingAgents 使用什么框架来编排代理之间的协作流程?

要添加一个新的分析维度,最少需要修改哪些内容?