交易室的秘密
想象 5 个 AI 分析师正在激烈争论:要不要买入 AAPL 股票?
每笔交易背后,都是一场辩论
在真实的对冲基金里,一个交易决策从不由一个人拍板。基本面分析师看财报,技术分析师看图表,新闻分析师看宏观,风控经理看风险——他们争论,直到达成共识。
TradingAgents 把这套流程完全复刻了出来,只不过每个角色都换成了 LLM。你输入一个股票代码,5 秒后,一场 AI 辩论会就开始了。
TradingAgents 是目前 GitHub 上最受关注的金融 AI 开源项目之一。它不只是一个"调用 GPT 问股票"的脚本——它是一套完整的多智能体系统,有完整的辩论、风控和决策流程。">
你输入 "NVDA" 之后,发生了什么?
当你运行 ta.propagate("NVDA", "2026-01-15"),整个系统会按照一条流水线自动运转:
基本面、技术面、新闻、社交媒体——四条数据流并行采集,各自生成报告
Bull 研究员拿着 4 份报告为买入辩护,Bear 研究员为做空辩护——轮流发言,可配置辩论轮数
Research Manager 综合辩论,Trader 给出具体的买/卖/持有方案
激进派、保守派、中立派对交易方案展开风险讨论
综合所有信息,输出 Buy / Overweight / Hold / Underweight / Sell
为什么这个设计思路值得你学习?
TradingAgents 最有价值的地方不是它能不能赚钱——而是它展示了一套构建AI Agent 协作系统的完整模式。
角色专业化
每个 Agent 只干一件事,靠不同的 prompt 赋予不同视角
结构化辩论
对立观点互相质疑,比单一 AI 独断更不容易出现偏差
状态管理
用 LangGraph 维护对话历史,每个 Agent 都能看到完整上下文
接下来 5 个模块:认识角色 → 理解辩论机制 → 数据从哪来 → 决策如何产生 → 自己跑一遍。每个模块都有互动练习。
检验一下你的理解
你的朋友说:"TradingAgents 就是一个问 GPT 应该买什么股票的工具。" 这个说法哪里不够准确?
在 TradingAgents 里,Bull Researcher 和 Bear Researcher 的关系是?
认识你的 AI 团队
10 个角色,每个都有专属身份证——这就是你雇的 AI 员工
这支团队长什么样?
把 TradingAgents 想象成一家迷你对冲基金,你是老板,但所有员工都是 AI。他们分成四组,各司其职,就像棒球队里的不同守位——每个位置都缺一不可。
基本面、技术面、新闻、社交媒体——各自调用工具收集数据,输出专业报告
Bull(多头)和 Bear(空头)研究员,拿着分析报告互相辩论,碰出火花
经理总结辩论共识,交易员据此出具具体的买卖提案
激进派、保守派、中立派风控分析师再次辩论,Portfolio Manager 最终决策
点击任意角色,了解他在代码里做什么
分析师层 — 并行运行
Analyst
Analyst
Analyst
Analyst
研究员辩论层
Researcher
Researcher
Manager
交易 + 风控层
Analyst
Analyst
Manager
一个"角色"在代码里长什么样?
你可能以为给 AI 分配"角色"需要复杂的框架。实际上,一个 Agent 的核心就是一段 prompt。来看 Bull Researcher 的真实代码:
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 读取
Bull Researcher 和 Bear Researcher 调用的是同一个 LLM,唯一的区别就是 prompt 不同。这说明"角色"不在于用哪个模型,而在于你怎么告诉它扮演谁。这是你让 AI 做任何专业工作时都能用的模式。
角色扮演练习
Bull Researcher 和 Bear Researcher 的核心区别是什么?
你想给系统添加一个"历史交易学习"功能,让它记住上次操作 AAPL 的结果。你应该修改哪个角色的逻辑?
辩论协议
多头 vs 空头——看 AI 如何一来一往地相互质疑,直到分出胜负
为什么不直接问一个 AI?
想象你在法庭上,只有检察官发言,没有辩护律师——这样的判决你信服吗?单一 AI 分析股票也是同样的问题:它会给你一个答案,但很可能只是它训练数据偏差的反映。
辩论机制的核心价值是:两个持对立立场的 AI 互相挑战对方的漏洞,就像庭审中检辩双方互相质证,最终经得起质疑的论点才能留下来。
这不是 TradingAgents 首创的模式——它借鉴自"对立式 AI"(Adversarial AI) 研究。让两个 AI 担任"原告"和"被告",比单个 AI 更能发现推理漏洞。
一场真实的 AI 辩论——关于买入 AAPL
以下是 Bull 和 Bear 研究员在分析完 4 份报告后,真实发生的对话。点击"下一条"逐步展示,感受辩论的节奏:
辩论如何在代码里"流动"?
每次辩论都通过一个 共享状态对象 传递。来看 Bear Researcher 写完后,状态是什么样的:
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 的条件路由——系统在每次辩论后判断:继续还是停止?
Bull 发言
检查 count < max_rounds?
Yes → Bear 发言
No → Research Manager
max_debate_rounds 默认是 1,意味着 Bull 和 Bear 各说一次就结束。增加到 3 会让辩论更深入,但 API 成本也增加 3 倍。这是你部署时必须权衡的参数。
拖拽练习:把每个状态字段拖到它的正确用途上
下一位辩手读这个字段,了解上一轮对方说了什么
决定辩论是否应该结束的计数器
包含所有轮次发言的完整对话记录
数据管道
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 报告?
点击"下一步",跟踪一个数据请求从发起到报告生成的完整旅程:
Analyst
Layer
/ Alpha Vantage
(GPT/Claude)
工具是怎么绑定到 Agent 上的?
分析师能"调用工具",是因为用了 Function Calling。来看基本面分析师的工具绑定:
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 就是最终的分析报告
注意这里没有 if-else 判断。AI 分析师自主决定调哪个工具、调几次——可能先看基本面,再看现金流,再综合分析。这种自主性是现代 Agent 系统的核心特征,也是它比传统脚本更强大的地方。
数据源可以切换——你在掌控
TradingAgents 在数据源上做了抽象层,你只需改一行配置,就能在 Yahoo Finance 和 Alpha Vantage 之间切换:
yfinance
免费,无需 API Key,数据覆盖全面——适合快速原型和学习
alpha_vantage
需要 API Key,数据更精准,有速率限制——适合生产部署
你想把数据源从 yfinance 换成 alpha_vantage,但不想改动任何分析师的 prompt 逻辑。你应该修改哪一层的代码?
决策引擎
从辩论到交易提案再到最终拍板——追踪决策如何层层浮现
整个系统是怎么"思考"的?
如果你把 TradingAgents 想象成一家有规律的公司,它的决策流程就像这样:数据驱动分析,分析驱动辩论,辩论驱动计划,计划驱动提案,提案驱动风险评估,风险评估驱动最终决策。
风控委员会的三方辩论
Trader 出了交易提案之后,三位风控分析师开始辩论:这个提案的风险是否可接受?
Portfolio Manager 如何输出"机器可读"的决策?
早期版本的 Portfolio Manager 输出纯文字,很难被代码解析。新版本使用了 结构化输出:
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:最终决策写入状态,整个流程结束
Portfolio Manager 有一个 past_context 字段,会注入同一股票的历史交易结果和经验教训。这意味着系统会随着时间积累"经验"——如果上次操作 NVDA 失误了,下次会更谨慎。这是 TradingAgents 比简单 AI 脚本更高级的关键特征之一。
决策质量测试
假设系统上周操作 TSLA 亏损了 15%,你想让下次分析 TSLA 时系统更保守。最有效的方式是什么?
Portfolio Manager 使用结构化输出(structured output)的主要好处是什么?
运行你的交易模拟
从安装到第一笔 AI 决策——动手实操完整指南
5 分钟启动你的 AI 交易室
你现在已经理解了系统的每个零件。是时候把它跑起来了。TradingAgents 有两种启动方式:
CLI 交互模式
命令行界面,有实时进度显示,适合直接体验完整流程
Python 代码调用
直接在代码里集成,适合构建自己的应用或自动化策略
Docker 容器
无需配置 Python 环境,一行命令启动,适合快速上手
从零到第一个决策的完整步骤
git clone https://github.com/TauricResearch/TradingAgents && cd TradingAgents && pip install .
最少只需要一个:你的 LLM 提供商的 Key(OpenAI / Anthropic / Google 等)。数据默认用 yfinance,无需额外 Key。
导入、初始化、调用 propagate——这三步就是系统的完整入口
根据 max_debate_rounds 设置,整个分析流程通常需要 2-5 分钟。可以在 CLI 里实时观察每个 Agent 的输出
最终决策保存在返回值里,也会写入 ~/.tradingagents/logs/ 的持久化日志
最核心的代码——3 行启动整个系统
这是 入口点,也是整个系统的使用说明书:
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 工程模式:
同一个 LLM,用不同 prompt 可以扮演完全不同的角色。这是构建多 Agent 系统最基础的积木
让 AI 互相质疑比让一个 AI 独断更可靠。Bull vs Bear,激进 vs 保守——这套机制可以用在任何复杂决策场景
AgentState 就是所有 Agent 共享的白板。学会设计清晰的状态结构,是构建复杂 Agent 工作流的关键
自由文本输出是不可靠的——用 Pydantic 或 structured output 约束 LLM 的输出格式,让代码能稳定地消费 AI 的结论
克隆仓库,用你自己感兴趣的股票跑一次。观察每个 Agent 的输出,看看 Bull 和 Bear 在争什么——这比读文档学到的多得多。