ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

TradingAgents多智能体交易框架:从辩论机制到回测实践

TradingAgents多智能体交易框架:从辩论机制到回测实践 1. 多智能体框架TradingAgents 到底在解决什么问题先说个很直接的感受我最早看到 TradingAgents 这个名字时第一反应是“又一个拿 LLM 包装的量化策略”。但真正把它的设计思路拆开之后我发现它解决的问题确实不一样过去的自动交易系统大多是单模型决策策略也好、风控也好全都压在一条链路里任何一环判断失误都会被直接放大。TradingAgents 的思路是让多个不同角色的智能体参与同一笔交易决策像是组了一个投资委员会各管一摊互相质询最后再形成统一结论。这个思路对应到实际场景里非常有针对性。个人交易者最大的问题不是信息不够而是信息太多情绪干扰太重。看到一个利好新闻就冲进去被套住了又舍不得止损这些问题本质上是缺少一套结构化决策流程。TradingAgents 这类多智能体系统能做的事就是把交易流程拆分成“信息搜集 - 分析判断 - 多空辩论 - 交易执行 - 风险审查 - 复盘迭代”每个环节由专门的智能体负责并且允许不同的观点在同一套框架内对抗碰撞。类比一下传统程序化交易像是一个人在下单看到信号就触发目标纯粹多智能体交易更像是一个小型机构在作战研究员先出报告策略师再扣扳机风控盯着仓位上限任何一个环节有疑问都要返回重审。这种设计天然就更适合处理 A 股、美股这种信息驱动明显、情绪波动大的市场。我觉得 TradingAgents 真正值得关注的不是它用了多牛的模型而是它把“流程”做成了产品。模型再聪明单次判断也会有偏差但一套包含辩论、反思、复核的决策流程能把单点失误的概率压得很低。这一点是所有想在真实市场里用大模型做交易的人必须想明白的事。2. 核心角色拆解委员会里的每个人都在干什么一个完整的 TradingAgents 系统角色划分基本是固定的分析师负责解读事件研究员负责挖掘数据交易员负责最终报价与执行风控官负责审核仓位和风险边界还有一个复盘角色在交易结束后做归因分析。不同的开源实现里角色名称可能有差异但职责边界大差不差。角色核心职责输入信息输出产物分析师解读新闻、财报、宏观数据对标的的影响新闻标题、财报数据、宏观指标多空观点及置信度研究员验证分析师观点补充技术面与历史数据K线数据、历史回测结果、行业数据研究报告、可量化依据交易员汇总各方观点生成具体交易指令分析师与研究员结论、账户资金、持仓买入/卖出/持有、目标价、仓位比例风控官审查指令是否触及风险红线当前持仓、波动率、最大回撤预算放行/否决/调整建议复盘员交易结束后对比预期与实际总结教训交易结果、决策记录、市场后续走势复盘报告、反思建议分析师和研究员这两个角色容易混淆实际拆分逻辑其实很清楚分析师更偏“事件驱动”重点回答“这件事对股价有没有影响”研究员更偏“数据验证”重点回答“历史上有类似事件发生时股价到底怎么走”。两者互补才能避免只凭一条新闻就做决策的冲动行为。交易员是所有决策的汇合点。在真实的实现里交易员收到的不是简单的“买入”或“卖出”而是一整套带上下文的输入分析师给出的方向性判断、研究员给出的技术位锚点、当前账户的可用资金和已有仓位。交易员要做的是把这些信息压缩成一个可执行指令包含方向、点位、仓位比例、止损和止盈位置。风控官的角色最容易被人忽略但恰恰是它决定了系统能不能活过一轮极端行情。模型可能在某一天给出一个非常高置信度的买入建议但如果当前市场波动率已经处于历史极值或者这个标的的仓位已经超过总资金的一定比例风控官就应该直接否决这条指令。我在实际搭建时给风控官设了一条硬性规则任何单一标的的仓位不得超过总资金的 15%任何建议的止损距离不得超过入场价的 5%这两条规则不参与辩论直接硬性过滤。复盘员是 TradingAgents 区别于普通信号系统的一个亮点。很多人在跑回测时只看胜率和收益率但完全不清楚哪些决策是真正有效的哪些只是运气。复盘员的作用就是每次交易结束后对比决策时点的上下文和后续真实走势把“判断准确但市场没给机会”和“判断错误但碰巧赚钱”两种情况区分开来。这一步做扎实了后面策略迭代才有方向。3. 多智能体协作机制辩论、投票与反思是怎么落地的没有协作机制的多个智能体本质上就是多个单模型各说各话没什么价值。TradingAgents 这类系统能够真正运转起来靠的是三套机制多空辩论、加权投票、反思循环。这三套机制用大白话说就是先吵架再表决最后翻旧账。多空辩论的典型流程是这样的当一条重大新闻进入系统后多个分析师被随机分为多头组和空头组分别基于同一份新闻材料构建支持自己立场的论据。比如美联储宣布加息 25 个基点多头组会说“加息预期落地靴子落地反而利好风险资产”空头组会说“通胀压力仍在加息周期未见顶流动性将进一步收紧”。两组辩论若干轮每一轮都必须引用数据或历史案例来支撑自己的立场不能空喊口号。这种设计有一个很微妙的好处它逼着模型从同一个信息里挖掘多面性而不是给出一个平庸的“中性”结论。很多 LLM 在没有对抗压力时会倾向于输出模棱两可的话术但当你要求它必须在多空两个方向提出具体且可验证的论据时输出质量会明显提升。我在实测中发现加入辩论环节之后分析师生成的研报信息密度明显更高引用数据点也更具体。加权投票发生在辩论结束之后。每个智能体的投票权重不是固定的而是取决于它过往的判断准确率。系统实时维护一张准确率表判断对的智能体权重自然更高判断错的智能体话语权逐步被削弱。这个设计有点像真实世界里基金经理的业绩考核历史战绩决定发言分量。反思循环是我个人认为最值得借鉴的机制它本质上是在每笔交易结束之后把所有决策过程中的对话记录和真实市场走势重新送入大模型让系统自己回答三个问题我错过了什么信息我是否过度解读了某个信号下一次遇到类似场景我应该怎么做这三个问题的答案会被压缩成结构化记忆在后续决策时作为参考背景注入提示词。这三套机制合在一起构成了 TradingAgents 的核心决策循环。单条链路上看每一步都不复杂但组合起来之后系统就不再是一个“输入行情、输出信号”的哑管道而是变成了一个会自我修正的决策生物。4. 工具链路与数据工程别让大模型对着空气炒股前面讲了那么多角色和机制但有一个前提必须诚实承认大模型本身不能获取实时数据它只会根据你喂给它的材料说话。所以 TradingAgents 这类系统真正见功夫的地方反而是外围的数据工程和工具链路。这一块如果做不好再聪明的协作机制也是空中楼阁。一个能真实运转的 TradingAgents 系统至少需要五类数据源行情数据、财报数据、新闻资讯、宏观经济指标、历史回测数据。行情数据用 yfinance 或 Tushare 拉取财报数据从财经接口读取最近几期营收、利润、毛利率等核心指标新闻资讯通过新闻 API 抓取与标的相关的标题和正文并且过滤掉重复内容和垃圾广告宏观数据包括利率决议、CPI、PMI 等这些数据往往需要单独整理成结构化字段历史回测数据则用于研究员的相似事件检索。关键技术点在于工具调用。以大模型为核心的计算流程必须通过函数调用的方式暴露数据接口分析师需要新闻时调用新闻检索工具研究员需要历史行情时调用K线查询工具交易员需要账户信息时调用持仓查询工具。整个过程不能由模型自由发挥而是由调度器根据当前任务状态决定调用哪个工具。我用 LangChain 的 ToolExecutor 做工具路由把每个数据源封装成标准函数统一输入输出格式然后注册到工具列表里。模型在生成回复时如果判断当前需要外部数据会先输出一个工具调用指令系统拦截执行后把结果注入上下文模型再继续推理。这个流程在工程上叫 ReAct 模式执行起来要点很简单工具调用指令的格式定义得越严格模型就越不容易误用。数据质量问题我踩过不少坑。最典型的是新闻数据里的时间错位问题一条旧闻被误判为最新消息导致分析方向和当前市场环境完全相反。解决办法是在新闻抓取时强制校验发布时间超过 24 小时的新闻默认降低权重另外同一事件会被多个媒体重复报道需要用标题相似度算法去重否则同一个利好会被当成多条利好强化模型的乐观偏差。还有一点必须提醒LLM 的上下文窗口有限不可能把几十万条历史K线全部塞给模型。我采用的策略是按需取样研究员需要回测历史数据时系统先基于当前事件标签检索出相似历史片段再把最相关的 20 到 30 组样本聚合成统计摘要最后把摘要喂给模型。这样既保证信息完整又不会把上下文窗口打爆。5. 从零搭建一套可用的 TradingAgents完整实操记录我以自己实际搭建的一套轻量级 TradingAgents 实现为例完整走一遍从架构设计到回测验证的流程。这个实现基于 Python 3.10 LangChain OpenAI API回测框架用的是 backtrader整体代码量不大但足够跑通一套完整的决策循环。5.1 环境准备与依赖安装建议使用虚拟环境隔离依赖避免和其他项目冲突。我本机用 conda 创建了一个独立 Python 3.10 环境然后一次安装核心依赖conda create -n trading-agents python3.10 -y conda activate trading-agents pip install langchain openai pandas numpy yfinance backtrader依赖版本不用特别计较只要是近一年内的版本基本都兼容。如果要支持中文新闻源建议同时安装 jieba 用于中文分词方便后续做文本相似度计算。5.2 定义多智能体的角色提示词每个智能体的核心是一段高度结构化的系统提示词。提示词决定了智能体的行为边界、输出格式和协作方式。我个人总结的经验是提示词里必须明确角色的任务、输入信息、输出格式、禁止行为否则模型容易发散或者把多个角色的职责混在一起。分析师角色的提示词我大概是这样设计的ANALYST_SYSTEM_PROMPT 你是一名专业股票分析师你的任务是解读最新事件、新闻或财报信息 判断它们对目标公司股票价格的中短期影响。 约束条件 1. 只能基于提供的新闻、财报和宏观数据进行分析禁止推测未提及的信息。 2. 输出必须包含方向判断看多/看空/中性、影响时间窗口短期/中期/长期、置信度评分0-100。 3. 必须引用至少两条事实依据支持你的结论。 4. 不允许输出交易建议那是交易员的职责。 输出格式Markdown - 观点看多/看空/中性 - 置信度XX/100 - 核心逻辑... - 依据... 研究员、交易员、风控官的提示词结构类似只需要替换任务描述和输出约束。研究员需要额外强调必须先调用历史数据工具再给出结论风控官需要强调触碰红线必须一票否决不做商量。5.3 实现多空辩论的调度循环多空辩论是整个系统里最有趣的调度逻辑。实现上我用了两个独立的分析师实例一个绑定看多立场一个绑定看空立场双方轮流发言每个发言都会作为上下文传给对方。调度循环代码很直接def run_debate(news, max_rounds3): bull_context [f新闻{news}] bear_context [f新闻{news}] bull_agent create_agent(BULL_ANALYST_PROMPT) bear_agent create_agent(BEAR_ANALYST_PROMPT) for round_idx in range(max_rounds): bull_reply bull_agent.run(bull_context bear_context[-2:]) bear_reply bear_agent.run(bear_context bull_context[-2:]) bull_context.append(f多头第{round_idx1}轮观点{bull_reply}) bear_context.append(f空头第{round_idx1}轮观点{bear_reply}) return bull_context[-1], bear_context[-1]关键点在于每一轮发言都要把上一轮的对手观点注入上下文否则双方只是在自说自话根本不构成辩论。我在初版实现里犯过这个错误输出的两组观点之间毫无对抗性跟分别问两个模型然后拼接结果没什么区别。5.4 集成外部数据工具外部数据工具用 LangChain 的 tool 装饰器定义每定义一个函数就是一个可被模型调用的工具。以新闻检索工具为例我从 NewsAPI 拉取某只股票近 72 小时的相关新闻按发布时间倒序返回前 10 条并将每条新闻的长度控制在 500 字以内from langchain.tools import tool tool def search_news(ticker: str) - str: 检索指定代码近72小时的新闻返回前10条标题和摘要。 url fhttps://newsapi.org/v2/everything?q{ticker}sortBypublishedAtpageSize10 # 实际实现时在这里填入自己的 API Key headlines [...] return \n.join(f{h[publishedAt]} {h[title]} for h in headlines)行情数据工具返回的格式需要标准化一下我固定输出最近 60 个交易日的 OHLCV 数据摘要包括区间涨跌幅、最大回撤、均线状态而不是把完整 K 线全部塞给模型。这样处理的原因是模型读原始 K 线的能力并不比一个简单的技术指标计算器更强给模型太多原始数字反而会增加幻觉风险。5.5 交易指令生成与模拟撮合交易员拿到分析师和研究员的两份报告后按提示词要求输出结构化交易指令。我用 Pydantic 定义指令的数据模型走结构化输出链路确保返回结果一定是合法 JSONfrom pydantic import BaseModel class TradeInstruction(BaseModel): action: str # buy / sell / hold target_price: float stop_loss: float position_pct: float # 0 ~ 1 class RiskReview(BaseModel): approved: bool reason: str adjusted_position_pct: float | None None交易指令生成之后送到风控官做审查。风控官如果返回 approvedFalse这笔交易直接废弃并记录原因如果返回 True但调整了仓位比例则按调整后的仓位执行。整个决策过程的对话和审查记录会全部写入日志作为复盘员的事后分析素材。模拟撮合我用 backtrader 实现了一个简单的 Broker每次收到有效指令后按当日收盘价成交滑点设定为 0.1%手续费按双边 0.05% 计算。这些参数都很保守目的是优先验证决策逻辑本身而不是靠低摩擦成本粉饰收益。5.6 一套完整的回测运行与结果解读我在美股中概股和 A 股蓝筹上各跑了 30 个交易日的模拟回测。以某中概科技股为例系统在一条“财报营收超预期”的新闻驱动下触发了多头辩论多头组强调营收增速和利润率改善空头组则指出销售费用同步攀升和估值偏高。辩论三轮之后相关性加权投票结果显示多头以 62:38 微弱占优交易员给出 5% 仓位的买入指令目标价较入场价高 6%止损设 3%。风控官检查后放行。这笔交易在真实行情中最终盈利约 4.8%最大浮亏出现在第三天为 -2.1%但未触及止损线最终止盈离场。复盘员的记录指出空头组提到的销售费用问题后续确实影响了股价表现如果初始仓位下调到 3%持仓体验会更好。这个结论直接被系统记录到反思库中供后续类似场景参考。更有意思的是另一笔交易。系统在“某公司宣布重大回购计划”的新闻驱动下多空辩论后一致看多交易员给出 10% 仓位的买入指令。结果第二天市场传出该公司现金流紧张的消息股价不涨反跌 4%。复盘时发现新闻检索工具的时间窗口内确实出现了多条关于现金流问题的报道但被相关性排序算法压到了后面分析师没有注意到。这个问题直接推动我调整了新闻检索逻辑把“财务风险相关关键词”单独拉出来做了加权。6. 参数调优与效果对比哪些设置对结果影响最大同一套系统不同参数设置下跑出来的结果差异非常大。我系统性地做了一轮对照实验把影响最明显的几个参数单独梳理出来方便你少走弯路。参数低值设置高值设置对结果的影响辩论轮数1轮5轮1轮时决策粗糙3轮以上信息挖掘充分再增加提升有限且成本翻倍投票权重衰减0.80.1衰减太快会让准确率稍低的智能体快速失去话语权最终退化回单模型决策置信度阈值5090阈值太低会频繁触发无效交易太高会错过大量真实机会70 左右比较平衡上下文窗口8k32k窗口太小塞不下完整辩论记录太大会稀释关键信息16k 是性价比最优解辩论轮数这块我最有发言权。最初我把轮数设为 5想追求更充分的观点碰撞结果每一笔交易光 LLM 调用成本就超过 2 美元而且 4 轮之后双方基本在原地打转输出的观点不再新鲜。降到 3 轮之后信息挖掘充分度和成本之间的平衡最好。如果你的预算有限2 轮也能跑但观点丰富度会有明显折扣。置信度阈值的选择要看你的风险偏好。阈值 50 时系统每周可能触发 5 笔以上交易频繁进出导致手续费侵蚀利润阈值 90 时系统可能连续两三周一笔交易都不做虽然躲过了很多震荡但也错过了趋势行情。我最终按 70 作为默认值一个月大约产生 6 到 8 笔交易资金曲线相对平滑。还有一个很容易被忽视的参数是模型温度。我把分析师的温度设为 0.3确保输出稳定但辩论模式下多头和空头的温度反而调到 0.7让观点表达更有张力。交易员和风控官的温度则必须低我设置为 0.1这两个角色需要严肃精确不需要创造性发挥。其实还有一个看不见但很重要的参数新闻去重的相似度阈值。阈值设 0.7 时同一个事件的重复报道会被过滤掉一半有效降低了信息冗余但设 0.9 时去重力度太小同一利好被当成了三个独立利好显著放大了模型的乐观偏向。这个问题我第一次跑回测时没意识到后来看复盘记录才发现系统在重复计算同一事件的利多强度。7. 避坑指南与常见问题排查我踩过的坑都在这里搭建 TradingAgents 的过程踩坑是常态。把最容易出问题的五个场景列成速查表遇到类似问题可以直接对照排查。问题现象根本原因排查思路与解决方案辩论双方输出几乎一样没有把对手观点注入上下文或双方提示词过于相似检查上下文拼接逻辑确认每轮输入包含对手上一轮完整观点适当拉大两组提示词的风格差异交易指令频繁触发买入新闻去重失效重复利好被重复计算检查相似度阈值增加标题指纹去重加入连续 24 小时内同类新闻的合并逻辑系统在重大利空当天仍然建议买入新闻数据时间错位旧闻被当作最新消息强制过滤超过 24 小时的数据对突发利空新闻增加关键词加权回测收益为正但实盘亏损实盘滑点和资金容量与回测假设差距过大将滑点从 0.05% 提高到 0.2%模拟真实盘口深度限制限制单笔仓位上限单笔交易 LLM 成本过高辩论轮数过多或上下文窗口过大将辩论轮数压缩到 3 轮以内精简研报输出长度对长历史数据优先做摘要关于 LLM 幻觉一个值得专门强调的点是系统在引用“数据”时并不总是可靠的。分析师可能会说“过去十年加息周期中股市平均上涨 6%”但这句话不一定有真实依据。我在系统里加了一个硬性约束分析师和研究员必须标注数据来源如果来源不明确数据不能直接作为论点使用。这条规则虽然不能彻底消灭幻觉但能把幻觉比例压到可接受范围。另外一个非常容易踩的坑是回测的幸存者偏差。如果你用现在的股票池去回测过去一年的策略等于把退市的股票全部排除了结果必然虚高。解决思路很简单还原历史时点的股票池用当时的成分股列表而不是用现在的列表。这个细节直接影响回测结论的可信度一定要重视。API 成本的控制也有心得。实测下来系统跑一笔完整交易决策大约消耗 5 万到 8 万 token如果全部用高级模型成本大约在 1.5 到 3 美元之间。省钱的技巧是辩论阶段用中等规模模型只有交易员和风控官做最终决策时切换到高级模型成本能降 40%且决策质量几乎没有下降。数据检索阶段则完全可以用轻量模型只做信息抽取和格式化。信号延迟也是交易系统里绕不开的话题。新闻事件在真实市场中的影响力衰减非常快如果新闻推送后你花了 5 分钟去做多空辩论等交易员生成指令时行情可能已经走完大半了。所以我的架构里做了一个分层处理对触发风险红线的突发新闻走得流风控官优先审查分析师和研究员并行工作确保关键决策延迟控制在 60 秒以内。普通新闻则走完整辩论流程对时效性要求没那么高。8. 后续还能怎么演进把单个系统扩展成能力更强的框架TradingAgents 这套架构跑通之后最值得做的扩展方向有三个记忆系统的长期化、多市场多资产的横向扩展以及模拟交易环境的真实化改造。这三个方向做深了系统能力会有一个质的跃升。记忆系统方面目前的反思记录是存在本地 JSON 文件里的简单但低效。你可以换成向量数据库比如 Chroma 或 Milvus把历史复盘报告向量化存储。当新事件触发决策时先从向量库中检索语义最相似的历史案例把当时的复盘结论注入当前决策上下文。这个机制实现之后系统相当于拥有了“经验”同一个坑大概率不会踩第二次。多市场扩展的关键不在接入更多行情数据源而在每个市场的交易规则差异。A 股有涨跌停限制美股没有A 股是 T1美股是 T0不同市场的财报披露频率和规则也完全不同。这些规则差异如果不在风控官和交易员的提示词里显式声明模型很容易默认用美股规则套用到所有市场产生严重风险。我在扩展 A 股标的时专门在风控官的提示词里加了一条A 股标的止损指令当日不可执行必须在次日开盘竞价阶段处理。模拟交易环境的真实化改造是我最推荐大家优先做的事。常见做法是把模拟撮合逻辑从简单收盘价成交改成基于逐笔盘口数据的模拟撮合同时考虑订单在盘口中深度不足时的冲击成本。我做了一版简化版每次交易指令到达时先从交易所历史逐笔数据中随机抽取一个同类型订单作为对照计算实际滑点和延迟成本用实际值替代固定滑点。改造之后回测曲线的可信度提升非常明显。我还想提一个比较前沿的扩展方向把多智能体从决策端延伸到执行端。比如分析师负责识别盘口异常研究员负责分析龙虎榜资金流向交易员负责实时盯盘并捕捉最佳报价窗口风控官动态调整仓位阈值。这套思路本质上是在模拟一个真实的量化交易团队每个岗位都有对应的智能体值守团队协作的复杂度比单次决策高了一个量级。从我自己的实践体会来说TradingAgents 最大的价值不在于某一笔交易的胜负而在于它提供了一套把交易决策流程标准化、可复现、可迭代的方法论。只要数据链路稳定、角色分工清晰、反思机制到位这套框架在不同的市场和标的上都能迁移使用。如果你正在考虑用大模型做交易决策建议从最小可行版本开始先跑通一个标的、一个策略、一个月的回测再逐步叠加复杂机制这样每改动一个环节都能确认它对最终结果的实际影响。交易系统的搭建和迭代注定是个慢功夫但方向对了每一步都在积累真正的复利。
返回列表