GitHub 上这周最火的 Python 项目之一是 TradingAgents,一个用 LLM 驱动的多 Agent 金融交易框架。截至今天,69000+ star,单周涨了 14000 多。
我花了两天把源码翻了一遍,跑了几个回测,记录下架构设计和实际踩过的坑。
它在做什么
TradingAgents 模拟了一个真实交易公司的团队结构。不是一个 Agent 做所有事,而是把交易决策拆成多个角色:基本面分析师、情绪分析师、新闻分析师、技术分析师、多空研究员、交易员、风控团队、投资组合经理。
这些角色各自负责一块,分析完了互相讨论,最后由投资组合经理拍板。
听起来像是在给 LLM 玩角色扮演?某种程度上确实是。但它的工程实现比你想的复杂得多。
核心架构:LangGraph 状态机
整个框架建在 LangGraph 上。如果你没用过 LangGraph,简单说就是 LangChain 团队做的一个状态图引擎------把 Agent 的执行流程定义成一张有向图,每个节点是一个 Agent 或工具调用,边定义了状态转移逻辑。
TradingAgents 的核心类是 TradingAgentsGraph,它在初始化时做了这几件事:
python
from tradingagents.graph.trading_graph import TradingAgentsGraph
from tradingagents.default_config import DEFAULT_CONFIG
config = DEFAULT_CONFIG.copy()
config["llm_provider"] = "deepseek" # 支持 openai/google/anthropic/deepseek/qwen 等
config["deep_think_llm"] = "deepseek-chat"
config["quick_think_llm"] = "deepseek-chat"
config["max_debate_rounds"] = 2
ta = TradingAgentsGraph(debug=True, config=config)
这段代码背后,__init__ 做了几件关键的事:
- 根据
llm_provider创建两个 LLM 客户端------一个用于深度推理(deep_think),一个用于快速任务(quick_think) - 为四类分析师创建各自的工具节点(ToolNode)
- 构建完整的 LangGraph 状态图
- 初始化交易记忆日志
工具节点的创建代码很直观:
python
def _create_tool_nodes(self):
return {
"market": ToolNode([get_stock_data, get_indicators]),
"social": ToolNode([get_news]),
"news": ToolNode([get_news, get_global_news, get_insider_transactions]),
"fundamentals": ToolNode([
get_fundamentals, get_balance_sheet,
get_cashflow, get_income_statement
]),
}
每类分析师绑定不同的工具集。技术分析师能拿到 K 线和指标数据,基本面分析师能看财报,新闻分析师能查内幕交易记录。角色隔离是有意设计的------模拟真实交易团队里,分析师只看自己领域的数据。
Agent 执行流:从分析到决策
调用 ta.propagate("NVDA", "2026-01-15") 后,执行流程是这样的:
第一步:四个分析师并行跑。 技术分析师拿到 NVDA 的近期 K 线、MACD、RSI 等指标,输出技术面判断。基本面分析师拉财报数据,看营收、利润率、现金流。情绪分析师抓社交媒体和论坛的讨论情绪。新闻分析师查最近的新闻事件和内幕交易。
第二步:多空辩论。 这是 TradingAgents 比较有意思的设计。分析师的输出不是直接给交易员,而是先经过一轮"辩论"------框架里有 bullish researcher 和 bearish researcher 两个角色,他们各自站队,基于分析师的报告展开正反方论证。
辩论轮数由 max_debate_rounds 控制,默认是 1 轮。实测下来,2 轮能给出更平衡的结论,但 3 轮以上就开始车轱辘话了。
第三步:交易员综合判断。 交易员拿到分析报告和辩论结论,决定做多、做空还是持有,同时给出仓位比例。
第四步:风控审核。 风控团队评估交易员的方案,考虑波动率、流动性、集中度等风险因素。如果风险太高会打回去。
第五步:投资组合经理决策。 最终拍板的人。批准就执行,不批准就取消。
整个流程用 LangGraph 的条件边(conditional edges)串起来。比如辩论要不要继续的判断逻辑:
python
class ConditionalLogic:
def __init__(self, max_debate_rounds=1, max_risk_discuss_rounds=1):
self.max_debate_rounds = max_debate_rounds
self.max_risk_discuss_rounds = max_risk_discuss_rounds
def should_continue_debate(self, state: InvestDebateState) -> str:
if state["debate_count"] >= self.max_debate_rounds:
return "end_debate"
return "continue_debate"
这种设计让你可以灵活调整决策深度------对高波动股票多辩论几轮,稳健标的少辩论。
记忆系统:跨交易的经验积累
TradingAgents 有一套持久化的交易记忆机制。每次跑完一轮决策,结果会写入 ~/.tradingagents/memory/trading_memory.md。
下次分析同一只股票时,框架会把之前的决策记录注入到投资组合经理的 prompt 里,包括之前的判断对不对、实际收益怎么样。
更有意思的是收益反思(reflection)功能。框架会用 yfinance 拉实际股价,计算持有期收益,跟 SPY 大盘对比算出超额收益。然后让 LLM 写一段反思:上次为什么对了?或者为什么错了?
python
def _fetch_returns(self, ticker, trade_date, holding_days=5):
stock = yf.Ticker(ticker).history(start=trade_date, end=end_str)
spy = yf.Ticker("SPY").history(start=trade_date, end=end_str)
raw_return = (stock.iloc[actual_days]["Close"] / stock.iloc[0]["Close"]) - 1
spy_return = (spy.iloc[actual_days]["Close"] / spy.iloc[0]["Close"]) - 1
alpha = raw_return - spy_return
return raw_return, alpha, actual_days
这套记忆系统不复杂,但很实用。连续跑几次 NVDA 后,投资组合经理的判断确实会比第一次更谨慎------因为它能看到之前的误判记录。
实际跑一下:DeepSeek + NVDA 回测
我用 DeepSeek 作为后端模型跑了几次,说说实际体验。
安装踩坑: 项目依赖不少,yfinance、langchain、langgraph 这些好说,但 finnhub-python 和 Alpha Vantage 的 API key 是必须的。没有这俩 key,新闻分析师和基本面分析师就是个空壳。
先装好依赖:
bash
git clone https://github.com/TauricResearch/TradingAgents.git
cd TradingAgents
pip install .
# 设置 API keys
export DEEPSEEK_API_KEY="你的key"
export ALPHA_VANTAGE_API_KEY="你的key" # 免费版每分钟5次
然后写个简单的回测脚本:
python
from tradingagents.graph.trading_graph import TradingAgentsGraph
from tradingagents.default_config import DEFAULT_CONFIG
config = DEFAULT_CONFIG.copy()
config["llm_provider"] = "deepseek"
config["deep_think_llm"] = "deepseek-chat"
config["quick_think_llm"] = "deepseek-chat"
config["max_debate_rounds"] = 2
ta = TradingAgentsGraph(
selected_analysts=["market", "fundamentals", "news", "social"],
debug=True,
config=config
)
# 分析 NVDA 在 2026-01-15 的交易信号
state, decision = ta.propagate("NVDA", "2026-01-15")
print(f"决策: {decision}")
跑一次大概 3-5 分钟。 因为四个分析师要串行调用各自的工具拿数据(yfinance、Alpha Vantage),然后每个 Agent 调 LLM 生成报告。整个流程涉及 8-12 次 LLM 调用。
用 DeepSeek 的话,单次分析成本大概在 ¥0.5-1 之间。如果换 GPT-5.4 或 Claude,成本会翻好几倍。
结果样例:
css
决策: {
"action": "buy",
"confidence": 0.72,
"position_size": 0.15,
"reasoning": "技术指标显示超卖反弹信号,RSI 从 28 回升至 35。
基本面数据显示 Q4 营收同比增长 78%。
新闻面利好:新款数据中心 GPU 出货量超预期。
风险评估:波动率偏高,建议控制仓位在 15%。"
}
几个有意思的设计细节
Provider 抽象层。 框架支持 10 种 LLM 提供商,切换时只改 llm_provider 和模型名就行。底层用 create_llm_client 做了统一封装,还处理了不同 provider 的特殊参数------比如 Google 的 thinking_level、OpenAI 的 reasoning_effort、Anthropic 的 effort 控制。
python
def _get_provider_kwargs(self):
kwargs = {}
provider = self.config.get("llm_provider", "").lower()
if provider == "google":
thinking_level = self.config.get("google_thinking_level")
if thinking_level:
kwargs["thinking_level"] = thinking_level
elif provider == "anthropic":
effort = self.config.get("anthropic_effort")
if effort:
kwargs["effort"] = effort
return kwargs
Checkpoint 恢复。 用 LangGraph 的 checkpoint 机制,可以在跑到一半崩了的时候从断点继续。跑一次 5 分钟,中间如果网络断了不用从头来。这个功能在回测大量股票时很有用。
bash
tradingagents analyze --checkpoint # 开启断点续跑
tradingagents analyze --clear-checkpoints # 清除所有断点
结构化输出。 v0.2.4 版本加了结构化输出,Research Manager、Trader、Portfolio Manager 的输出不再是自由文本,而是 Pydantic 模型约束的 JSON。这让下游解析更靠谱,不会出现"LLM 自由发挥写了一堆废话但没给出明确信号"的情况。
局限和坑
说完优点,聊聊问题。
数据源依赖太重。 Alpha Vantage 免费版每分钟 5 次请求,跑一次分析就可能触发限流。用付费版每分钟 75 次也不宽裕,批量回测时得自己加限流逻辑。
LLM 幻觉问题仍然存在。 情绪分析师有时候会"编造"社交媒体上的讨论。你让它分析某只股票的社会情绪,它可能生成一段"Reddit 上有大量看多讨论"的报告------但它实际上并没有去爬 Reddit,只是基于历史数据推断的。
成本不低。 一次完整分析涉及 8-12 次 LLM 调用。如果你想做日度回测,一年 252 个交易日,每天跑 10 只股票,光 LLM 调用就是 2 万多次。即使用 DeepSeek 也得几百块。
辩论环节有时候是形式主义。 多空辩论的质量很依赖底层模型的推理能力。用 deepseek-chat 时,bearish researcher 经常只是把 bullish 的论点翻转一下,没有真正独立的分析。用更强的模型(比如 Claude Opus)效果会好一些,但成本也上去了。
适合谁用
如果你是做量化研究的,TradingAgents 的价值不在于直接拿来做实盘------那是找死。它的价值在于提供了一套"用多 Agent 协作做复杂决策"的参考架构。
LangGraph 状态图 + 多角色分工 + 辩论机制 + 记忆反思,这套模式可以迁移到很多非金融场景:代码审查(多个 reviewer Agent 分别看安全、性能、可读性,然后辩论)、医学诊断辅助(多个专科 Agent 各自分析,然后会诊)、商业决策分析。
仓库地址:github.com/TauricResearch/TradingAgents,附带 Docker 部署和 CLI 交互界面,上手门槛不高。
如果你打算试试,建议先用 DeepSeek 或 Qwen 跑几个回测,成本低,熟悉流程后再考虑换模型。记得先申请 Alpha Vantage 的 API key------这是必需的。