01

交易室的秘密

想象 5 个 AI 分析师正在激烈争论:要不要买入 AAPL 股票?

每笔交易背后,都是一场辩论

在真实的对冲基金里,一个交易决策从不由一个人拍板。基本面分析师看财报,技术分析师看图表,新闻分析师看宏观,风控经理看风险——他们争论,直到达成共识。

TradingAgents 把这套流程完全复刻了出来,只不过每个角色都换成了 LLM。你输入一个股票代码,5 秒后,一场 AI 辩论会就开始了。

💡
为什么是 57K Stars?

TradingAgents 是目前 GitHub 上最受关注的金融 AI 开源项目之一。它不只是一个"调用 GPT 问股票"的脚本——它是一套完整的多智能体系统,有完整的辩论、风控和决策流程。">

你输入 "NVDA" 之后,发生了什么?

当你运行 ta.propagate("NVDA", "2026-01-15"),整个系统会按照一条流水线自动运转:

1
4 位分析师同时开工

基本面、技术面、新闻、社交媒体——四条数据流并行采集,各自生成报告

2
多头 vs 空头:研究员辩论

Bull 研究员拿着 4 份报告为买入辩护,Bear 研究员为做空辩护——轮流发言,可配置辩论轮数

3
交易员出具交易提案

Research Manager 综合辩论,Trader 给出具体的买/卖/持有方案

4
三位风控专家再次辩论

激进派、保守派、中立派对交易方案展开风险讨论

5
Portfolio Manager 最终拍板

综合所有信息,输出 Buy / Overweight / Hold / Underweight / Sell

为什么这个设计思路值得你学习?

TradingAgents 最有价值的地方不是它能不能赚钱——而是它展示了一套构建AI Agent 协作系统的完整模式。

🎭

角色专业化

每个 Agent 只干一件事,靠不同的 prompt 赋予不同视角

🔄

结构化辩论

对立观点互相质疑,比单一 AI 独断更不容易出现偏差

📊

状态管理

用 LangGraph 维护对话历史,每个 Agent 都能看到完整上下文

🗺️
课程路线图

接下来 5 个模块:认识角色 → 理解辩论机制 → 数据从哪来 → 决策如何产生 → 自己跑一遍。每个模块都有互动练习。

检验一下你的理解

你的朋友说:"TradingAgents 就是一个问 GPT 应该买什么股票的工具。" 这个说法哪里不够准确?

在 TradingAgents 里,Bull Researcher 和 Bear Researcher 的关系是?

02

认识你的 AI 团队

10 个角色,每个都有专属身份证——这就是你雇的 AI 员工

这支团队长什么样?

把 TradingAgents 想象成一家迷你对冲基金,你是老板,但所有员工都是 AI。他们分成四组,各司其职,就像棒球队里的不同守位——每个位置都缺一不可。

📊
分析师团队(4人)

基本面、技术面、新闻、社交媒体——各自调用工具收集数据,输出专业报告

⚔️
研究员团队(2人)

Bull(多头)和 Bear(空头)研究员,拿着分析报告互相辩论,碰出火花

📋
Research Manager + Trader(2人)

经理总结辩论共识,交易员据此出具具体的买卖提案

🛡️
风控团队(2人+1人)

激进派、保守派、中立派风控分析师再次辩论,Portfolio Manager 最终决策

点击任意角色,了解他在代码里做什么

分析师层 — 并行运行

📈
Fundamentals
Analyst
📉
Market
Analyst
📰
News
Analyst
💬
Social Media
Analyst

研究员辩论层

🐂
Bull
Researcher
🐻
Bear
Researcher
🎓
Research
Manager

交易 + 风控层

💼
Trader
🚀
Aggressive
Analyst
🛡️
Conservative
Analyst
👑
Portfolio
Manager
点击上方任意角色查看详细说明 →

一个"角色"在代码里长什么样?

你可能以为给 AI 分配"角色"需要复杂的框架。实际上,一个 Agent 的核心就是一段 prompt。来看 Bull Researcher 的真实代码:

CODE

def create_bull_researcher(llm):
  def bull_node(state) -> dict:
    history = investment_debate_state.get("history", "")
    market_research_report = state["market_report"]
    prompt = f"""You are a Bull Analyst
    advocating for investing...
    Last bear argument: {current_response}"""
    response = llm.invoke(prompt)
    argument = f"Bull Analyst: {response.content}"
    return {"investment_debate_state": ...}
            
白话解读

第1行:这是一个工厂函数——传入一个 LLM,返回一个 Agent 节点

第3行:从共享状态里读出历史对话,这样 AI 知道辩到哪了

第4行:读出基本面分析报告——这是它辩论的"弹药"

第5-7行:这才是角色的核心!一段 f-string prompt 定义了这个 AI 是"多头分析师",并把对手最新论点塞进去

第8行:调用 LLM 生成回应,就是这么简单

第10行:把结果写回共享状态,供下一个 Agent 读取

💡
关键洞察:角色 = Prompt + 状态读写

Bull Researcher 和 Bear Researcher 调用的是同一个 LLM,唯一的区别就是 prompt 不同。这说明"角色"不在于用哪个模型,而在于你怎么告诉它扮演谁。这是你让 AI 做任何专业工作时都能用的模式。

角色扮演练习

Bull Researcher 和 Bear Researcher 的核心区别是什么?

你想给系统添加一个"历史交易学习"功能,让它记住上次操作 AAPL 的结果。你应该修改哪个角色的逻辑?

03

辩论协议

多头 vs 空头——看 AI 如何一来一往地相互质疑,直到分出胜负

为什么不直接问一个 AI?

想象你在法庭上,只有检察官发言,没有辩护律师——这样的判决你信服吗?单一 AI 分析股票也是同样的问题:它会给你一个答案,但很可能只是它训练数据偏差的反映。

辩论机制的核心价值是:两个持对立立场的 AI 互相挑战对方的漏洞,就像庭审中检辩双方互相质证,最终经得起质疑的论点才能留下来。

⚖️
法庭审判模式

这不是 TradingAgents 首创的模式——它借鉴自"对立式 AI"(Adversarial AI) 研究。让两个 AI 担任"原告"和"被告",比单个 AI 更能发现推理漏洞。

一场真实的 AI 辩论——关于买入 AAPL

以下是 Bull 和 Bear 研究员在分析完 4 份报告后,真实发生的对话。点击"下一条"逐步展示,感受辩论的节奏:

辩论如何在代码里"流动"?

每次辩论都通过一个 共享状态对象 传递。来看 Bear Researcher 写完后,状态是什么样的:

CODE

new_investment_debate_state = {
  "history": history + "\n" + argument,
  "bear_history": bear_history + "\n" + argument,
  "bull_history": investment_debate_state.get("bull_history", ""),
  "current_response": argument,
  "count": investment_debate_state["count"] + 1,
}
            
白话解读

history:完整对话历史——Bull 和 Bear 说过的每一句话都在这里,下一个 Agent 靠它知道全局

bear_history:只保存 Bear 说过的话,便于后续只查看一方的论点

bull_history:保留 Bull 的历史不变(Bear 写完之后,Bull 的记录当然不变)

current_response:本轮最新发言——下一个出场的 Agent 优先读这个,作为它要回应的内容

count:辩论轮数计数器——达到上限就停止辩论,进入下一阶段

辩论是如何知道"何时结束"的?

这是 LangGraph 的条件路由——系统在每次辩论后判断:继续还是停止?

1

Bull 发言

2

检查 count < max_rounds?

3

Yes → Bear 发言

4

No → Research Manager

⚠️
成本 vs 质量的权衡

max_debate_rounds 默认是 1,意味着 Bull 和 Bear 各说一次就结束。增加到 3 会让辩论更深入,但 API 成本也增加 3 倍。这是你部署时必须权衡的参数。

拖拽练习:把每个状态字段拖到它的正确用途上

history
current_response
count

下一位辩手读这个字段,了解上一轮对方说了什么

Drop here

决定辩论是否应该结束的计数器

Drop here

包含所有轮次发言的完整对话记录

Drop here
04

数据管道

4 个分析师靠什么"看"到市场?从 Yahoo Finance 到 AI 报告的全程追踪

AI 分析师靠什么说话?

分析师再厉害,没有数据就是空谈。TradingAgents 的每位 AI 分析师都配备了一套专属工具,就像打铁铺的匠人——每种锤子敲不同的活儿。

get_stock_data 拉取股价历史、交易量、OHLC 数据——技术分析师的基础弹药
get_indicators 计算 MACD、RSI、布林带等技术指标——把原始价格转化为可读信号
get_fundamentals 公司基本面:市值、P/E、营收——基本面分析师的核心数据集
get_balance_sheet 资产负债表:资产、负债、权益——判断公司财务健康的关键
get_news 公司相关新闻——催化剂或利空的第一信号
get_global_news 宏观经济事件:加息、地缘政治——影响整个市场的背景噪声

数据如何从互联网流向 AI 报告?

点击"下一步",跟踪一个数据请求从发起到报告生成的完整旅程:

📊
Fundamentals
Analyst
⚙️
Dataflows
Layer
🌐
Yahoo Finance
/ Alpha Vantage
🤖
LLM
(GPT/Claude)
点击"下一步"开始

工具是怎么绑定到 Agent 上的?

分析师能"调用工具",是因为用了 Function Calling。来看基本面分析师的工具绑定:

CODE

tools = [
  get_fundamentals,
  get_balance_sheet,
  get_cashflow,
  get_income_statement,
]
chain = prompt | llm.bind_tools(tools)
result = chain.invoke(state["messages"])

if len(result.tool_calls) == 0:
  report = result.content
            
白话解读

第1-6行:把 4 个工具函数放进一个列表——这就是分析师的"工具箱"

第7行:bind_tools 把工具描述注入到 LLM,LLM 现在知道它有哪些工具可以用

第8行:发送请求。LLM 可能决定先调用工具(比如先拿财报),再生成分析

第10-11行:当 LLM 不再调用工具(tool_calls 为空),说明数据收集完毕,result.content 就是最终的分析报告

💡
关键洞察:AI 自己决定调几次工具

注意这里没有 if-else 判断。AI 分析师自主决定调哪个工具、调几次——可能先看基本面,再看现金流,再综合分析。这种自主性是现代 Agent 系统的核心特征,也是它比传统脚本更强大的地方。

数据源可以切换——你在掌控

TradingAgents 在数据源上做了抽象层,你只需改一行配置,就能在 Yahoo Finance 和 Alpha Vantage 之间切换:

yfinance 免费,无需 API Key,数据覆盖全面——适合快速原型和学习
alpha_vantage 需要 API Key,数据更精准,有速率限制——适合生产部署

你想把数据源从 yfinance 换成 alpha_vantage,但不想改动任何分析师的 prompt 逻辑。你应该修改哪一层的代码?

05

决策引擎

从辩论到交易提案再到最终拍板——追踪决策如何层层浮现

整个系统是怎么"思考"的?

如果你把 TradingAgents 想象成一家有规律的公司,它的决策流程就像这样:数据驱动分析,分析驱动辩论,辩论驱动计划,计划驱动提案,提案驱动风险评估,风险评估驱动最终决策。

AgentState(共享状态) 整个决策过程的"血液",所有 Agent 都向它读写
market_report / sentiment_report / news_report / fundamentals_report 4 位分析师的输出,第一阶段成果
investment_debate_state Bull vs Bear 辩论历史和计数器
investment_plan Research Manager 综合辩论后的投资计划
trader_investment_plan Trader 出具的具体交易提案
risk_debate_state 三位风控分析师的辩论历史
final_trade_decision Portfolio Manager 的最终决策:Buy/Sell/Hold + 理由

风控委员会的三方辩论

Trader 出了交易提案之后,三位风控分析师开始辩论:这个提案的风险是否可接受?

Portfolio Manager 如何输出"机器可读"的决策?

早期版本的 Portfolio Manager 输出纯文字,很难被代码解析。新版本使用了 结构化输出

CODE

def create_portfolio_manager(llm):
  structured_llm = bind_structured(
    llm, PortfolioDecision, "Portfolio Manager"
  )
  def portfolio_manager_node(state):
    history = state["risk_debate_state"]["history"]
    trader_plan = state["trader_investment_plan"]
    past_context = state.get("past_context", "")
    # ... calls structured_llm ...
    return {"final_trade_decision": decision}
            
白话解读

bind_structured:把 LLM 包装成一个会按 PortfolioDecision 格式输出的版本,输出总是有 action、confidence、reasoning 三个字段

history:读取三位风控分析师的完整辩论历史

trader_plan:读取交易员的具体交易提案

past_context:从决策日志里读取历史教训——如果上次在同一只股票亏钱了,这里会注入那段经历

final_trade_decision:最终决策写入状态,整个流程结束

💡
记忆机制:AI 从历史中学习

Portfolio Manager 有一个 past_context 字段,会注入同一股票的历史交易结果和经验教训。这意味着系统会随着时间积累"经验"——如果上次操作 NVDA 失误了,下次会更谨慎。这是 TradingAgents 比简单 AI 脚本更高级的关键特征之一。

决策质量测试

假设系统上周操作 TSLA 亏损了 15%,你想让下次分析 TSLA 时系统更保守。最有效的方式是什么?

Portfolio Manager 使用结构化输出(structured output)的主要好处是什么?

06

运行你的交易模拟

从安装到第一笔 AI 决策——动手实操完整指南

5 分钟启动你的 AI 交易室

你现在已经理解了系统的每个零件。是时候把它跑起来了。TradingAgents 有两种启动方式:

🖥️

CLI 交互模式

命令行界面,有实时进度显示,适合直接体验完整流程

🐍

Python 代码调用

直接在代码里集成,适合构建自己的应用或自动化策略

🐳

Docker 容器

无需配置 Python 环境,一行命令启动,适合快速上手

从零到第一个决策的完整步骤

1
克隆仓库 + 安装依赖

git clone https://github.com/TauricResearch/TradingAgents && cd TradingAgents && pip install .

2
配置 API Key

最少只需要一个:你的 LLM 提供商的 Key(OpenAI / Anthropic / Google 等)。数据默认用 yfinance,无需额外 Key。

3
写 3 行 Python 代码

导入、初始化、调用 propagate——这三步就是系统的完整入口

4
等待 AI 团队开会

根据 max_debate_rounds 设置,整个分析流程通常需要 2-5 分钟。可以在 CLI 里实时观察每个 Agent 的输出

5
读取决策结果

最终决策保存在返回值里,也会写入 ~/.tradingagents/logs/ 的持久化日志

最核心的代码——3 行启动整个系统

这是 入口点,也是整个系统的使用说明书:

CODE

from tradingagents.graph.trading_graph import TradingAgentsGraph
from tradingagents.default_config import DEFAULT_CONFIG

config = DEFAULT_CONFIG.copy()
config["llm_provider"] = "openai"
config["max_debate_rounds"] = 2

ta = TradingAgentsGraph(debug=True, config=config)
_, decision = ta.propagate("NVDA", "2026-01-15")
print(decision)
            
白话解读

第1-2行:导入主类和默认配置——就像把乐高说明书和零件盒都拿出来

第4-6行:复制默认配置(不要直接改原始配置),然后定制:选哪家 LLM、辩论几轮

第8行:创建"AI 交易室"实例,debug=True 会打印每个 Agent 的思考过程

第9行:这一行触发整个系统:10 个 Agent 依次工作,分析师收数据,研究员辩论,交易员提案,风控审查,最终决策

第10行:打印最终决策——Buy / Hold / Sell 加上完整的推理过程

你可以调哪些"旋钮"?

TradingAgents 的核心配置项直接影响你的决策质量和成本:

max_debate_rounds 辩论轮数。1 轮最快最便宜,3 轮最深入但成本 3 倍。生产建议 1-2 轮
deep_think_llm 用于复杂推理的模型(Research Manager, Portfolio Manager)。用更强的模型
quick_think_llm 用于快速任务的模型(4 位分析师、交易员)。可用更便宜的模型降低成本
selected_analysts 选哪些分析师参与。去掉 "social" 可省略社交媒体分析,速度更快
checkpoint_enabled 开启检查点续跑。程序崩溃后从上次断点继续,不用重头来过

你的预算有限,只能为一个角色配置最强的 LLM 模型。应该优先给哪个角色?

你的程序在跑到 Bull Researcher 时崩溃了,已经花了 4 位分析师的 API 费用。下次重跑怎么避免重复消费这部分费用?

你现在掌握了什么?

你刚刚学完了一套完整的多智能体 AI 系统。这不只是"TradingAgents 怎么用"——更重要的是,你现在理解了一套通用的 AI 工程模式:

🎭
角色即 Prompt

同一个 LLM,用不同 prompt 可以扮演完全不同的角色。这是构建多 Agent 系统最基础的积木

⚔️
对立辩论优于单一决策

让 AI 互相质疑比让一个 AI 独断更可靠。Bull vs Bear,激进 vs 保守——这套机制可以用在任何复杂决策场景

🔗
状态是 Agent 间的语言

AgentState 就是所有 Agent 共享的白板。学会设计清晰的状态结构,是构建复杂 Agent 工作流的关键

📊
结构化输出让 AI 决策可编程

自由文本输出是不可靠的——用 Pydantic 或 structured output 约束 LLM 的输出格式,让代码能稳定地消费 AI 的结论

🚀
你的下一步

克隆仓库,用你自己感兴趣的股票跑一次。观察每个 Agent 的输出,看看 Bull 和 Bear 在争什么——这比读文档学到的多得多。