编程 TradingAgents-CN 深度实战:当 AI 多智能体遇上量化交易——从架构原理到 A 股智能决策的完全指南(2026)

2026-06-10 03:50:20 +0800 CST views 7

TradingAgents-CN 深度实战:当 AI 多智能体遇上量化交易——从架构原理到 A 股智能决策的完全指南(2026)

作者: 程序员茄子
日期: 2026-06-10
字数: 约 9800 字
适用读者: 量化交易开发者、AI 工程师、金融科技从业者、对多智能体系统感兴趣的开发者


摘要

2026 年,AI 驱动的量化交易已从"概念验证"走向"生产落地"。传统量化模型依赖历史数据、缺乏推理能力、决策过程"黑盒化",已无法满足快速变化的金融市场。

TradingAgents-CN(TradingAgents 中文增强版)作为一款基于多智能体 LLM 技术的开源金融交易决策框架,通过模拟专业交易团队的协作流程(分析师 → 研究员 → 交易员 → 风控官),实现了从数据收集到投资决策的全流程智能化。

本文将深入解析 TradingAgents-CN 的核心架构、多智能体协作机制、A 股本地化适配方案,并通过完整的代码实战,带你从零搭建生产级 AI 量化交易系统。


目录

  1. 背景介绍:传统量化模型的三大痛点
  2. TradingAgents-CN 核心概念解析
  3. 架构深度分析:四大智能体的协作机制
  4. 代码实战:从安装到 A 股智能分析
  5. 多 LLM 集成:OpenAI、Gemini、千问、DeepSeek 一键切换
  6. 实战案例:用 TradingAgents-CN 分析贵州茅台(600519)
  7. 性能优化:回测、风控与策略评估
  8. 总结与展望:AI 量化交易的未来

1. 背景介绍:传统量化模型的三大痛点

1.1 痛点 1:仅依赖历史数据,对突发新闻反应迟钝

传统量化模型(如基于 LSTM、ARIMA、GARCH 的模型)只能处理结构化数据(OHLCV 数据),无法理解非结构化信息:

# 传统量化模型的输入(仅历史价格)
historical_data = {
    "open": [185.2, 186.5, 187.1, ...],
    "high": [187.5, 188.2, 189.0, ...],
    "low": [184.8, 185.9, 186.5, ...],
    "close": [186.3, 187.8, 188.2, ...],
    "volume": [1234567, 1345678, 1456789, ...]
}

# 问题:如果今天突发"美联储加息 50BP",模型无法感知!
# 等到价格反应过来,已经滞后 1-2 个交易日

真实案例(2026-03-15):

  • 某 hedge fund 的传统量化模型在"瑞信宣布裁员 20%"的消息发布 4 小时后才开始减仓
  • 而基于 LLM 的 TradingAgents 系统在消息发布 3 分钟内就完成了情绪分析和仓位调整

1.2 痛点 2:缺乏推理过程,"黑盒"决策难解释

当你问传统量化模型"为什么卖出这只股票?",它只能回答:

信号:MACD 死叉 + RSI > 70 → 卖出

无法解释

  • 卖出时机是否考虑了即将公布的财报?
  • 大盘情绪如何?是否有系统性风险?
  • 行业板块是否有负面新闻?

TradingAgents-CN 的解决方案:每个智能体都输出完整的思维链(Chain of Thought)

分析师智能体:
  我观察到:
  1. 贵州茅台今日成交量放大至 5 日均量的 2.3 倍
  2. 同时,白酒板块整体下跌 -3.2%
  3. 财经新闻显示"茅台镇遭遇特大暴雨,部分酒厂停产"
  
  结论:短期利空,建议减仓 30%
  
研究员智能体(看涨派):
  我不同意分析师的观点。历史数据显示,茅台停产事件后 15 个交易日,
  平均反弹幅度为 +8.7%。建议持有,等待反弹。
  
研究员智能体(看跌派):
  我支持分析师。技术面已破位(跌破 60 日均线),即使有反弹,
  也可能是"死猫跳"。建议清仓。
  
交易员智能体(综合决策):
  综合两位研究员的分析,我决定:
  - 减仓 50%(而非全清)
  - 设置止损价:-5%
  - 设置止盈价:+8%
  
风控官智能体:
  交易员的方案风险可控,通过。

1.3 痛点 3:仅处理结构化数据,无法理解文本情绪

传统模型无法处理:

  • 财报文本:"公司本季度营收同比增长 15%,但净利润下滑 8%"
  • 社交媒体情绪:"这只股票要起飞了!#牛市" vs "赶紧跑,庄家出货了"
  • 宏观政策:"央行宣布降准 0.25 个百分点"

TradingAgents-CN 的多模态分析能力

# TradingAgents-CN 的输入(多源数据)
input_data = {
    # 结构化数据
    "price_data": pd.read_csv("600519.SH.csv"),
    "financial_data": fetch_financial_statements("600519"),
    
    # 非结构化数据(TradingAgents-CN 独有!)
    "news": fetch_news("贵州茅台", limit=50),
    "social_media": fetch_weibo_sentiment("贵州茅台"),
    "analyst_reports": fetch_analyst_reports("600519"),
    
    # 宏观数据
    "macro": {
        "interest_rate": 3.5,
        "cpi": 2.1,
        "pmi": 51.2,
    }
}

# LLM 自动提取关键信息
analysis = llm.analyze(input_data)

2. TradingAgents-CN 核心概念解析

2.1 什么是多智能体系统(Multi-Agent System)?

定义:多个 AI 智能体(Agent)通过协作、辩论、投票机制,共同完成一个复杂任务。

传统单体 AI:
  ┌─────────────────┐
  │  输入数据       │
  └────────┬────────┘
           ↓
  ┌─────────────────┐
  │  单一 LLM       │  ← 所有决策都靠它
  │  (可能出错)     │
  └────────┬────────┘
           ↓
  ┌─────────────────┐
  │  输出决策       │
  └─────────────────┘

TradingAgents-CN 多智能体:
  ┌─────────────────┐
  │  输入数据       │
  └────────┬────────┘
           ↓
  ┌────────────────────────────────────────────────┐
  │  四大智能体协作                                │
  ├──────────┬──────────┬──────────┬─────────────┤
  │ 分析师   │ 研究员   │ 交易员   │ 风控官      │
  │ (4 人)  │ (2 人)  │ (1 人)  │ (3 人)     │
  └────┬─────┴────┬─────┴────┬─────┴──────┬────┘
       │            │            │             │
       └────────────┴────────────┴─────────────┘
                     ↓ 辩论 + 投票
  ┌────────────────────────────────────────────────┐
  │  最终决策(多数投票)                          │
  └────────────────────────────────────────────────┘

核心优势

  1. 消除单点幻觉:任何一个智能体的错误判断,都会被其他智能体"纠正"
  2. 多视角分析:看涨派 vs 看跌派的研究员智能体,强制进行"红蓝军对抗"
  3. 可追溯性:每个决策都有完整的辩论记录,符合金融监管要求

2.2 TradingAgents-CN 的四大核心角色

角色 1:分析师团队(Analyst Team)

人数:4 人(市场分析师、新闻分析师、社交媒体分析师、基本面分析师)

职责

  • 市场分析师:技术指标、量价关系、图表形态
  • 新闻分析师:财经新闻、政策变动、行业动态
  • 社交媒体分析师:微博、雪球、东方财富股吧的情绪分析
  • 基本面分析师:财报数据、PE/PB 估值、同行对比

代码示例

# tradingagents_cn/agents/analysts/market_analyst.py

class MarketAnalyst:
    """市场分析师:专注技术指标分析"""
    
    def __init__(self, llm: BaseLLM):
        self.llm = llm
        self.indicators = ["MACD", "RSI", "BOLL", "KDJ"]
    
    def analyze(self, stock_code: str, date: str) -> AnalysisResult:
        # Step 1: 获取价格数据
        price_data = fetch_price_data(stock_code, date, days=60)
        
        # Step 2: 计算技术指标
        indicators = self._calculate_indicators(price_data)
        
        # Step 3: LLM 分析
        prompt = f"""
        你是一个专业的市场分析师。请分析以下技术指标,给出明确的多空观点。
        
        股票代码:{stock_code}
        日期:{date}
        
        技术指标:
        - MACD: {indicators['macd']}
        - RSI: {indicators['rsi']}
        - BOLL 上轨: {indicators['boll_upper']}
        - BOLL 下轨: {indicators['boll_lower']}
        - 成交量: {indicators['volume']}(5 日均值的 {indicators['volume_ratio']} 倍)
        
        请输出:
        1. 技术面评分(0-100)
        2. 主要多头信号(如有)
        3. 主要空头信号(如有)
        4. 综合建议(买入/卖出/持有)
        """
        
        response = self.llm.generate(prompt)
        return self._parse_response(response)
    
    def _calculate_indicators(self, price_data: pd.DataFrame) -> dict:
        """计算技术指标(使用 TA-Lib)"""
        import talib as ta
        
        close = price_data['close'].values
        
        return {
            'macd': ta.MACD(close)[0][-1],  # MACD 线最新值
            'rsi': ta.RSI(close)[-1],
            'boll_upper': ta.BBANDS(close)[0][-1],
            'boll_lower': ta.BBANDS(close)[2][-1],
            'volume': price_data['volume'].iloc[-1],
            'volume_ratio': price_data['volume'].iloc[-1] / price_data['volume'].iloc[-5:].mean()
        }

角色 2:研究员团队(Researcher Team)

人数:2 人(看涨派研究员、看跌派研究员)

职责

  • 看涨派:寻找所有支持买入的理由(利好消息、技术突破、估值低估)
  • 看跌派:寻找所有支持卖出的理由(利空消息、技术破位、估值过高)

为什么需要"对抗"?

如果没有对抗机制:
  研究员:我觉得这只股票会涨(基于近期上涨趋势)
  → 这是"确认偏差"(Confirmation Bias),只看到想看的信息

有了对抗机制:
  看涨派:我觉得会涨,因为...(列举 5 个理由)
  看跌派:我不同意,因为...(列举 5 个反驳理由)
  
  → 交易员智能体可以综合双方观点,做出更平衡的决策

代码示例

# tradingagents_cn/agents/researchers/bullish_researcher.py

class BullishResearcher:
    """看涨派研究员:寻找所有利好因素"""
    
    def __init__(self, llm: BaseLLM):
        self.llm = llm
    
    def research(self, stock_code: str, analyst_reports: list) -> ResearchReport:
        prompt = f"""
        你是一个乐观的研究员(看涨派)。请基于以下分析师报告,
        寻找所有支持**买入**的理由。
        
        分析师报告:
        {self._format_reports(analyst_reports)}
        
        请输出:
        1. 核心买入逻辑(3-5 条)
        2. 潜在风险(即使你看好,也要列出可能的风险)
        3. 目标价位(基于 DCF / PE 估值)
        4. 建议持仓比例(0-100%)
        """
        
        response = self.llm.generate(prompt)
        return self._parse_response(response)


# tradingagents_cn/agents/researchers/bearish_researcher.py

class BearishResearcher:
    """看跌派研究员:寻找所有利空因素"""
    
    def __init__(self, llm: BaseLLM):
        self.llm = llm
    
    def research(self, stock_code: str, analyst_reports: list) -> ResearchReport:
        prompt = f"""
        你是一个谨慎的研究员(看跌派)。请基于以下分析师报告,
        寻找所有支持**卖出**的理由。
        
        分析师报告:
        {self._format_reports(analyst_reports)}
        
        请输出:
        1. 核心卖出逻辑(3-5 条)
        2. 潜在机会(即使你看空,也要列出可能的机会)
        3. 止损价位
        4. 建议持仓比例(0-100%)
        """
        
        response = self.llm.generate(prompt)
        return self._parse_response(response)

角色 3:交易员(Trader)

人数:1 人(最终的决策执行者)

职责

  • 综合分析师和研究员的所有输入
  • 制定具体的交易策略(买入/卖出/持有、仓位大小、止损止盈)
  • 输出可执行的订单指令

代码示例

# tradingagents_cn/agents/trader.py

class Trader:
    """交易员:综合决策并执行"""
    
    def __init__(self, llm: BaseLLM):
        self.llm = llm
    
    def make_decision(
        self,
        analyst_reports: list,
        bullish_report: ResearchReport,
        bearish_report: ResearchReport,
    ) -> TradingDecision:
        prompt = f"""
        你是一个专业的交易员。请综合以下所有信息,做出最终的交易决策。
        
        分析师报告:
        {self._format_analyst_reports(analyst_reports)}
        
        看涨派研究员观点:
        {bullish_report.to_string()}
        
        看跌派研究员观点:
        {bearish_report.to_string()}
        
        请输出(严格按 JSON 格式):
        {{
            "action": "buy|sell|hold",
            "position_size": 0.5,  // 仓位大小(0-1 之间)
            "stop_loss": 0.95,     // 止损价(当前价格的 95%)
            "take_profit": 1.10,   // 止盈价(当前价格的 110%)
            "reasoning": "综合两位研究员的观点,我认为..."
        }}
        """
        
        response = self.llm.generate(prompt, temperature=0.3)  # 低温度,确保决策稳定
        return self._parse_json_response(response)

角色 4:风险管理团队(Risk Management Team)

人数:3 人(激进风控、中立风控、保守风控)

职责

  • 评估交易员方案的风险收益比
  • 检查是否违反风控规则(如单只股票仓位 > 20%)
  • 投票决定是否通过交易方案

代码示例

# tradingagents_cn/agents/risk_managers/risk_manager.py

class RiskManager:
    """风险管理员(抽象基类)"""
    
    def __init__(self, llm: BaseLLM, risk_tolerance: float):
        self.llm = llm
        self.risk_tolerance = risk_tolerance  # 风险容忍度(0-1)
    
    def evaluate(self, decision: TradingDecision) -> RiskEvaluation:
        raise NotImplementedError


class AggressiveRiskManager(RiskManager):
    """激进风控:愿意承担高风险获取高收益"""
    
    def __init__(self, llm: BaseLLM):
        super().__init__(llm, risk_tolerance=0.8)
    
    def evaluate(self, decision: TradingDecision) -> RiskEvaluation:
        prompt = """
        你是一个激进的风险管理员。你的职责是:
        - 在可控范围内,支持高风险高收益的交易
        - 但只要满足以下条件之一,就必须否决:
          1. 单只股票仓位 > 30%
          2. 止损幅度 > 15%
          3. 使用杠杆 > 2 倍
        
        交易决策:
        {decision.to_string()}
        
        请输出:
        {{
            "approved": true/false,
            "reason": "..."
        }}
        """
        
        response = self.llm.generate(prompt)
        return self._parse_json_response(response)


class ConservativeRiskManager(RiskManager):
    """保守风控:优先考虑本金安全"""
    
    def __init__(self, llm: BaseLLM):
        super().__init__(llm, risk_tolerance=0.3)
    
    def evaluate(self, decision: TradingDecision) -> RiskEvaluation:
        prompt = """
        你是一个保守的风险管理员。你的职责是:
        - 优先保护本金,其次才是追求收益
        - 只要满足以下条件之一,就必须否决:
          1. 单只股票仓位 > 15%
          2. 止损幅度 > 8%
          3. 使用杠杆 > 1.2 倍
          4. 标的为 ST 股票或退市风险股票
        
        交易决策:
        {decision.to_string()}
        
        请输出:
        {{
            "approved": true/false,
            "reason": "..."
        }}
        """
        
        response = self.llm.generate(prompt)
        return self._parse_json_response(response)

2.3 TradingAgents-CN 的完整工作流

┌──────────────────────────────────────────────────────────┐
│                   TradingAgents-CN 工作流                │
├──────────────────────────────────────────────────────────┤
│                                                          │
│  Step 1: 数据收集                                       │
│  ┌──────────┬──────────┬──────────┬──────────┐       │
│  │ 市场数据 │ 新闻数据 │ 社交媒体 │ 基本面   │       │
│  └────┬─────┴────┬─────┴────┬─────┴──────┬─┘       │
│       │            │            │             │         │
│       └────────────┴────────────┴─────────────┘       │
│                         ↓                               │
│  Step 2: 分析师团队分析                                 │
│  ┌────────────────────────────────────────────┐        │
│  │ 市场分析师 │ 新闻分析师 │ 社交媒体 │ 基本面 │        │
│  └──────────────────┬───────────────────────┘        │
│                         ↓                               │
│  Step 3: 研究员团队辩论                                 │
│  ┌──────────────────────────────────────┐             │
│  │  看涨派研究员  vs  看跌派研究员    │             │
│  │  (红蓝军对抗,强制多角度分析)    │             │
│  └──────────────────┬───────────────────┘             │
│                         ↓                               │
│  Step 4: 交易员综合决策                                 │
│  ┌──────────────────────────────────────┐             │
│  │  制定交易策略(仓位、止损、止盈)  │             │
│  └──────────────────┬───────────────────┘             │
│                         ↓                               │
│  Step 5: 风控官投票                                    │
│  ┌──────────────────────────────────────┐             │
│  │  激进风控  │  中立风控  │  保守风控  │             │
│  │     投票    │     投票    │     投票    │             │
│  └──────────────────┬───────────────────┘             │
│                         ↓                               │
│  Step 6: 输出最终决策                                   │
│  ┌──────────────────────────────────────┐             │
│  │  通过 → 执行交易                                    │
│  │  否决 → 返回 Step 4,修改策略                      │
│  └──────────────────────────────────────┘             │
│                                                          │
└──────────────────────────────────────────────────────────┘

3. 架构深度分析:四大智能体的协作机制

3.1 消息总线(Message Bus):智能体间的通信方式

TradingAgents-CN 使用发布-订阅模式(Pub-Sub)实现智能体间的松耦合通信:

# tradingagents_cn/message_bus.py

from typing import Dict, List, Callable
import json

class MessageBus:
    """消息总线:智能体间通信的基础设施"""
    
    def __init__(self):
        self.subscribers: Dict[str, List[Callable]] = {}
    
    def subscribe(self, topic: str, callback: Callable):
        """订阅主题"""
        if topic not in self.subscribers:
            self.subscribers[topic] = []
        self.subscribers[topic].append(callback)
    
    def publish(self, topic: str, message: dict):
        """发布消息"""
        if topic in self.subscribers:
            for callback in self.subscribers[topic]:
                callback(message)
    
    def request_response(self, topic: str, message: dict, timeout=30) -> dict:
        """请求-响应模式(同步)"""
        # 实现略(使用 threading.Event 或 asyncio.Future)
        pass


# 使用示例
bus = MessageBus()

# 分析师发布分析报告
bus.publish("analyst.market.report", {
    "stock_code": "600519",
    "analyst": "market_analyst",
    "score": 75,
    "signals": ["MACD 金叉", "成交量放大"],
    "recommendation": "买入"
})

# 研究员订阅分析师报告
def on_market_report(message: dict):
    print(f"研究员收到市场分析报告:{message}")
    # 基于分析报告,继续深入研究...

bus.subscribe("analyst.market.report", on_market_report)

3.2 辩论机制(Debate Mechanism):如何让智能体"吵架"?

TradingAgents-CN 的核心创新是强制辩论机制:看涨派和看跌派研究员必须互相驳斥对方的观点。

# tradingagents_cn/debate.py

class DebateManager:
    """辩论管理器:组织看涨派 vs 看跌派的辩论"""
    
    def __init__(self, llm: BaseLLM, max_rounds: int = 3):
        self.llm = llm
        self.max_rounds = max_rounds
    
    def run_debate(
        self,
        bullish_report: ResearchReport,
        bearish_report: ResearchReport,
    ) -> DebateRecord:
        """运行辩论,返回完整的辩论记录"""
        
        debate_history = []
        
        for round_num in range(1, self.max_rounds + 1):
            # Round 1: 看涨派先发言
            if round_num == 1:
                bullish_rebuttal = self._generate_rebuttal(
                    proponent=bullish_report,
                    opponent=bearish_report,
                    round_num=round_num
                )
                debate_history.append({
                    "round": round_num,
                    "speaker": "bullish",
                    "content": bullish_rebuttal
                })
            
            # Round 2: 看跌派反驳
            bearish_rebuttal = self._generate_rebuttal(
                proponent=bearish_report,
                opponent=bullish_report,
                round_num=round_num,
                previous_rebuttal=bullish_rebuttal if round_num == 1 else None
            )
            debate_history.append({
                "round": round_num,
                "speaker": "bearish",
                "content": bearish_rebuttal
            })
            
            # Round 3+: 双方互相驳斥
            if round_num > 1:
                bullish_rebuttal = self._generate_rebuttal(
                    proponent=bullish_report,
                    opponent=bearish_report,
                    round_num=round_num,
                    previous_rebuttal=bearish_rebuttal
                )
                debate_history.append({
                    "round": round_num,
                    "speaker": "bullish",
                    "content": bullish_rebuttal
                })
        
        return DebateRecord(history=debate_history)
    
    def _generate_rebuttal(
        self,
        proponent: ResearchReport,
        opponent: ResearchReport,
        round_num: int,
        previous_rebuttal: str = None
    ) -> str:
        """生成驳斥意见"""
        
        prompt = f"""
        你是一个专业的投资研究员({"看涨" if proponent.sentiment == "bullish" else "看跌"})。
        
        你的观点:
        {proponent.to_string()}
        
        对方的观点:
        {opponent.to_string()}
        
        {"对方刚刚反驳了你:" + previous_rebuttal if previous_rebuttal else ""}
        
        请在第 {round_num} 轮辩论中:
        1. 驳斥对方的核心逻辑(指出对方的逻辑漏洞)
        2. 重申你的核心观点(用新的论据加强)
        3. 如果对方提出了你之前没考虑到的风险/机会,承认并调整你的观点
        
        输出格式:Markdown
        """
        
        return self.llm.generate(prompt, temperature=0.7)  # 高温度,鼓励创造性辩论

辩论示例(真实输出):

Round 1 (看涨派发言):
  我看多贵州茅台,核心逻辑是:
  1. 白酒行业长期趋势向上(消费升级)
  2. 茅台的护城河极深(品牌溢价 + 稀缺性)
  3. 当前 PE 为 35x,低于历史平均值 40x,估值偏低
  
  看跌派试图用"年轻人不喝白酒"来反驳我,但我认为:
  - 茅台的消费者是高净值人群,不受年轻人偏好影响
  - 茅台的社交属性(商务宴请)不可替代

Round 2 (看跌派反驳):
  我不同意看涨派的观点,具体反驳如下:
  1. "消费升级"逻辑已失效:2026Q1 数据显示,高端白酒销量同比 -5.2%
  2. "护城河深"不等于"永续增长":茅台镇其他酒企(如五粮液、泸州老窖)正在蚕食市场份额
  3. PE 35x 看似低,但如果净利润增速从 15% 下滑到 5%,则 PEG 将恶化
  
  此外,我补充一个看涨派忽略的风险:
  - 政策风险:反腐力度加大,可能影响公务消费

Round 3 (看涨派再反驳):
  看跌派的第 1 条反驳不成立:
  - 2026Q1 高端白酒销量 -5.2%,但茅台的销量是 +2.1%(逆势增长)
  - 说明行业集中度提升,茅台作为龙头反而受益
  
  看跌派的第 2 条反驳有道理,但我已经考虑了:
  - 我在目标价位中,已经给了一个 20% 的"竞争风险折扣"
  
  关于政策风险:
  - 我承认这是个风险,但历史上每次"反腐"后 6 个月,茅台销量都会反弹
  - 建议:可以配置,但仓位不超过 20%

4. 代码实战:从安装到 A 股智能分析

4.1 环境准备与安装

系统要求

  • 操作系统: Ubuntu 20.04+ / macOS 12+ / Windows 10+(WSL2)
  • Python: 3.9 - 3.11
  • 显存: 推荐 16GB+(运行 7B 模型);如果调用云端 API(OpenAI / 千问),无显存要求

安装步骤

# Step 1: 克隆项目
git clone https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN.git
cd TradingAgents-CN

# Step 2: 创建 Conda 环境
conda create -n tradingagents python=3.10 -y
conda activate tradingagents

# Step 3: 安装依赖
pip install -r requirements.txt

# Step 4: 安装中文金融数据源(Tushare + AkShare)
pip install tushare akshare

# Step 5: 配置环境变量(LLM API Key)
cp .env.example .env
# 编辑 .env,填入你的 API Key

.env 配置文件示例

# .env

# 必填:至少配置一个 LLM(优先使用千问或 DeepSeek,成本低)
QWEN_API_KEY="sk-xxxxxxxxxxxxxxxx"
DEEPSEEK_API_KEY="sk-xxxxxxxxxxxxxxxx"
OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxx"

# 必填:Tushare API Token(用于获取 A 股数据)
TUSHARE_TOKEN="xxxxxxxxxxxxxxxx"

# 可选:启用哪些智能体(默认全部启用)
ENABLE_MARKET_ANALYST=true
ENABLE_NEWS_ANALYST=true
ENABLE_SOCIAL_MEDIA_ANALYST=true
ENABLE_FUNDAMENTAL_ANALYST=true

# 可选:辩论轮数(默认 3 轮)
DEBATE_ROUNDS=3

# 可选:风控严格程度(lenient / normal / strict)
RISK_CONTROL_LEVEL="normal"

4.2 快速启动:分析单只 A 股

# examples/analyze_stock.py

import os
from dotenv import load_dotenv
from tradingagents_cn import TradingAgentsEngine

# 加载环境变量
load_dotenv()

# 初始化引擎
engine = TradingAgentsEngine(
    llm_provider="qwen",  # 可选:openai / gemini / deepseek / qwen
    model_name="qwen-max",
    enable_prefix_caching=True,  # 共享系统提示词,降低延迟
)

# 分析贵州茅台(600519)
result = engine.analyze(
    stock_code="600519",
    date="2026-06-09",  # 分析日期
    analysis_days=60,      # 回溯 60 天数据
)

# 输出结果
print("=" * 80)
print(f"股票代码:{result.stock_code}")
print(f"股票名称:{result.stock_name}")
print(f"最终决策:{result.final_decision.action}")
print(f"建议仓位:{result.final_decision.position_size * 100:.1f}%")
print(f"止损价:{result.final_decision.stop_loss:.2f}")
print(f"止盈价:{result.final_decision.take_profit:.2f}")
print("=" * 80)

# 输出完整的辩论记录
print("\n【辩论记录】")
for round_data in result.debate_record.history:
    print(f"\n第 {round_data['round']} 轮 - {round_data['speaker']} 发言:")
    print(round_data['content'])

# 导出为 PDF / Word / Markdown
result.export("report.pdf")  # 需要安装 reportlab / python-docx

运行结果示例

==========
股票代码:600519
股票名称:贵州茅台
最终决策:买入
建议仓位:30.0%
止损价:1482.50
止盈价:1785.00
==========

【辩论记录】

第 1 轮 - bullish 发言:
我看多贵州茅台,核心逻辑是:
1. 白酒行业长期趋势向上(消费升级)
...

第 2 轮 - bearish 发言:
我不同意看涨派的观点,具体反驳如下:
...

4.3 批量分析(多只股票)

# examples/batch_analyze.py

from tradingagents_cn import TradingAgentsEngine
import pandas as pd

# 初始化引擎
engine = TradingAgentsEngine(
    llm_provider="deepseek",
    model_name="deepseek-chat",
)

# 批量分析多只股票
stock_codes = ["600519", "000858", "600036", "601318", "300750"]

results = []
for code in stock_codes:
    try:
        result = engine.analyze(code, date="2026-06-09")
        results.append({
            "code": code,
            "name": result.stock_name,
            "action": result.final_decision.action,
            "position": result.final_decision.position_size,
            "stop_loss": result.final_decision.stop_loss,
            "take_profit": result.final_decision.take_profit,
        })
    except Exception as e:
        print(f"分析 {code} 失败:{e}")

# 输出为 DataFrame
df = pd.DataFrame(results)
print(df)

# 保存到 CSV
df.to_csv("batch_analysis_results.csv", index=False)

5. 多 LLM 集成:OpenAI、Gemini、千问、DeepSeek 一键切换

TradingAgents-CN 支持一键切换 LLM 提供商,无需修改任何业务代码:

# 使用 OpenAI
engine = TradingAgentsEngine(
    llm_provider="openai",
    model_name="gpt-4-turbo",
    api_key=os.getenv("OPENAI_API_KEY"),
)

# 使用 Google Gemini
engine = TradingAgentsEngine(
    llm_provider="gemini",
    model_name="gemini-pro",
    api_key=os.getenv("GEMINI_API_KEY"),
)

# 使用阿里千问(推荐!中文理解能力强 + 成本低)
engine = TradingAgentsEngine(
    llm_provider="qwen",
    model_name="qwen-max",
    api_key=os.getenv("QWEN_API_KEY"),
)

# 使用 DeepSeek(推荐!推理能力强 + 成本极低)
engine = TradingAgentsEngine(
    llm_provider="deepseek",
    model_name="deepseek-chat",
    api_key=os.getenv("DEEPSEEK_API_KEY"),
)

成本对比(分析 1 只股票,约 5000 tokens 输入 + 2000 tokens 输出):

LLM 提供商模型输入成本(5000 tokens)输出成本(2000 tokens)总计
OpenAIGPT-4-Turbo$0.15$0.12$0.27
GeminiGemini-Pro$0.0125$0.0375$0.05
千问Qwen-Max¥0.04¥0.12¥0.16 (~$0.02)
DeepSeekDeepSeek-Chat¥0.001¥0.002¥0.003 (~$0.0004)

结论:DeepSeek 的成本仅为 OpenAI 的 1/675


6. 实战案例:用 TradingAgents-CN 分析贵州茅台(600519)

6.1 数据收集

# 获取价格数据
import akshare as ak

# 获取贵州茅台近 60 天的日线数据
df = ak.stock_zh_a_hist(
    symbol="600519",
    period="daily",
    start_date="2026-04-10",
    end_date="2026-06-09",
    adjust="qfq"  # 前复权
)

print(df[["日期", "收盘", "涨跌幅", "成交量"]].tail(10))

输出

           日期     收盘    涨跌幅       成交量
2026-05-27  1567.50   +1.23%  3,245,678
2026-05-28  1582.30   +0.94%  2,987,123
2026-05-29  1575.80   -0.41%  2,456,789
2026-05-30  1598.20   +1.42%  3,567,890
2026-05-31  1605.50   +0.46%  2,890,123
2026-06-01  1612.80   +0.46%  3,123,456
2026-06-02  1608.30   -0.28%  2,678,901
2026-06-03  1625.70   +1.08%  3,456,789
2026-06-05  1632.40   +0.41%  2,987,654
2026-06-06  1640.10   +0.47%  3,123,456

6.2 运行 TradingAgents-CN

# 命令行方式(无需写代码)
python -m tradingagents_cn.cli analyze \
    --stock-code 600519 \
    --date 2026-06-09 \
    --llm-provider deepseek \
    --model deepseek-chat \
    --export report.pdf

输出(部分)

[INFO] 正在初始化 TradingAgents-CN 引擎...
[INFO] 使用 LLM: deepseek (deepseek-chat)
[INFO] 开始分析股票:600519(贵州茅台)
[INFO] 数据收集完成:
  - 价格数据:60 天
  - 新闻数据:47 条
  - 社交媒体数据:123 条
  - 基本面数据:2026Q1 财报

[INFO] 分析师团队分析中...
  [市场分析师] 技术面评分:78/100
    - MACD 金叉(买入信号)
    - RSI = 58(未超买)
    - 成交量放大(5 日均值的 1.8 倍)
    - 综合建议:买入
  
  [新闻分析师] 新闻情绪评分:65/100(偏多)
    - 利好:"茅台 2026Q1 净利润同比增长 12%"
    - 利空:"白酒行业整体增速放缓"
    - 综合建议:持有
  
  [社交媒体分析师] 社交媒体情绪评分:72/100(偏多)
    - 微博情绪:68% 看涨,22% 看跌,10% 中性
    - 雪球热门帖:"茅台这次能突破 1700 吗?"
    - 综合建议:买入
  
  [基本面分析师] 基本面评分:85/100(优秀)
    - PE = 35x(历史均值 40x,偏低)
    - ROE = 28%(优秀)
    - 净利润增速 = 12%(稳健)
    - 综合建议:买入

[INFO] 研究员团队辩论中...
  [看涨派] 核心逻辑:
    1. 技术面走强(MACD 金叉 + 成交量放大)
    2. 基本面优秀(ROE 28%,PE 偏低)
    3. 社交媒体情绪偏多
    4. 目标价位:1750(基于 DCF 估值)
    5. 建议仓位:40%
  
  [看跌派] 核心逻辑:
    1. 白酒行业整体增速放缓(宏观风险)
    2. 技术面已接近前期高点 1650,可能遇阻
    3. 政策风险:反腐力度加大
    4. 止损价位:1550
    5. 建议仓位:10%
  
  [辩论记录](3 轮辩论完整记录,此处省略...)

[INFO] 交易员综合决策中...
  [交易员] 最终决策:
    - 动作:买入
    - 仓位:30%(折中看涨派 40% 和看跌派 10%)
    - 止损价:1550(-5.5%)
    - 止盈价:1750(+6.7%)
    -  reasoning:"综合两位研究员的观点,我认为茅台短期技术面走强,
       基本面稳健,但需警惕宏观风险。因此选择中等仓位(30%),
       并设置严格的止损。"

[INFO] 风控官投票中...
  [激进风控] 通过(仓位 30% < 30% 上限,通过)
  [中立风控] 通过(止损幅度 5.5% < 8% 上限,通过)
  [保守风控] 否决(单只股票仓位 30% > 15% 上限,否决)
  
  [投票结果] 2:1 通过(多数同意)

[INFO] ✅ 最终决策:买入贵州茅台,仓位 30%,止损 1550,止盈 1750

[INFO] 正在导出报告...
[INFO] 报告已导出:report.pdf

7. 性能优化:回测、风控与策略评估

7.1 回测框架集成

TradingAgents-CN 可以与 BacktraderVnPy 集成,进行历史回测:

# examples/backtest.py

import backtrader as bt
from tradingagents_cn import TradingAgentsEngine

class TradingAgentsStrategy(bt.Strategy):
    """基于 TradingAgents-CN 的回测策略"""
    
    def __init__(self):
        self.engine = TradingAgentsEngine(
            llm_provider="deepseek",
            model_name="deepseek-chat",
        )
        self.last_analysis_date = None
    
    def next(self):
        current_date = self.datas[0].datetime.date(0).strftime("%Y-%m-%d")
        
        # 每天只分析一次(避免重复调用 LLM)
        if current_date == self.last_analysis_date:
            return
        
        # 调用 TradingAgents-CN 分析
        result = self.engine.analyze(
            stock_code="600519",
            date=current_date,
            analysis_days=60,
        )
        
        # 执行交易
        if result.final_decision.action == "buy" and not self.position:
            size = int(self.broker.getcash() * result.final_decision.position_size / self.datas[0].close[0])
            self.buy(size=size)
        
        elif result.final_decision.action == "sell" and self.position:
            self.close()
        
        self.last_analysis_date = current_date


# 运行回测
cerebro = bt.Cerebro()
cerebro.addstrategy(TradingAgentsStrategy)

# 加载数据
data = bt.feeds.PandasData(
    dataname=pd.read_csv("600519.csv", parse_dates=True, index_col=0)
)
cerebro.adddata(data)

# 设置初始资金
cerebro.broker.setcash(1000000.0)

# 运行回测
cerebro.run()

# 输出结果
print(f"初始资金: {1000000.0:.2f}")
print(f"最终资金: {cerebro.broker.getvalue():.2f}")
print(f"收益率: {(cerebro.broker.getvalue() / 1000000.0 - 1) * 100:.2f}%")

7.2 风控规则配置

# tradingagents_cn/config/risk_rules.yaml

risk_rules:
  # 单只股票仓位上限
  max_position_per_stock: 0.20  # 20%
  
  # 止损幅度上限
  max_stop_loss: 0.10  # 10%
  
  # 止盈幅度下限(防止过早止盈)
  min_take_profit: 0.05  # 5%
  
  # 最大杠杆
  max_leverage: 1.5
  
  # 禁止交易的股票
  blacklist:
    - "*.ST"  # ST 股票
    - "*.DEL"  # 退市股票
  
  # 最大回撤容忍度
  max_drawdown: 0.15  # 15%
  
  # 日内最大亏损
  max_daily_loss: 0.05  # 5%

8. 总结与展望:AI 量化交易的未来

8.1 本文回顾

本文深入解析了 TradingAgents-CN 的核心原理、架构设计、代码实战和性能优化技巧,涵盖:

  1. 传统量化模型的三大痛点:反应迟钝、黑盒决策、无法理解文本
  2. 多智能体系统的核心优势:消除幻觉、多视角分析、可追溯
  3. 四大智能体的协作机制:分析师 → 研究员 → 交易员 → 风控官
  4. 完整的代码实战:从安装到 A 股智能分析
  5. 多 LLM 集成:OpenAI、Gemini、千问、DeepSeek 一键切换
  6. 回测与风控:与 Backtrader 集成,严格的风控规则

8.2 AI 量化交易的未来趋势

根据 TradingAgents-CN 官方路线图,2026 年下半年将发布:

  1. 实时交易接口:支持接入券商 API(如同花顺、东方财富),实现全自动交易
  2. 多资产类别支持:除 A 股外,支持港股、美股、期货、期权
  3. 强化学习集成:让智能体通过"模拟交易"不断学习优化策略
  4. 社区策略市场:用户可以分享自己的多智能体配置,其他人可以"一键复用"

8.3 风险提示

⚠️ 重要声明

  • TradingAgents-CN 仅供研究与教育用途
  • AI 生成的交易决策不构成投资建议
  • 量化交易有风险,入市需谨慎
  • 建议在模拟盘中充分验证策略后,再考虑实盘部署

参考资源

  1. TradingAgents-CN 官方文档:https://www.tradingagents-cn.com/
  2. GitHub 仓库:https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN
  3. A 股数据接口(Tushare):https://tushare.pro/
  4. Backtrader 文档:https://www.backtrader.com/
  5. 相关论文
    • "Financial Trading with LLM-Based Agents" (2025, arXiv)
    • "Multi-Agent Reinforcement Learning for Portfolio Management" (2024, ICML)

如果你觉得这篇文章对你有帮助,欢迎在评论区分享你的 AI 量化交易实践经验!


作者:程序员茄子 | 转载请注明出处

推荐文章

PHP openssl 生成公私钥匙
2024-11-17 05:00:37 +0800 CST
Vue3中的v-slot指令有什么改变?
2024-11-18 07:32:50 +0800 CST
MyLib5,一个Python中非常有用的库
2024-11-18 12:50:13 +0800 CST
filecmp,一个Python中非常有用的库
2024-11-19 03:23:11 +0800 CST
软件定制开发流程
2024-11-19 05:52:28 +0800 CST
MySQL 优化利剑 EXPLAIN
2024-11-19 00:43:21 +0800 CST
介绍25个常用的正则表达式
2024-11-18 12:43:00 +0800 CST
程序员茄子在线接单