把"再找个人抬杠"制度化——TradingAgents 架构拆解与它的成本代价
一个多空辩论模拟器 scripts/debate_team.py:围绕你熟悉的茅台提价事件(第 3 课的新闻、第 5 课的价格,原样复用),看多研究员和看空研究员各执证据辩论两轮,再由研究经理读完全场,裁决出"倾向 + 置信度 + 最大风险 + 观察点"。演示模式无需 API Key,全部辩论文本预计算、引用数字真实计算,先跑通再谈原理。
比脚本更重要的是三个判断:TradingAgents 论文的团队是怎么分工的(你的组件各就各位)、为什么辩论能治第 11 课讲的立场偏差、以及多 Agent 的账单有多贵、什么时候才值得付。
TradingAgents 论文(2024 年 12 月,TauricResearch)的核心主张:真实交易公司不靠一个超级交易员,靠的是一群人各管一摊、互相牵制。它把 LLM 组织成一家虚拟交易公司,角色分工(文字版):
┌────── 分析师团队 ×4(各管一类信息)──────┐
│ 基本面分析师|情绪分析师|新闻分析师|技术分析师 │
└─────────────────┬─────────────────┘
▼ 四份分析报告
┌────── 研究员团队 ×2(立场对抗)──────┐
│ 看多研究员 ⇄ 辩论 N 轮 ⇄ 看空研究员 │
└─────────────────┬─────────────────┘
▼ 辩论纪要
研究经理(裁决)
▼ 倾向 + 置信度
交易员(翻译成交易计划)
▼ 计划草案
┌────── 风控团队(三视角审批)──────┐
│ 激进派 ⇄ 保守派 ⇄ 中性派 → 放行/否决 │
└─────────────────┬─────────────────┘
▼
最终交易决策
把这张图和你已经建好的组件对上号——你会发现这门课一直在按这张蓝图施工:
| TradingAgents 角色 | 职责 | 你的对应组件 |
|---|---|---|
| 情绪分析师 | 把新闻文本翻成结构化分数 | 第 3 课 news_sentiment.py |
| 新闻/技术分析师 | 收集消息面与价格面证据 | 第 5 课 sentiment_agent.py(工具调用取证) |
| 看多/看空研究员 + 研究经理 | 就证据对抗辩论,裁决倾向与置信度 | 本课 debate_team.py |
| 交易员 | 把观点翻成具体的交易计划 | 你本人(第 4/7 课的回测纪律是你的校验工具) |
| 风控团队 | 仓位、止损、审批与否决 | 你本人 + 第 1 课的硬规则(T+1、涨跌停) |
注意两点。第一,本课脚本只实现了中间一层:分析师层用"证据包"(第 3/5 课素材)代替,交易员和风控故意留给你——真金白银的决策权不出让。第二,每个角色本质上都是一次带不同 system prompt 的 LLM 调用,没有任何魔法——多 Agent 的"智能"来自分工与流程设计,不是更强的模型。
第 11 课我们见过单 Agent 的立场偏差:你在 prompt 里给了它一个立场("你是看多研究员"),它就会顺着这个立场把逻辑编圆——这不是模型坏,是它在忠实地执行你的指令。问题在于,当你只有一个 Agent 时,没有任何力量逼反方证据登场,而人又有确认偏误,天然爱听顺着自己持仓的结论。两个偏差叠加,单 Agent 的结论往往比它看起来要偏。
辩论机制的解法是结构上的:把"寻找反方证据"从一个自觉动作,变成一个岗位职责。看空研究员的 KPI 就是把多方逻辑拆穿,它不看多方的脸色;研究经理不带立场入场,只做裁判。多智能体辩论的研究(Du et al., 2023)也表明,多轮对抗能显著减少模型的"幻觉性自信"。TradingAgents 把这套机制搬进了交易场景。
两个研究员读的是同一份证据包。如果证据本身有问题(免费新闻接口挂了退回旧样本、价格数据缺失、情绪分样本污染——第 2、3 课的老朋友),辩论只会让错误的证据被论述得更周全、听起来更可信。辩论纠的是"视角"的偏,纠不了"数据"的偏。所以第 2 课的冗余纪律和第 3 课的可审计理由,在多 Agent 时代一条都不能省。
脚本全程离线:证据包是第 3/5 课的内置样本,辩论文本在演示模式下是预计算的,但每个引用的数字(+9.84%、1658.40、1784.79……)都是 compute_stats() 从价格样本里真算的。逐行复制:
cd "$HOME/AI Project/Quant Learning"
source .venv/bin/activate
python scripts/debate_team.py
你会看到(我已在你的环境实测通过;第二轮反驳全文较长,此处截断,完整版以你本机运行为准):
团队名单(TradingAgents 三层架构的最小实现)
[证据层] 证据包:第3课新闻样本 + 第5课价格样本(离线内置)
[辩论层] 看多研究员 ⇄ 看空研究员,交锋 2 轮
[裁决层] 研究经理:输出倾向 + 置信度
【证据包:贵州茅台(600519) 提价事件,2026-07】
一、新闻面(第3课情绪打分器的输入素材)
- 2026-07-17 21:43|飞天茅台 官宣涨价!+100元
- 2026-07-20 13:28|茅台批价回落,贵州茅台年内第二次上调飞天茅台零售价
……共 6 条
二、价格面(前复权收盘价,第5课样本)
- 区间 2026-07-01 ~ 2026-07-21:1612.50 → 1771.20(+9.84%)
- 提价公告日(2026-07-17)收盘 1658.40;之后冲高 1784.79(2026-07-20,较公告日+7.62%)
- 最新收盘 1771.20(2026-07-21),较前高-0.76%
三、公司动作
- 飞天茅台 i茅台平台零售价 1539 → 1639 元/瓶(+100 元,+6.5%),
销售合同价上调至 1369 元/瓶,2026-07-18 起执行
────────── 第一轮 · 立论 ──────────
【看多研究员】
①提价是教科书级直接利好:零售价 1539→1639 元(+6.5%)、合同价同步上调至 1369 元,
公司公告白纸黑字,利润增厚是确定性的。②市场已用真金白银投票:公告日收盘 1658.40,
两个交易日内冲高 1784.79(+7.62%),白酒股集体跟涨,这是资金共识的确认。③管理层
明知批价承压仍敢提价,恰恰说明对渠道消化能力有底气……
【看空研究员】
①批价回落才是这盘棋的真信号:官方指导价上调的同时,经销商之间的真实成交价在跌,
终端需求接不住这个价格,提价红利可能被渠道折价吃掉。②涨幅恰是风险:公告后冲高
1784.79(+7.62%)后,最新收盘已回撤 -0.76%——"利好兑现即利空"的剧本在A股演过无数遍。
③复盘第3课:情绪分 +0.73 里 3 条新闻在说同一件事,独立信息只有一两个……
────────── 第二轮 · 反驳 ──────────
(双方逐点反驳,完整输出以你本机运行为准)
────────── 研究经理 · 裁决 ──────────
倾向:偏多 置信度:62%
核心逻辑:提价是确定性利润增厚,批价回落是概率性风险,且市场已初步验证
最大风险:批价继续回落,证伪"渠道能消化提价"的前提
观察点:批价是否止跌;股价是否跌回公告日收盘 1658.40 下方
BULL_SYSTEM / BEAR_SYSTEM),输入的证据包一字不差。差异只来自"职责",不来自信息——这才是一场公平的辩论,裁决才有意义。run_live():第二轮的 messages 里带上了对方的第一轮发言,要求"逐点反驳"。没有这一步,两个角色就各说各话,不叫辩论叫平行独白。MANAGER_SYSTEM 要求只输出 {"stance", "confidence", "reason", "key_risk", "watch"}——结构化输出、标尺定义、可审计理由,第 3 课的三原则在多 Agent 场景原样生效,解析失败照样跳过报错。再读一遍裁决本身,注意它长什么样:不是"买/卖",而是"偏多、62%、最大风险是 X、下一个观察点是 Y"。62% 的意思是"证据天平略偏多方,但远不到拍桌子"。这才是研究员团队该交付的东西——一份带反方意见、带证伪条件的备忘录。T+1 的制度下它正好够用:今晚裁决完,明天开盘前你还有一整晚消化"最大风险"那一行。
脚本最后会算一笔账(演示模式按 1 token ≈ 1.5 字估算,真实模式用接口返回的 usage,以下是实测输出):
========================================================
成本账本:这场辩论花了多少 token
========================================================
第1次:看多·第一轮:输入约 693 字,输出约 194 字
第2次:看空·第一轮:输入约 695 字,输出约 191 字
第3次:看多·第二轮:输入约 1113 字,输出约 153 字
第4次:看空·第二轮:输入约 1115 字,输出约 195 字
第5次:研究经理裁决:输入约 1558 字,输出约 157 字
估算(1 token ≈ 1.5 字):输入约 3449 tokens,输出约 593 tokens
按 deepseek-chat 标准价(输入 ¥2.0/M、输出 ¥8.0/M)估算:约 ¥0.0116
三个读数方法:
| 场景 | 建议形态 | 理由 |
|---|---|---|
| 例行摘要、批量打分 | 单次调用(第 3 课模式) | 任务是翻译不是决策,辩论纯属浪费 |
| 单票事件取证与诊断 | 单 Agent 工具循环(第 5 课模式) | 需要查证但不需要立场对抗,ReAct 循环够用 |
| 重仓/调仓等重大决策 | 多 Agent 辩论(本课模式) | 错一次的代价远大于 token 账单,反方意见值这个钱 |
演示模式的辩论文本是预计算的;真实模式走 LLM_API_KEY,串行 5 次 OpenAI 兼容调用(2 角色 × 2 轮 + 1 次裁决),并用接口返回的 usage 打出精确账单:
export LLM_API_KEY="sk-你的key"
python scripts/debate_team.py --live
换别家模型只需改 LLM_BASE_URL 和 LLM_MODEL 两个环境变量。真实模式我已写好但尚未实测(你机器上还没有 Key)——拿到 Key 后跑一次,有报错直接贴给我。跑完建议做一件事:把真实模式下多空双方的论证和演示模式对比,看模型现场发挥是更强还是更滑头。
凭记忆作答,答错会显示解析。
tradingagents/graph/ 下的流程编排代码。它面向美股、依赖付费数据源;不建议你直接部署,读懂设计即可,移植到 A 股时先过一遍第 1 课的硬规则。第 14 课 · 回测进阶:滑点与涨跌停不可成交——第 4 课的回测假设"次日开盘价想买就能买到",但涨跌停板上根本没有对手盘。给回测补上这两块现实,看它又把多少"漂亮策略"打回原形。
有任何不清楚的地方(比如第二轮的上下文怎么拼、成本账本的估算口径、裁决 JSON 的校验),直接问我——我是你的老师。