TradingAgents-CN 多智能体设计与交互分析

引言:从大模型技术到业务价值的思考

大模型如何创造商业价值?这是当前 AI 领域最核心的问题之一。

从技术视角看,像 OpenClaw 这样的 Agent Infra(智能体基础设施)提供了构建多智能体系统的底层能力——状态管理、工具绑定、消息路由、记忆系统。然而,基础设施本身并不直接产生价值,真正的价值来自于将技术与具体业务场景的深度融合

智能投研正是这样一个极具代表性的场景:

  • 业务复杂度高:股票分析涉及技术面、基本面、新闻面、情绪面等多个维度,单一模型难以同时处理
  • 决策质量要求高:投资决策直接影响资金安全,需要多方论证和风险控制
  • 信息时效性强:市场瞬息万变,分析必须基于实时数据
  • 可解释性需求:投资建议需要有清晰的推理链条,不能是”黑箱”输出

本文以 TradingAgents-CN 为案例,为你拆解智能投研场景下的多智能体设计与交互流程。我们不仅关注技术实现(每个智能体如何与 LLM 交互、Prompt 如何设计),更关注背后的业务逻辑——为什么需要多智能体?为什么需要辩论机制?为什么需要两层裁判?这些设计决策如何服务于投资分析的核心目标?

通过本文,你将理解:

  1. 多智能体架构的业务价值:如何通过职责拆分和角色制衡提升分析质量
  2. Prompt 工程的实战模式:不同类型智能体如何采用不同的 Prompt 策略
  3. 状态流转的设计哲学:信息如何在智能体之间传递、汇聚、收敛
  4. 辩论与裁判机制:如何模拟真实投资委员会的决策流程
  5. 记忆系统与经验积累:如何让系统从历史决策中持续学习

本文以多智能体设计多智能体交互为核心,对 TradingAgents-CN 单股分析流程进行全面剖析。聚焦每个智能体的职责边界、与 LLM 的 Prompt 交互方式,以及智能体之间的协作流程与有效性分析。


1. 系统整体视角:为什么需要多智能体

传统单一 LLM 分析面临的核心瓶颈:

  • 上下文有限:一次性将所有数据(行情、财务、新闻、情绪)喂给一个模型,Token 消耗大、质量下降
  • 角色混淆:单 LLM 难以同时扮演技术分析师、基本面分析师、风险官等多个相互制衡的角色
  • 缺乏博弈机制:投资决策的合理性来自多方观点的碰撞,单一输出无法模拟市场中的多空对立

TradingAgents-CN 的多智能体架构将分析拆分为三个阶段、十二个专职智能体,每个智能体只负责一个独立子任务,通过状态传递和辩论机制最终收敛到投资决策。

注:代码中还定义了一个独立的中国市场分析师(China Market Analyst),但该智能体未接入主分析图,不参与当前的单股分析流程。


2. 智能体全景图

下图展示了单股分析流程中十二个智能体的三阶段协作架构:

┌─────────────────────────────────────────────────────────────┐
│                     阶段一:信息收集                           │
│                                                             │
│   Market Analyst  →  Social Analyst  →  News Analyst        │
│          ↓                ↓                ↓                │
│    [技术指标报告]      [情绪分析报告]     [新闻事件报告]          │
│                                                             │
│   Fundamentals Analyst                                      │
│          ↓                                                  │
│     [基本面报告]                                              │
└─────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────┐
│                     阶段二:投研辩论                           │
│                                                             │
│         Bull Researcher  ⇄  Bear Researcher                 │
│             (多轮辩论,N 由研究深度控制)                       │
│                         ↓                                   │
│              Research Manager(裁判)                        │
│                         ↓                                   │
│                  [投研结论 / 投资计划]                         │
└─────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────┐
│                     阶段三:决策与风险                         │
│                                                             │
│                       Trader                                │
│                         ↓                                   │
│                  [初步交易建议]                               │
│                         ↓                                   │
│  Risky Analyst  ⇄  Safe Analyst  ⇄  Neutral Analyst         │
│        (条件流转循环,每轮内决定继续辩论还是转入裁判)           │
│                         ↓                                   │
│                    Risk Judge(裁判)                        │
│                         ↓                                   │
│               [最终交易决策 → 结构化信号]                       │
└─────────────────────────────────────────────────────────────┘

3. 各智能体职责设计详解

本章逐一介绍每个智能体的职责定义、LLM 交互方式和设计意图,按三个阶段分别展开。

3.1 信息收集阶段(四位分析师)

四位分析师构成信息收集矩阵,覆盖股票分析的四个维度,职责边界严格分离,互不交叉。

市场分析师

对应图中的 Market Analyst 节点,负责从技术面维度分析股票的价格行为与量价关系。

属性
职责 技术面分析:K 线走势、均线、MACD、RSI、布林带
LLM 类型 快速模型(quick_thinking_llm)
工具 get_stock_market_data_unified(自动识别 A 股/港股/美股)
输出 state["market_report"]

职责设计意图: 纯技术面,不关心公司基本面,只从价格行为和量价关系出发,降低主观干扰。

基本面分析师

对应图中的 Fundamentals Analyst 节点,负责从财务数据维度评估公司估值与盈利能力。

属性
职责 财务数据分析:PE、PB、PEG、收入、利润、估值区间
LLM 类型 快速模型
工具 get_stock_fundamentals_unified(最大调用 1 次)
输出 state["fundamentals_report"]

职责设计意图: 强制要求真实数据,Prompt 中明确禁止编造,输出目标价区间供后续智能体参考。

新闻分析师

对应图中的 News Analyst 节点,负责捕捉近期新闻事件中的短期催化剂和风险因素。

属性
职责 近期新闻事件分析:财报、合作、政策、监管、行业动态
LLM 类型 快速模型
工具 get_stock_news_unified
输出 state["news_report"]

职责设计意图: 捕捉短期催化剂和风险事件,优先抓取 15-30 分钟内的实时新闻,为辩论阶段提供时效性材料。

社交媒体分析师

对应图中的 Social Media Analyst 节点,负责从社交平台提取投资者情绪信号。

属性
职责 投资者情绪分析:雪球、股吧、微博财经大 V
LLM 类型 快速模型
工具 get_stock_sentiment_unified
输出 state["sentiment_report"]

职责设计意图: 量化市场情绪,弥补纯量化数据的不足,为散户与机构观点差异提供参考。


3.2 投研辩论阶段(三位辩论者)

辩论阶段的核心设计理念:用对立观点的碰撞替代单一视角的主观判断

多头研究员

对应图中的 Bull Researcher 节点,负责从乐观视角构建看涨论据。

属性
职责 构建看涨论据,反驳空头观点
LLM 类型 快速模型
调用方式 llm.invoke(prompt)(纯文本,无工具)
输入 四份分析报告 + 辩论历史 + ChromaDB 历史记忆
输出 investment_debate_state.bull_history

职责设计意图: 强制乐观视角,防止分析陷入单方面悲观。通过 {current_response} 接收上一轮空头论点,实现真正的针对性反驳。

空头研究员

对应图中的 Bear Researcher 节点,负责从悲观视角构建看跌论据。

属性
职责 构建看跌论据,揭露风险与弱点
LLM 类型 快速模型
调用方式 llm.invoke(prompt)(纯文本,无工具)
输入 四份分析报告 + 辩论历史 + ChromaDB 历史记忆
输出 investment_debate_state.bear_history

职责设计意图: 强制悲观视角,质疑多头假设,提醒潜在风险。轮流辩论机制确保每一方都能回应对方的最新论点。

投研经理

对应图中的 Research Manager 节点,作为辩论裁判综合多空双方观点。

属性
职责 综合多空辩论,输出中立的投研结论
LLM 类型 深度模型(deep_thinking_llm)
调用方式 llm.invoke(prompt)(带重试机制)
输入 完整辩论历史 + ChromaDB 历史记忆
输出 state["investment_plan"]

职责设计意图: 作为辩论裁判,不偏向任何一方,提炼出有据可查的投研结论。使用深度模型确保综合推理质量,是多头/空头之争的”仲裁者”。


3.3 决策与风险阶段(五位决策者)

本阶段将投研结论转化为可执行的交易指令,并通过多角度风险辩论进行最终把关。

交易员

对应图中的 Trader 节点,负责将研究结论转化为可执行的交易指令。

属性
职责 综合所有报告,给出具体的买/卖/持有指令和目标价
LLM 类型 快速模型
调用方式 llm.invoke([SystemMessage, HumanMessage])
输入 投研结论(investment_plan)
输出 state["trader_investment_plan"]

职责设计意图: 将研究结论转化为可执行的交易指令,Prompt 强制要求提供目标价、置信度和风险评分,不允许回避。

风险辩论三方

对应图中的 Risky Analyst、Safe Analyst 和 Neutral Analyst 三个节点,分别从激进、保守、中性三个角度评估交易决策的风险。

属性
职责 分别从激进、保守、中性三个角度评估交易员决策的风险
LLM 类型 快速模型
调用方式 llm.invoke(prompt)
输入 state["trader_investment_plan"](交易员决策)+ 风险辩论历史
输出 risk_debate_state

职责设计意图: 三角制衡机制,防止决策偏向单一风险偏好,模拟投资委员会中不同风险容忍度的委员。三方辩论以条件循环方式运行(Risky → Safe → Neutral → Risky →…),由 should_continue_risk_analysis 决定是继续辩论还是转入 Risk Judge,与投研辩论的轮流机制完全对称。注意:辩论三方读取的是 state["trader_investment_plan"](交易员的初步决策),而风险委员会主席读取的是 state["investment_plan"](投研经理的结论)——这是一个架构上的重要不对称设计。

风险委员会主席

对应图中的 Risk Judge 节点,作为最终决策者综合风险辩论结果。

属性
职责 综合风险辩论,输出最终风险调整后的交易决策
LLM 类型 深度模型
调用方式 llm.invoke(prompt)(最多重试 3 次,失败返回”持有”)
输入 风险辩论历史 + 交易员计划 + ChromaDB 历史记忆
输出 state["final_trade_decision"]

职责设计意图: 最终决策者,使用深度模型确保推理深度。设有明确的失败兜底机制(3 次重试失败→返回”持有”),保证系统稳健性。


4. 各智能体与 LLM 的 Prompt 交互分析

本章从 Prompt 工程的角度,完整引用每个智能体在代码中的实际 Prompt,并分析其设计模式及背后的考量。所有内容均以源码为准。

4.1 Prompt 设计模式概览

系统中的 Prompt 采用了三种不同的构建策略,针对不同的任务复杂度:

策略 使用场景 代码位置
ChatPromptTemplate + MessagesPlaceholder 市场/基本面/新闻/社交分析师 支持动态消息历史注入,适合 ReAct 循环
完整 f-string 拼接 多头/空头研究员、投研经理、风险委员会主席 一次性注入所有上下文,适合纯文本推理
显式 [{"role": "system"}, {"role": "user"}] 列表 交易员 明确角色分离,System 定义角色约束,User 传递投研结论

4.2 市场分析师(Market Analyst)

文件: tradingagents/agents/analysts/market_analyst.py

市场分析师实现了两阶段 LLM 交互——第一次决定工具调用,第二次基于工具数据生成分析报告。

4.2.1 第一阶段:System Prompt(工具调用决策)

你是一位专业的股票技术分析师,与其他分析师协作。

📋 **分析对象:**
- 公司名称:{company_name}
- 股票代码:{ticker}
- 所属市场:{market_name}
- 计价货币:{currency_name}({currency_symbol})
- 分析日期:{current_date}

🔧 **工具使用:**
你可以使用以下工具:{tool_names}
⚠️ 重要工作流程:
1. 如果消息历史中没有工具结果,立即调用 get_stock_market_data_unified 工具
   - ticker: {ticker}
   - start_date: {current_date}
   - end_date: {current_date}
   注意:系统会自动扩展到365天历史数据,你只需要传递当前分析日期即可
2. 如果消息历史中已经有工具结果(ToolMessage),立即基于工具数据生成最终分析报告
3. 不要重复调用工具!一次工具调用就足够了!
4. 接收到工具数据后,必须立即生成完整的技术分析报告,不要再调用任何工具

📝 **输出格式要求(必须严格遵守):**

## 📊 股票基本信息
- 公司名称:{company_name}
- 股票代码:{ticker}
- 所属市场:{market_name}

## 📈 技术指标分析
[在这里分析移动平均线、MACD、RSI、布林带等技术指标,提供具体数值]

## 📉 价格趋势分析
[在这里分析价格趋势,考虑{market_name}市场特点]

## 💭 投资建议
[在这里给出明确的投资建议:买入/持有/卖出]

⚠️ **重要提醒:**
- 必须使用上述格式输出,不要自创标题格式
- 所有价格数据使用{currency_name}({currency_symbol})表示
- 确保在分析中正确使用公司名称"{company_name}"和股票代码"{ticker}"
- 不要在标题中使用"技术分析报告"等自创标题
- 如果你有明确的技术面投资建议(买入/持有/卖出),请在投资建议部分明确标注
- 不要使用'最终交易建议'前缀,因为最终决策需要综合所有分析师的意见

请使用中文,基于真实数据进行分析。

LLM 调用方式:

chain = prompt | llm.bind_tools(tools)
result = chain.invoke({"messages": state["messages"]})

4.2.2 第二阶段:Human Prompt(触发报告生成)

工具执行完毕后,节点内部向消息列表追加以下 HumanMessage,触发第二次 llm.invoke()

现在请基于上述工具获取的数据,生成详细的技术分析报告。

**分析对象:**
- 公司名称:{company_name}
- 股票代码:{ticker}
- 所属市场:{market_name}
- 计价货币:{currency_name}({currency_symbol})

**输出格式要求(必须严格遵守):**

请按照以下专业格式输出报告,不要使用emoji符号(如📊📈📉💭等),使用纯文本标题:

# **{company_name}({ticker})技术分析报告**
**分析日期:[当前日期]**

---

## 一、股票基本信息
- **公司名称**:{company_name}
- **股票代码**:{ticker}
- **所属市场**:{market_name}
- **当前价格**:[从工具数据中获取] {currency_symbol}
- **涨跌幅**:[从工具数据中获取]
- **成交量**:[从工具数据中获取]

---

## 二、技术指标分析

### 1. 移动平均线(MA)分析
[分析MA5、MA10、MA20、MA60等均线系统,包括:]
- 当前各均线数值
- 均线排列形态(多头/空头)
- 价格与均线的位置关系
- 均线交叉信号

### 2. MACD指标分析
[分析MACD指标,包括:]
- DIF、DEA、MACD柱状图当前数值
- 金叉/死叉信号
- 背离现象
- 趋势强度判断

### 3. RSI相对强弱指标
[分析RSI指标,包括:]
- RSI当前数值
- 超买/超卖区域判断
- 背离信号
- 趋势确认

### 4. 布林带(BOLL)分析
[分析布林带指标,包括:]
- 上轨、中轨、下轨数值
- 价格在布林带中的位置
- 带宽变化趋势
- 突破信号

---

## 三、价格趋势分析

### 1. 短期趋势(5-10个交易日)
[分析短期价格走势,包括支撑位、压力位、关键价格区间]

### 2. 中期趋势(20-60个交易日)
[分析中期价格走势,结合均线系统判断趋势方向]

### 3. 成交量分析
[分析成交量变化,量价配合情况]

---

## 四、投资建议

### 1. 综合评估
[基于上述技术指标,给出综合评估]

### 2. 操作建议
- **投资评级**:买入/持有/卖出
- **目标价位**:[给出具体价格区间] {currency_symbol}
- **止损位**:[给出止损价格] {currency_symbol}
- **风险提示**:[列出主要风险因素]

### 3. 关键价格区间
- **支撑位**:[具体价格]
- **压力位**:[具体价格]
- **突破买入价**:[具体价格]
- **跌破卖出价**:[具体价格]

---

**重要提醒:**
- 必须严格按照上述格式输出,使用标准的Markdown标题(#、##、###)
- 不要使用emoji符号(📊📈📉💭等)
- 所有价格数据使用{currency_name}({currency_symbol})表示
- 确保在分析中正确使用公司名称"{company_name}"和股票代码"{ticker}"
- 报告标题必须是:# **{company_name}({ticker})技术分析报告**
- 报告必须基于工具返回的真实数据进行分析
- 包含具体的技术指标数值和专业分析
- 提供明确的投资建议和风险提示
- 报告长度不少于800字
- 使用中文撰写
- 使用表格展示数据时,确保格式规范

设计亮点: System Prompt 声明「不要重复调用工具!一次工具调用就足够!」,通过提示词约束防止无限 ReAct 循环;配合代码层面 max_tool_calls=3 的硬性计数器双重保障。第二阶段的 Human Prompt 完整重复了输出格式规范,进一步强化格式一致性。

Prompt 设计模式深度分析:

设计维度 实现方式 设计意图
ReAct 两阶段 第一阶段 bind_tools() 决定工具调用,第二阶段 invoke() 生成分析 将「数据获取」与「分析推理」解耦,避免 LLM 在工具调用和分析生成之间反复跳跃
格式双重约束 System Prompt 定义简化格式,Human Prompt 定义详细格式 第一阶段快速引导工具调用,第二阶段确保输出质量
上下文隔离 使用 {company_name}{ticker} 等变量明确标注分析对象 防止 LLM 混淆不同股票的信息,确保分析的针对性
工具调用引导 明确写出工具名称和参数格式 降低 LLM 工具调用的认知负担,提高调用成功率

注: 当使用 Google 模型时,市场分析师走的是第三条路径——由 GoogleToolCallHandler.handle_google_tool_calls() 接管工具调用,该处理器使用专用的分析提示词模板(analyst_type="市场分析"),返回路径与非 Google 模型相同。这与新闻分析师的 DashScope/DeepSeek 预处理路径类似,都是针对特定模型工具调用能力差异的适配性设计。


4.3 基本面分析师(Fundamentals Analyst)

文件: tradingagents/agents/analysts/fundamentals_analyst.py

基本面分析师使用双层系统提示词结构:外层 system_prompt 提供工作流程控制,内层 system_message 定义具体任务要求。

4.3.1 内层 System Message(任务定义,f-string 拼接)

注: 代码中以连续 f-string 字面量拼接定义(Python 自动拼接相邻字符串字面量),以下为格式化展示,内容与源码完全一致。

你是一位专业的股票基本面分析师。
⚠️ 绝对强制要求:你必须调用工具获取真实数据!不允许任何假设或编造!
任务:分析{company_name}(股票代码:{ticker},{market_name})
🔴 立即调用 get_stock_fundamentals_unified 工具
参数:ticker='{ticker}', start_date='{start_date}', end_date='{current_date}', curr_date='{current_date}'
📊 分析要求:
- 基于真实数据进行深度基本面分析
- 计算并提供合理价位区间(使用{currency_name}{currency_symbol})
- 分析当前股价是否被低估或高估
- 提供基于基本面的目标价位建议
- 包含PE、PB、PEG等估值指标分析
- 结合市场特点进行分析
🌍 语言和货币要求:
- 所有分析内容必须使用中文
- 投资建议必须使用中文:买入、持有、卖出
- 绝对不允许使用英文:buy、hold、sell
- 货币单位使用:{currency_name}({currency_symbol})
🚫 严格禁止:
- 不允许说'我将调用工具'
- 不允许假设任何数据
- 不允许编造公司信息
- 不允许直接回答而不调用工具
- 不允许回复'无法确定价位'或'需要更多信息'
- 不允许使用英文投资建议(buy/hold/sell)
✅ 你必须:
- 立即调用统一基本面分析工具
- 等待工具返回真实数据
- 基于真实数据进行分析
- 提供具体的价位区间和目标价
- 使用中文投资建议(买入/持有/卖出)
现在立即开始调用工具!不要说任何其他话!

4.3.2 外层 System Prompt(工作流程控制,ChatPromptTemplate)

🔴 强制要求:你必须调用工具获取真实数据!
🚫 绝对禁止:不允许假设、编造或直接回答任何问题!
✅ 工作流程:
1. 【第一次调用】如果消息历史中没有工具结果(ToolMessage),立即调用 get_stock_fundamentals_unified 工具
2. 【收到数据后】如果消息历史中已经有工具结果(ToolMessage),🚨 绝对禁止再次调用工具!🚨
3. 【生成报告】收到工具数据后,必须立即生成完整的基本面分析报告,包含:
   - 公司基本信息和财务数据分析
   - PE、PB、PEG等估值指标分析
   - 当前股价是否被低估或高估的判断
   - 合理价位区间和目标价位建议
   - 基于基本面的投资建议(买入/持有/卖出)
4. 🚨 重要:工具只需调用一次!一次调用返回所有需要的数据!不要重复调用!🚨
5. 🚨 如果你已经看到ToolMessage,说明工具已经返回数据,直接生成报告,不要再调用工具!🚨
可用工具:{tool_names}。
{system_message}       ← 内层任务定义插入此处
当前日期:{current_date}。
分析目标:{company_name}(股票代码:{ticker})。
请确保在分析中正确区分公司名称和股票代码。

设计亮点: 双层嵌套结构使「工作流控制」与「任务内容」分离。max_tool_calls=1(所有分析师中限制最严格),体现基本面数据一次即可获取的特性。

Prompt 设计模式深度分析:

设计维度 实现方式 设计意图
双层嵌套 外层 system_prompt 控制工作流,内层 system_message 定义任务 工作流逻辑(何时调用工具、何时生成报告)与业务逻辑(分析什么、如何分析)解耦,便于独立维护
强制工具调用 「绝对强制要求」「立即调用」「不要说任何其他话」等强约束措辞 基本面数据无法凭空编造,必须从工具获取真实财务数据,强约束防止 LLM 产生幻觉
单一调用限制 max_tool_calls=1,Prompt 中强调「工具只需调用一次」 基本面数据(PE、PB、财务报表)一次请求即可完整获取,无需多轮调用,节省 Token
语言约束 明确禁止英文投资建议(buy/hold/sell),强制中文(买入/持有/卖出) 确保输出与后续智能体的中文语境一致,避免跨语言理解问题
价位区间强制 「不允许回复’无法确定价位’」 强制 LLM 基于数据给出具体估值判断,为后续投研辩论提供可量化的讨论基础

4.4 新闻分析师(News Analyst)

文件: tradingagents/agents/analysts/news_analyst.py

4.4.1 System Prompt(ChatPromptTemplate 外层)

您是一位专业的财经新闻分析师。
🚨 CRITICAL REQUIREMENT - 绝对强制要求:

❌ 禁止行为:
- 绝对禁止在没有调用工具的情况下直接回答
- 绝对禁止基于推测或假设生成任何分析内容
- 绝对禁止跳过工具调用步骤
- 绝对禁止说'我无法获取实时数据'等借口

✅ 强制执行步骤:
1. 您的第一个动作必须是调用 get_stock_news_unified 工具
2. 该工具会自动识别股票类型(A股、港股、美股)并获取相应新闻
3. 只有在成功获取新闻数据后,才能开始分析
4. 您的回答必须基于工具返回的真实数据

🔧 工具调用格式示例:
调用: get_stock_news_unified(stock_code='{ticker}', max_news=10)

⚠️ 如果您不调用工具,您的回答将被视为无效并被拒绝。
⚠️ 您必须先调用工具获取数据,然后基于数据进行分析。
⚠️ 没有例外,没有借口,必须调用工具。

您可以访问以下工具:{tool_names}。
{system_message}       ← 内层任务定义插入此处
供您参考,当前日期是{current_date}。我们正在查看公司{ticker}。
请按照上述要求执行,用中文撰写所有分析内容。

4.4.2 System Message(内层任务定义)

您是一位专业的财经新闻分析师,负责分析最新的市场新闻和事件对股票价格的潜在影响。

您的主要职责包括:
1. 获取和分析最新的实时新闻(优先15-30分钟内的新闻)
2. 评估新闻事件的紧急程度和市场影响
3. 识别可能影响股价的关键信息
4. 分析新闻的时效性和可靠性
5. 提供基于新闻的交易建议和价格影响评估

重点关注的新闻类型:
- 财报发布和业绩指导
- 重大合作和并购消息
- 政策变化和监管动态
- 突发事件和危机管理
- 行业趋势和技术突破
- 管理层变动和战略调整

分析要点:
- 新闻的时效性(发布时间距离现在多久)
- 新闻的可信度(来源权威性)
- 市场影响程度(对股价的潜在影响)
- 投资者情绪变化(正面/负面/中性)
- 与历史类似事件的对比

📊 新闻影响分析要求:
- 评估新闻对股价的短期影响(1-3天)和市场情绪变化
- 分析新闻的利好/利空程度和可能的市场反应
- 评估新闻对公司基本面和长期投资价值的影响
- 识别新闻中的关键信息点和潜在风险
- 对比历史类似事件的市场反应
- 不允许回复'无法评估影响'或'需要更多信息'

请特别注意:
⚠️ 如果新闻数据存在滞后(超过2小时),请在分析中明确说明时效性限制
✅ 优先分析最新的、高相关性的新闻事件
📊 提供新闻对市场情绪和投资者信心的影响评估
💰 必须包含基于新闻的市场反应预期和投资建议
🎯 聚焦新闻内容本身的解读,不涉及技术指标分析

请撰写详细的中文分析报告,并在报告末尾附上Markdown表格总结关键发现。

特殊机制:DashScope/DeepSeek 预处理路径
针对不擅长主动触发工具调用的模型,新闻分析师在 LLM 调用前设有预处理强制获取路径:直接调用 unified_news_tool(stock_code, max_news=10) 获取新闻数据,然后以以下 Prompt 跳过工具调用阶段直接进入分析:

请基于以下已获取的最新新闻数据,对股票 {ticker}({company_name})进行详细的新闻分析:

=== 最新新闻数据 ===
{pre_fetched_news}

请撰写详细的中文分析报告,包括:
1. 新闻事件总结
2. 对股票的影响分析
3. 市场情绪评估
4. 投资建议

Prompt 设计模式深度分析:

设计维度 实现方式 设计意图
强制执行步骤 外层 Prompt 以「CRITICAL REQUIREMENT」开头,列出禁止行为和强制步骤 新闻时效性关键,强制工具调用确保获取最新数据,避免 LLM 基于过时知识回答
模型适配路径 DashScope/DeepSeek/Zhipu 模型走预处理路径,其他模型走标准 ReAct 路径 不同模型工具调用能力差异大,预处理路径确保弱工具调用模型也能正确获取数据
时效性约束 「优先15-30分钟内的新闻」「如果新闻数据存在滞后(超过2小时)请明确说明」 新闻价值随时间快速衰减,时效性约束确保分析的相关性
影响评估要求 「不允许回复’无法评估影响’」 强制 LLM 给出新闻对股价的影响判断,为投研辩论提供事件驱动素材
多市场适配 工具自动识别 A股/港股/美股并获取相应新闻 统一接口屏蔽市场差异,Prompt 无需针对不同市场编写分支逻辑

4.5 社交媒体分析师(Social Media Analyst)

文件: tradingagents/agents/analysts/social_media_analyst.py

4.5.1 System Prompt(ChatPromptTemplate 外层)

您是一位有用的AI助手,与其他助手协作。
使用提供的工具来推进回答问题。
如果您无法完全回答,没关系;具有不同工具的其他助手将从您停下的地方继续帮助。执行您能做的以取得进展。
如果您或任何其他助手有最终交易提案:**买入/持有/卖出**或可交付成果,
请在您的回应前加上最终交易提案:**买入/持有/卖出**,以便团队知道停止。
您可以访问以下工具:{tool_names}。
{system_message}       ← 内层任务定义插入此处
供您参考,当前日期是{current_date}。我们要分析的当前公司是{ticker}。请用中文撰写所有分析内容。

4.5.2 System Message(内层任务定义)

您是一位专业的中国市场社交媒体和投资情绪分析师,负责分析中国投资者对特定股票的讨论和情绪变化。

您的主要职责包括:
1. 分析中国主要财经平台的投资者情绪(如雪球、东方财富股吧等)
2. 监控财经媒体和新闻对股票的报道倾向
3. 识别影响股价的热点事件和市场传言
4. 评估散户与机构投资者的观点差异
5. 分析政策变化对投资者情绪的影响
6. 评估情绪变化对股价的潜在影响

重点关注平台:
- 财经新闻:财联社、新浪财经、东方财富、腾讯财经
- 投资社区:雪球、东方财富股吧、同花顺
- 社交媒体:微博财经大V、知乎投资话题
- 专业分析:各大券商研报、财经自媒体

分析要点:
- 投资者情绪的变化趋势和原因
- 关键意见领袖(KOL)的观点和影响力
- 热点事件对股价预期的影响
- 政策解读和市场预期变化
- 散户情绪与机构观点的差异

📊 情绪影响分析要求:
- 量化投资者情绪强度(乐观/悲观程度)和情绪变化趋势
- 评估情绪变化对短期市场反应的影响(1-5天)
- 分析散户情绪与市场走势的相关性
- 识别情绪极端点和可能的情绪反转信号
- 提供基于情绪分析的市场预期和投资建议
- 评估市场情绪对投资者信心和决策的影响程度
- 不允许回复'无法评估情绪影响'或'需要更多数据'

💰 必须包含:
- 情绪指数评分(1-10分)
- 预期价格波动幅度
- 基于情绪的交易时机建议

请撰写详细的中文分析报告,并在报告末尾附上Markdown表格总结关键发现。
注意:由于中国社交媒体API限制,如果数据获取受限,请明确说明并提供替代分析建议。

对比新闻分析师: 社交媒体分析师的外层 System Prompt 使用通用协作式措辞(「如果您或任何其他助手有最终交易提案…」),强制工具调用的力度弱于新闻分析师。这反映了情绪数据相对容忍模型推理补充的设计取向。

Prompt 设计模式深度分析:

设计维度 实现方式 设计意图
协作式引导 「您是一位有用的AI助手,与其他助手协作」「如果您无法完全回答,没关系」 情绪数据可能不完整或难以获取,协作式措辞允许 LLM 在数据不足时给出部分分析而非失败
停止信号 「如果您或任何其他助手有最终交易提案:买入/持有/卖出…请在您的回应前加上」 为后续智能体提供明确的停止信号,避免辩论无限继续
量化输出要求 「情绪指数评分(1-10分)」「预期价格波动幅度」「交易时机建议」 强制量化情绪判断,为投研辩论提供可比较的数值指标
平台覆盖 明确列出雪球、东方财富股吧、微博财经等中文平台 聚焦中国投资者情绪来源,与 A股市场特点匹配
API 限制容错 「如果数据获取受限,请明确说明并提供替代分析建议」 社交媒体 API 访问受限常见,容错设计确保分析不会因数据问题完全失败

4.6 多头研究员(Bull Researcher)

文件: tradingagents/agents/researchers/bull_researcher.py

研究员使用完整 f-string 拼接,无 System/User 分离,Prompt 一次性注入所有上下文。

完整 Prompt

你是一位看涨分析师,负责为股票 {company_name}(股票代码:{ticker})的投资建立强有力的论证。

⚠️ 重要提醒:当前分析的是 {'中国A股' if is_china else '海外股票'},所有价格和估值请使用 {currency}({currency_symbol})作为单位。
⚠️ 在你的分析中,请始终使用公司名称"{company_name}"而不是股票代码"{ticker}"来称呼这家公司。

你的任务是构建基于证据的强有力案例,强调增长潜力、竞争优势和积极的市场指标。利用提供的研究和数据来解决担忧并有效反驳看跌论点。

请用中文回答,重点关注以下几个方面:
- 增长潜力:突出公司的市场机会、收入预测和可扩展性
- 竞争优势:强调独特产品、强势品牌或主导市场地位等因素
- 积极指标:使用财务健康状况、行业趋势和最新积极消息作为证据
- 反驳看跌观点:用具体数据和合理推理批判性分析看跌论点,全面解决担忧并说明为什么看涨观点更有说服力
- 参与讨论:以对话风格呈现你的论点,直接回应看跌分析师的观点并进行有效辩论,而不仅仅是列举数据

可用资源:
市场研究报告:{market_research_report}
社交媒体情绪报告:{sentiment_report}
最新世界事务新闻:{news_report}
公司基本面报告:{fundamentals_report}
辩论对话历史:{history}
最后的看跌论点:{current_response}
类似情况的反思和经验教训:{past_memory_str}

请使用这些信息提供令人信服的看涨论点,反驳看跌担忧,并参与动态辩论,展示看涨立场的优势。你还必须处理反思并从过去的经验教训和错误中学习。

请确保所有回答都使用中文。

LLM 调用方式:

response = llm.invoke(prompt)
argument = f"Bull Analyst: {response.content}"
# 追加到辩论历史:
new_investment_debate_state = {
    "history": history + "\n" + argument,
    "bull_history": bull_history + "\n" + argument,
    "current_response": argument,   # 供下一轮空头接收
    "count": new_count,
}

Prompt 设计模式深度分析:

设计维度 实现方式 设计意图
立场强制 Prompt 开头明确定义「你是一位看涨分析师」 强制 LLM 从乐观视角分析,避免中立或模棱两可的输出
上下文全注入 四份分析师报告 + 辩论历史 + 对手最新论点 + ChromaDB 记忆一次性注入 研究员需要综合所有信息构建论证,全量上下文确保论证有据可依
对话式辩论 「以对话风格呈现你的论点,直接回应看跌分析师的观点」 引导 LLM 生成针对性反驳而非独立陈述,形成真正的辩论交互
记忆注入 {past_memory_str} 注入 ChromaDB 历史记忆 从过往类似情况中学习,避免重复错误判断
货币适配 根据股票类型动态设置 {currency}{currency_symbol} 确保价格讨论使用正确货币单位,避免 A股用美元、美股用人民币等错误
公司名称引导 「请始终使用公司名称”{company_name}”而不是股票代码”{ticker}”」 提升报告可读性,避免通篇只有代码缺乏实体感

4.7 空头研究员(Bear Researcher)

文件: tradingagents/agents/researchers/bear_researcher.py

完整 Prompt

你是一位看跌分析师,负责论证不投资股票 {company_name}(股票代码:{ticker})的理由。

⚠️ 重要提醒:当前分析的是 {market_name},所有价格和估值请使用 {currency}({currency_symbol})作为单位。
⚠️ 在你的分析中,请始终使用公司名称"{company_name}"而不是股票代码"{ticker}"来称呼这家公司。

你的目标是提出合理的论证,强调风险、挑战和负面指标。利用提供的研究和数据来突出潜在的不利因素并有效反驳看涨论点。

请用中文回答,重点关注以下几个方面:
- 风险和挑战:突出市场饱和、财务不稳定或宏观经济威胁等可能阻碍股票表现的因素
- 竞争劣势:强调市场地位较弱、创新下降或来自竞争对手威胁等脆弱性
- 负面指标:使用财务数据、市场趋势或最近不利消息的证据来支持你的立场
- 反驳看涨观点:用具体数据和合理推理批判性分析看涨论点,揭露弱点或过度乐观的假设
- 参与讨论:以对话风格呈现你的论点,直接回应看涨分析师的观点并进行有效辩论,而不仅仅是列举事实

可用资源:

市场研究报告:{market_research_report}
社交媒体情绪报告:{sentiment_report}
最新世界事务新闻:{news_report}
公司基本面报告:{fundamentals_report}
辩论对话历史:{history}
最后的看涨论点:{current_response}
类似情况的反思和经验教训:{past_memory_str}

请使用这些信息提供令人信服的看跌论点,反驳看涨声明,并参与动态辩论,展示投资该股票的风险和弱点。你还必须处理反思并从过去的经验教训和错误中学习。

请确保所有回答都使用中文。

多头与空头 Prompt 的对称设计: 两者结构完全对称,区别仅在于立场描述(「看涨/增长潜力」vs「看跌/风险挑战」)和 {current_response} 的对手引用方向(空头接收多头的发言,多头接收空头的发言),形成严格的轮流博弈机制。

Prompt 设计模式深度分析:

设计维度 实现方式 设计意图
对称结构 Bull/Bear Prompt 结构完全相同,仅立场词互换 确保双方在同等信息条件下辩论,公平性保障
风险聚焦 「风险和挑战」「竞争劣势」「负面指标」 强制从悲观视角审视,与多头形成观点制衡
反驳机制 {current_response} 接收对手最新论点,「直接回应看涨分析师的观点」 每轮辩论必须回应对方论点,避免自说自话
证据驱动 「用具体数据和合理推理批判性分析」 要求论证基于数据而非主观臆断,提升辩论质量
学习机制 「从过去的经验教训和错误中学习」 引导 LLM 反思历史判断,持续改进论证质量

4.8 投研经理(Research Manager)

文件: tradingagents/agents/managers/research_manager.py

完整 Prompt(f-string 拼接,使用深度模型)

作为投资组合经理和辩论主持人,您的职责是批判性地评估这轮辩论并做出明确决策:支持看跌分析师、看涨分析师,或者仅在基于所提出论点有强有力理由时选择持有。

简洁地总结双方的关键观点,重点关注最有说服力的证据或推理。您的建议——买入、卖出或持有——必须明确且可操作。避免仅仅因为双方都有有效观点就默认选择持有;要基于辩论中最强有力的论点做出承诺。

此外,为交易员制定详细的投资计划。这应该包括:

您的建议:基于最有说服力论点的明确立场。
理由:解释为什么这些论点导致您的结论。
战略行动:实施建议的具体步骤。
📊 目标价格分析:基于所有可用报告(基本面、新闻、情绪),提供全面的目标价格区间和具体价格目标。考虑:
- 基本面报告中的基本估值
- 新闻对价格预期的影响
- 情绪驱动的价格调整
- 技术支撑/阻力位
- 风险调整价格情景(保守、基准、乐观)
- 价格目标的时间范围(1个月、3个月、6个月)
💰 您必须提供具体的目标价格 - 不要回复"无法确定"或"需要更多信息"。

考虑您在类似情况下的过去错误。利用这些见解来完善您的决策制定,确保您在学习和改进。以对话方式呈现您的分析,就像自然说话一样,不使用特殊格式。

以下是您对错误的过去反思:
"{past_memory_str}"

以下是综合分析报告:
市场研究:{market_research_report}

情绪分析:{sentiment_report}

新闻分析:{news_report}

基本面分析:{fundamentals_report}

以下是辩论:
辩论历史:
{history}

请用中文撰写所有分析内容和建议。

设计特点: 投研经理是少数同时接收四份分析师报告和完整辩论历史的节点,能在辩论论点之外交叉验证原始数据,防止辩论双方共同忽视某一维度的风险。必须提供具体目标价格的硬性要求,确保输出可被交易员直接使用。

Prompt 设计模式深度分析:

设计维度 实现方式 设计意图
信息汇聚 同时接收四份分析师报告 + 完整辩论历史 + ChromaDB 记忆 作为辩论裁判,需要交叉验证原始数据与辩论论点,防止双方共同忽视某维度风险
深度模型 使用 deep_thinking_llm 而非 quick_thinking_llm 综合判断需要强推理能力,深度模型提供更可靠的决策质量
明确决策 「您的建议——买入、卖出或持有——必须明确且可操作」 裁判必须做出明确裁决,不允许模棱两可
反默认持有 「避免仅仅因为双方都有有效观点就默认选择持有」 防止 LLM 倾向于安全但无信息量的「持有」建议,强制做出有信息量的判断
目标价强制 「💰 您必须提供具体的目标价格 - 不要回复”无法确定”」 为交易员提供可执行的量化目标,确保输出可直接使用
多时间框架 「1个月、3个月、6个月」价格目标时间范围 提供不同投资周期的参考,增强实用性
自然输出 「以对话方式呈现您的分析,就像自然说话一样,不使用特殊格式」 输出将作为交易员的输入,自然语言格式便于后续处理

4.9 交易员(Trader)

文件: tradingagents/agents/trader/trader.py

交易员使用显式 System/User 消息列表,System 定义角色约束,User 传递投研结论。

4.9.1 System Message

您是一位专业的交易员,负责分析市场数据并做出投资决策。基于您的分析,请提供具体的买入、卖出或持有建议。

⚠️ 重要提醒:当前分析的股票代码是 {company_name},请使用正确的货币单位:{currency}({currency_symbol})

🔴 严格要求:
- 股票代码 {company_name} 的公司名称必须严格按照基本面报告中的真实数据
- 绝对禁止使用错误的公司名称或混淆不同的股票
- 所有分析必须基于提供的真实数据,不允许假设或编造
- **必须提供具体的目标价位,不允许设置为null或空值**

请在您的分析中包含以下关键信息:
1. **投资建议**: 明确的买入/持有/卖出决策
2. **目标价位**: 基于分析的合理目标价格({currency}) - 🚨 强制要求提供具体数值
   - 买入建议:提供目标价位和预期涨幅
   - 持有建议:提供合理价格区间(如:{currency_symbol}XX-XX)
   - 卖出建议:提供止损价位和目标卖出价
3. **置信度**: 对决策的信心程度(0-1之间)
4. **风险评分**: 投资风险等级(0-1之间,0为低风险,1为高风险)
5. **详细推理**: 支持决策的具体理由

🎯 目标价位计算指导:
- 基于基本面分析中的估值数据(P/E、P/B、DCF等)
- 参考技术分析的支撑位和阻力位
- 考虑行业平均估值水平
- 结合市场情绪和新闻影响
- 即使市场情绪过热,也要基于合理估值给出目标价

特别注意:
- 如果是中国A股(6位数字代码),请使用人民币(¥)作为价格单位
- 如果是美股或港股,请使用美元($)作为价格单位
- 目标价位必须与当前股价的货币单位保持一致
- 必须使用基本面报告中提供的正确公司名称
- **绝对不允许说"无法确定目标价"或"需要更多信息"**

请用中文撰写分析内容,并始终以'最终交易建议: **买入/持有/卖出**'结束您的回应以确认您的建议。

请不要忘记利用过去决策的经验教训来避免重复错误。以下是类似情况下的交易反思和经验教训: {past_memory_str}

4.9.2 User Message

Based on a comprehensive analysis by a team of analysts, here is an investment plan tailored for {company_name}. This plan incorporates insights from current technical market trends, macroeconomic indicators, and social media sentiment. Use this plan as a foundation for evaluating your next trading decision.

Proposed Investment Plan: {investment_plan}

Leverage these insights to make an informed and strategic decision.

设计亮点: User Message 使用英文,但 System 要求以中文输出,体现了接收英文格式化数据、输出中文分析报告的跨语言处理能力。注意交易员接收的是 investment_plan(投研经理的输出),而非四份原始报告,实现了信息的层层提炼。

Prompt 设计模式深度分析:

设计维度 实现方式 设计意图
System/User 分离 System 定义角色约束,User 传递投研结论 角色定义与任务内容分离,System 可复用于不同股票分析
跨语言处理 User Message 英文,System 要求中文输出 投研结论可能来自不同语言模型,统一输出中文确保一致性
结构化输出 强制包含投资建议、目标价位、置信度、风险评分、详细推理 为后续风险辩论和信号提取提供结构化字段
目标价强制 「🚨 强制要求提供具体数值」「绝对不允许说”无法确定目标价”」 交易员必须给出可执行的价格目标,不允许回避
货币适配 根据股票类型动态设置 {currency}{currency_symbol} A股用人民币、美股/港股用美元,确保价格单位正确
终止标记 「始终以’最终交易建议: 买入/持有/卖出‘结束」 为后续解析提供明确的信号提取锚点
记忆注入 {past_memory_str} 注入交易员专属 ChromaDB 记忆 从过往交易决策中学习,避免重复错误

4.10 风险委员会主席(Risk Judge)

文件: tradingagents/agents/managers/risk_manager.py

完整 Prompt(f-string 拼接,使用深度模型)

作为风险管理委员会主席和辩论主持人,您的目标是评估三位风险分析师——激进、中性和安全/保守——之间的辩论,并确定交易员的最佳行动方案。您的决策必须产生明确的建议:买入、卖出或持有。只有在有具体论据强烈支持时才选择持有,而不是在所有方面都似乎有效时作为后备选择。力求清晰和果断。

决策指导原则:
1. **总结关键论点**:提取每位分析师的最强观点,重点关注与背景的相关性。
2. **提供理由**:用辩论中的直接引用和反驳论点支持您的建议。
3. **完善交易员计划**:从交易员的原始计划**{trader_plan}**开始,根据分析师的见解进行调整。
4. **从过去的错误中学习**:使用**{past_memory_str}**中的经验教训来解决先前的误判,改进您现在做出的决策,确保您不会做出错误的买入/卖出/持有决定而亏损。

交付成果:
- 明确且可操作的建议:买入、卖出或持有。
- 基于辩论和过去反思的详细推理。

---

**分析师辩论历史:**
{history}

---

专注于可操作的见解和持续改进。建立在过去经验教训的基础上,批判性地评估所有观点,确保每个决策都能带来更好的结果。请用中文撰写所有分析内容和建议。

LLM 调用方式(含重试与兜底):

max_retries = 3
while retry_count < max_retries:
    try:
        response = llm.invoke(prompt)
        if response.content and len(response.content) > 10:
            break   # 成功,退出循环
    except Exception:
        pass
    retry_count += 1
    time.sleep(2)   # 重试间隔 2 秒

# 全部失败时的硬编码兜底机制

if not response_content:
    response_content = f"""**默认建议:持有**

由于技术原因无法生成详细分析,基于当前市场状况和风险控制原则,建议对{company_name}采取持有策略。

**理由:**
1. 市场信息不足,避免盲目操作
2. 保持现有仓位,等待更明确的市场信号
3. 控制风险,避免在不确定性高的情况下做出激进决策

**建议:**
- 密切关注市场动态和公司基本面变化
- 设置合理的止损和止盈位
- 等待更好的入场或出场时机

注意:此为系统默认建议,建议结合人工分析做出最终决策。"""

注意: 代码中 trader_plan 实际读取的是 state["investment_plan"](投研经理的输出),而非交易员的 trader_investment_plan,这意味着风险辩论三方针对的是投研经理结论,交易员的初步决策作为参考注入 Prompt 但不是风险辩论的直接评估对象。

Prompt 设计模式深度分析:

设计维度 实现方式 设计意图
深度模型 使用 deep_thinking_llm 最终决策需要综合风险辩论、历史记忆、投研结论,推理复杂度高
重试机制 max_retries=3,每次间隔 2 秒 最终决策节点不能轻易失败,重试机制确保系统稳健性
兜底策略 全部失败时返回硬编码「持有」建议 保底策略确保系统不崩溃,保守「持有」避免错误交易
明确决策 「您的决策必须产生明确的建议:买入、卖出或持有」 最终输出必须是可执行的交易指令
反默认持有 「只有在有具体论据强烈支持时才选择持有」 防止 LLM 倾向于安全但无信息量的「持有」,强制做出有信息量的判断
计划完善 「从交易员的原始计划开始,根据分析师的见解进行调整」 不是完全推翻交易员决策,而是在其基础上进行风险调整
记忆注入 {past_memory_str} 注入风险经理专属 ChromaDB 记忆 从过往风险判断中学习,避免重复错误决策
架构不对称 trader_plan 读取 state["investment_plan"](投研经理输出) 风险辩论针对投研结论而非交易员决策,交易员输出仅作参考

5. 多智能体交互流程深度分析

本章从系统层面分析智能体之间的状态传递、信息汇聚、辩论博弈和记忆系统的运作机制。

5.1 状态传递机制

所有智能体通过 LangGraph 共享状态(State) 进行通信,而非直接调用。这种松耦合设计的核心状态字段:

state {
  messages            → 所有智能体共享的消息历史(分析师阶段使用)
  market_report       → Market Analyst 输出,只写一次
  news_report         → News Analyst 输出,只写一次
  sentiment_report    → Social Analyst 输出,只写一次
  fundamentals_report → Fundamentals Analyst 输出,只写一次
  investment_debate_state {
    bull_history       → 多头累积发言记录
    bear_history       → 空头累积发言记录
    history            → 完整辩论历史
    current_response   → 最新一轮的对手发言
    judge_decision     → Research Manager 裁判结果(写入 investment_plan 前的中间字段)
    count              → 当前辩论轮次计数
  }
  investment_plan     → Research Manager 的综合结论
  trader_investment_plan → Trader 的初步决策
  risk_debate_state {
    risky_history          → 激进分析师累积发言
    safe_history           → 保守分析师累积发言
    neutral_history        → 中性分析师累积发言
    history                → 完整风险辩论历史
    latest_speaker         → 最近一次发言的分析师标识
    current_risky_response → 激进分析师最新辩论
    current_safe_response  → 保守分析师最新辩论
    current_neutral_response → 中性分析师最新辩论
    judge_decision         → Risk Judge 裁判结果(写入 final_trade_decision 前的中间字段)
    count                  → 当前辩论轮次计数
  }
  final_trade_decision → Risk Judge 的最终决策文本
}

关键设计: 每个阶段的输出作为只读输入传递给下一阶段,后置阶段的智能体可以读取前置阶段的全部报告,但不能修改已写入的报告内容。

5.2 阶段间信息汇聚模式

阶段一(并行信息收集)→ 阶段二(辩论整合)→ 阶段三(决策收敛)

                     四份报告同时注入
Market Report ──────┐
News Report ────────┤──→ Bull/Bear Researcher Prompt
Sentiment Report ───┤      (接收全部四份报告)
Fundamentals Report ┘

信息汇聚点: 多头和空头研究员是系统中第一个接收所有前置输出的节点,它们的任务是从四份独立报告中提取支持己方立场的证据。这种设计迫使研究员进行跨维度综合,而非只看单一数据。

5.3 辩论机制的博弈设计

投研辩论的核心是轮流发言 + 上下文累积的博弈机制:

Round 1:
  Bull: [基于四份报告] 给出看涨论点 A
  Bear: [基于四份报告 + Bull论点A] 给出看跌反驳 B

Round 2:
  Bull: [基于四份报告 + 历史记录(A+B) + Bear最新论点B] 给出强化论点 C
  Bear: [基于四份报告 + 历史记录(A+B+C) + Bull最新论点C] 给出强化反驳 D

...(重复 N 轮,N 由 research_depth 决定)

Research Manager: [阅读完整辩论历史 A+B+C+D+...] 输出综合结论

博弈有效性: 随轮次增加,双方论点逐渐收敛到关键争议点,Research Manager 接收到的是经过充分辩论后的精华观点,而非仅仅是两方的初始立场。

5.4 双重裁判结构

系统设计了两层裁判机制,分别针对投资价值风险管理两个维度:

第一层裁判:Research Manager(投研价值判断)
  输入:多空辩论完整历史
  职责:判断投资逻辑的合理性
  模型:深度模型(需要强推理能力)
  输出:投研结论(investment_plan)

              ↓ 传递给 Trader 生成初步决策

第二层裁判:Risk Judge(风险约束)
  输入:风险辩论完整历史 + Trader 初步决策
  职责:在投研结论基础上叠加风险过滤
  模型:深度模型
  输出:最终决策(final_trade_decision)

两层裁判的意义: 投资价值和风险控制是两个相对独立的维度。一个股票可能有很好的投资价值(Research Manager 看好),但当前风险过高(Risk Judge 建议保守)。两层裁判允许系统在这两个维度上独立推理,最终输出是两者综合的结果。

5.5 ChromaDB 记忆系统的跨分析周期影响

系统中有五个独立的 ChromaDB 记忆模块,各自服务不同的智能体:

ChromaDB 记忆独立性:
  bull_memory    → 多头研究员专属
  bear_memory    → 空头研究员专属
  trader_memory  → 交易员专属
  invest_memory  → 投研经理专属
  risk_memory    → 风险经理专属

记忆注入时机: 在每次分析时,这些记忆作为 {past_memory_str} 字段注入到对应智能体的 Prompt 中。分析结束后,Reflector 将本次决策的经验写回 ChromaDB,形成经验积累闭环

有效性分析: 历史记忆的引入使智能体能从过去类似情况中学习,理论上随着分析次数增加,决策质量应持续提升。但记忆质量依赖于反思(Reflection)的准确性,这是系统长期效果的关键变量。


6. 流程有效性评估

基于前述分析,本章从设计亮点和潜在局限性两个角度评估整体流程的有效性。

6.1 设计亮点

以下从四个维度总结系统的核心设计优势:

  • 信息覆盖的完整性:四位分析师覆盖技术面、基本面、新闻面、情绪面四个维度,相互独立且互补,避免了单一视角的盲区。
  • 对立论证的合理性:多头/空头的辩论机制模拟了真实投资委员会的决策流程,通过强制生成对立观点,降低了分析结论的片面性风险。
  • 分层决策的鲁棒性:两层裁判(Research Manager + Risk Judge)将”值不值得投资”和”现在适不适合投资”分离处理,使最终决策在投资价值和风险控制上都有独立的充分论证。
  • 工程层面的稳健性:工具调用次数硬性上限(3 次)防止无限循环;Risk Judge 的 3 次重试 + “持有”兜底确保系统不崩溃;数据源降级链(AkShare → Tushare → BaoStock)确保数据可用性。

6.2 潜在局限性

以下是当前架构中值得关注的局限性:

  • 顺序执行的效率损失:四位分析师在流程上顺序执行(Market → Social → News → Fundamentals,默认顺序可通过 selected_analysts 参数配置),而非并行。由于每个分析师在分析阶段不依赖其他分析师的输出,顺序执行带来了不必要的等待时间。
  • 辩论深度与成本的权衡:辩论轮次(research_depth)越高,分析质量越好,但 Token 消耗成倍增加。在 research_depth=1(最小)时,多头/空头各只发言一次,辩论深度有限;在 research_depth=5(最大)时,成本显著上升。
  • Prompt 的精英偏差:多数分析师的 Prompt 要求”立即给出建议”,禁止”无法确定”的回答。这种强制确定性在真实市场信息不足时可能产生过度自信的输出。
  • 记忆系统的初始冷启动:ChromaDB 记忆在系统刚部署时为空,历史经验积累需要时间。在早期分析阶段,{past_memory_str} 注入的是空内容,记忆增强效果不显著。
  • 信号提取的结构化依赖SignalProcessor 依靠 LLM 从自由文本中提取结构化字段(action/target_price/confidence/risk_score),这个步骤本身引入了额外的解析不确定性。如果 Risk Judge 的输出格式不规范,信号提取可能失败或产生错误字段值。

7. 多智能体交互的核心设计原则总结

通过以上分析,TradingAgents-CN 的多智能体系统遵循以下核心设计原则:

原则 具体体现
职责单一 每个智能体只负责一个子任务,不跨越职责边界
信息隔离 分析师阶段不读取其他分析师的报告,保持信息独立性
对立制衡 多头/空头、激进/保守/中性三角制衡,防止单方面偏见
分层裁决 深度模型只用于综合裁判节点,快速模型用于数据处理节点
强制确定性 Prompt 层面禁止回避性输出,确保每个节点产出可用的结论
经验积累 ChromaDB 记忆系统引入跨分析周期的经验积累机制
失败容错 多层兜底机制(硬性上限、重试、默认值)保障系统稳健性

免责声明: TradingAgents-CN 是学习和研究平台,所有分析结果不构成任何投资建议。