DEV Community

韩

Posted on

TradingAgents的5个隐藏用法,90%量化开发者都没发现

TradingAgents 在 GitHub 上刚刚突破了 82,356 Stars 和 15,978 Forks,诞生至今仅仅 17 个月。但绝大多数工程师克隆下来后只跑一次默认的 propagate("NVDA", "2026-01-15"),盯一下结论就再也没碰过那些真正让这个框架值钱的部分。TradingAgents 是目前唯一一个有 arXiv 论文背书(2412.20138)的开源多 Agent LLM 交易框架:它的组合经理会真正从自己历史决策中学习,整个 Agent 图还可以按 ticker 粒度在 SQLite 里做检查点恢复。

2026 年 "AI 交易机器人" 这个赛道已经非常拥挤,但 TradingAgents 站在三个特性的交集里:结构化输出的组合评级、per-ticker 的 LangGraph 检查点、以及一个 5 档的风险辩论。下面 5 个用法,能让这个框架从演示 demo 变成真正的研究工具。

隐藏用法 #1:按 Ticker 粒度的 SQLite 检查点恢复

大多数人的用法:他们启动 CLI 跑,新闻分析师还在拉 Reddit 数据时手贱按了 Ctrl+C,所有结果全部丢失,只能从头再跑一遍,又多花一遍 token 钱。

隐藏技巧:TradingAgents v0.2.4 加入了一个 SqliteSaver 检查点机制,会在 ~/.tradingagents/cache/checkpoints/<TICKER>.db 下给每个 ticker 单独写一个 SQLite 数据库。加上 --checkpoint 参数,框架在每个节点完成后都会保存状态;下次恢复时它会打印 Resuming from step N for <TICKER> on <date> 而不是从头开始。

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

config = DEFAULT_CONFIG.copy()
config["checkpoint_enabled"] = True
ta = TradingAgentsGraph(debug=True, config=config)

# 第一次跑到第 14 步(共 22 步)被打断
# _, decision = ta.propagate("AAPL", "2026-01-15")

# 之后重新跑 — 从第 14 步接着来,分析师阶段不再重复扣费
_, decision = ta.propagate("AAPL", "2026-01-15")
Enter fullscreen mode Exit fullscreen mode

效果:基于 GPT-5.5 + 2 轮辩论的一次 22 节点深度研究大约消耗 4 美元 API 调用。不开检查点时,跑崩一次就是实打实的成本。开了之后,你可以放心地晚上跑 50 个 ticker 的大批量扫货,遇到 RateLimitError 第二天接着跑,数据拉取阶段不会再扣你钱。

数据来源:TradingAgents GitHub 82,356 Stars、15,978 Forks、293 个 Open Issue。检查点实现位于 tradingagents/graph/checkpointer.py,CLI 参数在 cli/main.py 中绑定。

隐藏用法 #2:能从你自己历史决策中学习的反思循环

大多数人的用法:他们把 TradingAgents 当一次性工具用 — 跑一次、看 Buy/Hold/Sell、走人。下一次跑同一个 ticker,PM 又从零开始。

隐藏技巧:tradingagents/graph/reflection.py 里的 Reflector 类在每次跑完后会写一段 2-4 句的纯文本反思到 ~/.tradingagents/memory/trading_memory.md。下一次跑同一个 ticker 时,组合经理的 prompt 会被注入最近几次相同 ticker 的决策 + 跨 ticker 的经验总结,所以每一轮分析都会带着前几轮学到的东西继续。

from tradingagents.graph.reflection import Reflector

reflector = Reflector(quick_thinking_llm=your_llm)

# 一次跑完后,把结果写进日志:
reflection = reflector.reflect_on_final_decision(
    final_decision="BUY — 5 日内相对 SPY alpha +2.3%",
    raw_return=0.041,
    alpha_return=0.023,
    benchmark_name="SPY",
)
# 保存到 ~/.tradingagents/memory/trading_memory.md
# 下次你 propagate("AAPL", "2026-02-01") 时,PM 会看到:
#   - 最近 3 次 AAPL 决策及其实际 alpha
#   - 跨 ticker 经验,例如 "MSFT 那次输在宏观新闻权重太高"
Enter fullscreen mode Exit fullscreen mode

效果:同一个 ticker 跑 10 次后,PM 的 prompt 里会内联 10 条历史反思 — 这会真实地影响后续辩论的方向。反思 prompt 本身强制要求 "2-4 句、纯散文、不要 bullet、不要 markdown",所以每次注入都不会显著膨胀上下文窗口。

数据来源:tradingagents/graph/reflection.py(2417 字符)公开了 Reflector 类,log_reflection_prompt 是反思模板的真理之源。

隐藏用法 #3:5 档风险辩论(激进 / 保守 / 中性 / 风控经理)

大多数人的用法:他们把框架压缩成 "分析师报告 -> 交易员 -> 结束",根本没启用风险辩论这一环。

隐藏技巧:三个风险辩手(aggressive_debator.pyconservative_debator.pyneutral_debator.py)加上一个风控经理会跑一轮独立的辩论,max_risk_discuss_rounds 可以与 max_debate_rounds(研究端辩论轮数)独立配置。每个辩手都基于组合经理类型化的 PortfolioDecision 写入交易员 prompt。

from tradingagents.default_config import DEFAULT_CONFIG

config = DEFAULT_CONFIG.copy()
# 研究端辩论 1 轮,风险端辩论 3 轮 — 预算完全独立
config["max_debate_rounds"] = 1
config["max_risk_discuss_rounds"] = 3

from tradingagents.graph.trading_graph import TradingAgentsGraph
ta = TradingAgentsGraph(debug=True, config=config)
_, decision = ta.propagate("TSLA", "2026-01-15")
Enter fullscreen mode Exit fullscreen mode

效果:max_risk_discuss_rounds=0 时你只会得到一行结论。max_risk_discuss_rounds=3 时你会看到激进辩手坚持 2 倍杠杆、保守辩手要求 3% 止损、中性辩手折中调和 — 最终仓位大小是三个提案的中位数,而不是自由发挥的文本。

数据来源:tradingagents/agents/risk_mgmt/ 目录下包含 aggressive_debator.pyconservative_debator.pyneutral_debator.py(通过 GitHub API 目录列表于 2026-06-03 验证)。tradingagents/graph/conditional_logic.py 第 30 行附近接入了辩论轮数。

隐藏用法 #4:双地区 LLM 提供商(Qwen-CN、GLM-CN、MiniMax-CN)

大多数人的用法:他们只配一个 OPENAI_API_KEY,完全没意识到 TradingAgents v0.2.5 内置了 7 个国际版 + 3 个中国版提供商,每个都有独立的环境变量。

隐藏技巧:对于国内团队来说,DASHSCOPE_CN_API_KEYZHIPU_CN_API_KEYMINIMAX_CN_API_KEY 分别指向中国地区的接入点(dashscope.aliyuncs.com、open.bigmodel.cn、api.minimaxi.com)— 与国际版账号完全独立。CLI 里有一个 "二级地区" 提示,让你切换时不用手动改 .env

# 中国地区配置 — 三个 key,与国际版互不通用
cp .env.example .env
echo "DASHSCOPE_CN_API_KEY=sk-cn-..." >> .env
echo "ZHIPU_CN_API_KEY=glm-cn-..." >> .env
echo "MINIMAX_CN_API_KEY=eyJhbGci..." >> .env

tradingagents
# CLI 提示:llm_provider? -> 选 "qwen-cn"
#          secondary region? -> 选 "china"(用 DASHSCOPE_CN_API_KEY)
Enter fullscreen mode Exit fullscreen mode
config = DEFAULT_CONFIG.copy()
config["llm_provider"] = "qwen-cn"
config["deep_think_llm"] = "qwen3.6-max"
config["quick_think_llm"] = "qwen3.6-mini"
Enter fullscreen mode Exit fullscreen mode

效果:TradingAgents 是目前唯一原生支持双地区切换的多 Agent 交易框架 — 你可以在同一 ticker+日期上 A/B 测试 Qwen 国际版 vs Qwen 中国版,这在写死一个 endpoint 的代码里根本做不到。

数据来源:tradingagents/llm_clients/api_key_env.py(1624 字符)是 PROVIDER_API_KEY_ENV 映射的真理之源。CHANGELOG.md v0.2.5 条目(2026-05-11)确认了 Qwen、GLM、MiniMax 的双地区支持。

隐藏用法 #5:5 档结构化输出评级(不再多花一次 LLM 调用)

大多数人的用法:他们让组合经理输出一段 markdown,然后用第二次 LLM 调用去解析 "这是 Buy 还是 Sell?" — 成本翻倍、延迟翻倍、幻觉风险翻倍。

隐藏技巧:组合经理通过结构化输出产出一个类型化的 PortfolioDecision,而 SignalProcessor.process_signal(text) 用一个确定性的正则从中抽取 5 档评级(Buy / Overweight / Hold / Underweight / Sell)— 完全不需要额外的 LLM 调用。模块 docstring 里明确写了:「PM 的结构化输出保证了评级可以从渲染后的 markdown 中直接解析,无需第二次 LLM 调用」。

from tradingagents.agents.utils.rating import parse_rating
from tradingagents.graph.signal_processing import SignalProcessor

# 方式 A:自由文本 -> 确定性 5 档抽取
pm_markdown = "**Rating**: Overweight  \n论点: Q1 财报看涨..."
rating = parse_rating(pm_markdown)
# -> "Overweight"

# 方式 B:旧版 SignalProcessor(向后兼容包装)
sp = SignalProcessor(quick_thinking_llm=your_llm)
rating = sp.process_signal(pm_markdown)
# -> "Overweight"(LLM 参数被接受但不使用)
Enter fullscreen mode Exit fullscreen mode

效果:一次 22 节点跑动用 22 次 LLM 调用。老的解析框架要跑 23-24 次。50 个 ticker 扫一遍,能省下 50-100 次 GPT-5.5 级别的调用 — 在你按前沿模型价格付费时,这是真实可感知的成本。

数据来源:tradingagents/graph/signal_processing.py(1299 字符)和 tradingagents/agents/utils/rating.py 是源头文件。模块 docstring 原话:「:mod:tradingagents.agents.utils.rating 中的确定性启发式足以抽取评级;无需额外的 LLM 调用。」

总结

  1. Per-ticker SQLite 检查点恢复--checkpoint 逐节点保存状态,崩溃不会让你重复付费
  2. 反思循环Reflector 写出 2-4 句的经验教训,下次跑同一 ticker 时注入 PM prompt
  3. 5 档风险辩论 — 三个辩手 + 风控经理,max_risk_discuss_rounds 与研究端辩论轮数完全独立
  4. 双地区 LLM 提供商 — Qwen-CN、GLM-CN、MiniMax-CN 全部自带独立环境变量和接入点
  5. 5 档结构化输出parse_rating() 零额外 LLM 调用即可抽出 Buy/Overweight/Hold/Underweight/Sell

如果你觉得有用,分享一下 TradingAgents 哪个技巧为你省了最多时间。

系列相关文章:

GitHub: https://github.com/TauricResearch/TradingAgents · Stars: 82,356 · 论文: arXiv:2412.20138

Top comments (0)