第 13 课 · 多智能体团队:多空辩论实战

把"再找个人抬杠"制度化——TradingAgents 架构拆解与它的成本代价

预计用时:40 分钟 上一课:第 12 课 · 宏观数据与择时

这节课你将得到什么

一个多空辩论模拟器 scripts/debate_team.py:围绕你熟悉的茅台提价事件(第 3 课的新闻、第 5 课的价格,原样复用),看多研究员看空研究员各执证据辩论两轮,再由研究经理读完全场,裁决出"倾向 + 置信度 + 最大风险 + 观察点"。演示模式无需 API Key,全部辩论文本预计算、引用数字真实计算,先跑通再谈原理。

比脚本更重要的是三个判断:TradingAgents 论文的团队是怎么分工的(你的组件各就各位)、为什么辩论能治第 11 课讲的立场偏差、以及多 Agent 的账单有多贵、什么时候才值得付

一、TradingAgents 架构拆解:一家公司,不是一个模型

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 下方

四、读这场辩论:三个值得抄走的设计

再读一遍裁决本身,注意它长什么样:不是"买/卖",而是"偏多、62%、最大风险是 X、下一个观察点是 Y"。62% 的意思是"证据天平略偏多方,但远不到拍桌子"。这才是研究员团队该交付的东西——一份带反方意见、带证伪条件的备忘录。T+1 的制度下它正好够用:今晚裁决完,明天开盘前你还有一整晚消化"最大风险"那一行。

五、成本账本:token × N,以及什么时候值得付

脚本最后会算一笔账(演示模式按 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_URLLLM_MODEL 两个环境变量。真实模式我已写好但尚未实测(你机器上还没有 Key)——拿到 Key 后跑一次,有报错直接贴给我。跑完建议做一件事:把真实模式下多空双方的论证和演示模式对比,看模型现场发挥是更强还是更滑头。

自测

凭记忆作答,答错会显示解析。

延伸阅读

下一课预告

第 14 课 · 回测进阶:滑点与涨跌停不可成交——第 4 课的回测假设"次日开盘价想买就能买到",但涨跌停板上根本没有对手盘。给回测补上这两块现实,看它又把多少"漂亮策略"打回原形。

有任何不清楚的地方(比如第二轮的上下文怎么拼、成本账本的估算口径、裁决 JSON 的校验),直接问我——我是你的老师。