
去年底我把 TradingAgents 的仓库拉下来原本只想看看它怎么用 LangGraph 把多个 Agent 串成一张图结果连着跑了三个晚上。它不是一个预测股价的黑箱而是一套把真实投研流程拆成角色的多智能体框架分析师负责收集证据研究员分多空两边吵架交易员把结论翻译成动作风控三方再吵一轮最后由组合经理拍板。整套流程每一步都留下文本记录你能看到某个卖出结论到底是被哪条新闻、哪个技术指标、哪段情绪数据推出来的。这篇文章写给三类人想研究 Agent 编排与多角色协作的工程师、想给量化流水线加一层文本理解的研究员以及单纯想知道这套开源框架值不值得投入时间跑一跑的开发者。需要提前说清楚它本质是研究工具输出结果不构成任何投资建议把它当成决策辅助的第二意见生成器更合适。1. TradingAgents 真正解决的其实是决策结构问题1.1 单模型直接给买卖点缺的到底是什么我第一次用单个大模型做股票判断时得到的是一个非常流畅、非常有说服力的段落里面有估值、有行业趋势、有风险提示最后给一句建议持有。问题在于这个结论没有任何对手方。模型在一段上下文里既当分析师又当裁判它的第一句话就锚定了后面的所有推理后面的内容只是在给第一句话找理由。这种结构在人类组织里早被淘汰了——没有哪家机构会让一个人同时写多空两份报告然后自己签字。真实投研流程之所以要分角色核心不是为了人多力量大而是为了制造上下文隔离和立场对立。基本面分析师看不到技术面的 K 线形态就不会因为图形走坏了而扭曲对财报的解读空头研究员被明确要求找反例就不会顺着多头的话往下说。TradingAgents 把这套组织架构用代码复刻了一遍每个角色有独立的提示词、独立的工具集、独立的输出格式最后通过一张有向图把它们连起来。所以它解决的问题可以概括成三句话把一次性黑箱判断拆成可审计的推理链把分歧从噪声变成正式输入把风控从一句提示变成有立场的对抗环节。这三点里第三点最容易被忽略但恰恰是它和市面上大多数AI 炒股助手最本质的区别。1.2 角色切分的取舍逻辑为什么不拆成二十个 Agent拆角色这件事边际收益递减得非常快。我试过在一个类似框架里把分析师拆成财报质量、管理层指引、供应链、竞争对手、宏观敏感性五个细分角色结果 token 成本涨了将近三倍最终决策和四角色版本的区别小到看不出来反而因为报告太长裁判模型开始丢失细节。TradingAgents 的设计选择是相对克制的分析师四条线基本面、新闻、情绪、技术面研究员多空两方风控三方激进、中性、保守加上交易员和组合经理。这个粒度基本对应了人类投研团队的最小可运转编制——再少就缺视角再多就纯烧钱。判断粒度是否合适的经验法则是如果两个角色的输入数据和输出结论高度重叠就应该合并。技术面和情绪面的输入完全不同价格序列 vs 社媒文本保留基本面里的估值和盈利质量输入高度重叠就没必要拆。我在自己改造时删掉过一个行业对比分析师因为它 80% 的时间在重复基本面分析师已经写过的内容删掉之后决策质量没有肉眼可见的变化。1.3 三种方案的正面对比把单 Agent 方案、传统因子模型和 TradingAgents 摆在一起看各自的定位其实很清楚不存在谁替代谁。维度单 Agent 直出结论传统因子/统计模型TradingAgents 多智能体输入类型文本为主可混合数值数值为主结构化文本 数值 工具调用结果推理可解释性低事后编理由中因子权重可查高每个角色报告全留痕单次决策成本极低1 次调用极低高几十次调用结论稳定性差提示词微调即变高中受辩论轮数和模型影响处理突发事件强能读新闻弱需重新训练强新闻角色专门干这个适合场景快速浏览、辅助阅读大规模批量筛选少量标的的深度研究看懂这张表你就能明白它该放在流程的哪一环。我自己的用法是先用传统因子模型从几千只标的里筛出几十只候选再对其中真正想花时间研究的几只跑一遍 TradingAgents把它输出的多空论据当成读研报的替代品。反过来拿它去扫全市场成本会高到让你怀疑人生。2. 拆开一张图一条决策链是怎么跑出来的2.1 分析师团队四条互不重叠的信息线分析师层的设计思路是每条线只对自己的一类证据负责。基本面分析师拿到的是财报数据、财务比率它的任务是判断这家公司当前的经营状况和估值位置新闻分析师关注的是宏观与公司层面的新闻事件重点在时效性情绪分析师去看社媒和论坛的讨论热度与倾向技术面分析师则处理价格与成交量算均线、动量、波动率之类的指标。这里有个很实用的小细节每个分析师在给出结论前会先调用工具取数据再把数据写进报告里。这意味着你能在输出目录里看到它到底查了什么。我踩过一个坑——某次某只标的的新闻分析师报告写得头头是道细看才发现工具调用返回的是空数据集模型凭常识把内容补齐了。所以看到任何一份漂亮报告先去核对它的原始工具返回这是使用这类框架必须养成的习惯。四条线之间是并行执行的这也是它比人类团队快的地方。人类分析师串行开会要一天这里几十秒就跑完了。但快也带来代价四条线彼此不知道对方在看什么可能得出互相矛盾的结论而矛盾要被留给下一层的辩论去处理而不是在这一层强行统一。2.2 研究员辩论把吵架设计成正式流程辩论层是我认为整套框架里最值得借鉴的部分。多头研究员和空头研究员会拿到同一份分析师报告然后各自陈述立场并且要针对对方的论点做反驳。轮数由max_debate_rounds控制跑完之后由研究主管做裁判输出一份结构化的投资计划里面包含方向、理由和关键假设。实测下来的经验是辩论轮数设 1 到 2 轮性价比最高。设 1 轮时多空各说一次裁判直接判设 2 轮时双方各多一次反驳机会论证确实更扎实。设 3 轮以上时我观察到大量内容退化成措辞变换——我仍然认为、如前所述这类句子占比明显上升token 成本却近乎线性增长。如果你预算紧张1 轮完全够用如果这只是你重点研究的少数标的2 轮值得。还有一个反直觉的发现空头研究员的输出质量往往比多头更高。原因不难猜模型在找风险、找反例、找财报里的异常项时更有话可说而看多论证很容易滑向泛泛而谈。所以我在读结果时会优先精读空头报告再回头看多头是怎么回应这些质疑的——很多真正的风险点就藏在那些回应不充分的地方。2.3 交易员、风控三方与最终拍板研究主管给出投资计划之后交易员角色负责把它翻译成具体的交易动作。这里要注意它的输出是意图级别的建议比如方向、时机判断、大致的仓位倾向而不是精确到股数和限价的执行单。指望它直接对接下单接口是很危险的我在第 4 节会专门讲执行对齐的问题。接下来是风控辩论同样设计成三方对立激进方主张承担更多风险换取收益弹性保守方强调回撤控制和仓位上限中性方在中间找平衡。三方辩论完之后由风险裁判或者组合经理角色收敛出最终决策。这个环节的价值在于它强制决策者面对反面意见。我在实际使用中发现很多最终被标为持有的案例其实是激进和保守两方吵得太凶、裁判选择了不动。这种僵局导致持有的机制有点像现实中的投资委员会保守有余、进攻不足。如果你需要更果断的信号可以调整风控角色的提示词权重或者在解析最终输出时把三方意见的分歧程度单独作为一列记下来——分歧极大的持有和共识一致的持有含义完全不同。2.4 记忆与反思让系统跨天积累经验每次跑完一次完整决策框架会把当时的判断、理由和若干天后的实际价格变动放在一起对照生成一段反思文本写进记忆库。下一次对同一标的做判断时相关的历史反思会被召回作为上下文的一部分。这个机制听起来很美好但它是双刃剑。好的方面是模型确实能记住上次我在这个标的上低估了财报指引的重要性这类教训后续判断会更谨慎。坏的方面是一旦某次反思得出了错误归因这个错误会被反复召回并强化。我遇到过最典型的情况某只标的在某个季度因为一次性事件大涨反思文本把原因归给了技术面突破之后每次分析这只标的模型都会特别看重技术形态其实那次和技术形态几乎无关。我的处理办法是定期清理和隔离记忆。至少每个月翻一遍记忆文件把明显归因错误的条目删掉另外做回测时一定用独立干净的记忆目录别把实盘积累的记忆混进去否则回测结果会被未来信息污染。记忆目录一般在结果输出路径下按标的和日期分文件夹存放翻起来并不费劲。3. 从零把第一个案例跑通3.1 环境准备与依赖安装基础环境建议 Python 3.10 以上用 conda 或 venv 建独立环境别装在系统 Python 里。这个项目依赖不少LangGraph、LangChain 生态相关的包版本变动比较频繁隔离环境能省掉大量排查时间。git clone https://github.com/TauricResearch/TradingAgents.git cd TradingAgents conda create -n tradingagents python3.11 conda activate tradingagents pip install -r requirements.txt安装完先别急着跑先把密钥配好。至少需要两类一类是大模型服务的 API Key一类是金融数据服务的 Key。数据源方面框架常用的组合是金融数据接口加一个行情兜底源前者免费额度有限后者的非美市场支持比较差。在项目根目录建一个.env文件OPENAI_API_KEY你的密钥 FINNHUB_API_KEY你的密钥注意密钥文件一定加进.gitignore。我见过有人把带 Key 的配置文件直接推到公开仓库几分钟内就被扫号脚本抓走账单能吓人一跳。3.2 关键配置项怎么改框架的默认配置集中在一个字典里这是我改动最多的地方逐项说一下。配置项作用我的建议值deep_think_llm承担复杂推理的模型用于辩论、裁判、组合经理选你预算内最强的推理模型quick_think_llm承担格式化、摘要、工具调用决策的模型选便宜且稳定的小模型max_debate_rounds研究员多空辩论轮数1 或 2max_risk_discuss_rounds风控三方辩论轮数1online_tools是否实时调用在线数据工具首次调试设 True离线复现设 Falsebackend_url模型服务地址用官方服务就留默认模型分层是最省钱的一招。整个流程里真正需要强推理的只有辩论、裁判和组合经理这几步其余的摘要、格式转换、工具选择用便宜模型完全够。我做过对比把格式化类任务换成小模型整体成本能降一半左右而最终决策的一致性基本没变化。前提是小模型要能稳定输出结构化结果这一点需要你自己测几轮。3.3 最小可运行示例配置改完之后用几行代码就能跑通一次完整决策。from tradingagents.graph.trading_graph import TradingAgentsGraph from tradingagents.default_config import DEFAULT_CONFIG config DEFAULT_CONFIG.copy() config[deep_think_llm] gpt-4o config[quick_think_llm] gpt-4o-mini config[max_debate_rounds] 2 config[online_tools] True ta TradingAgentsGraph(debugTrue, configconfig) _, decision ta.propagate(NVDA, 2024-05-10) print(decision)propagate的第一个参数是标的代码第二个参数是分析日期。这个日期参数非常关键它是整个框架能做历史回测的基础——你可以指定过去的某一天让系统只用那天之前的信息做判断。调试阶段建议把debug打开能看到每个节点之间的消息流转第一次跑的时候信息量有点大但能帮你迅速理解整张图的执行顺序。跑完之后还可以触发反思流程让系统回看历史决策ta.reflect_and_remember(1000)参数是往前追溯的天数。如果更喜欢命令行操作项目自带了交互式入口python -m cli.main它会引导你选择标的、日期和分析师组合适合不想写代码的场景。3.4 输出结果怎么读才不被带偏一次完整运行结束后结果目录里会按日期和标的归档所有中间产物四位分析师的报告、研究员的多空论证、交易员方案、风控三方意见以及最终的决策文本。新手最容易犯的错是直接翻到最后一页看结论然后回头去找支持这个结论的理由。我的读法是从后往前但先读空头。先看风控里的保守方怎么说再看空头研究员的反驳接着看多头如何回应最后才看交易员和组合经理怎么收敛。这样读的好处是你会对结论的脆弱点特别敏感——如果最终决策是买入但保守方的核心质疑在多空辩论里始终没有被正面回应那这个买入信号的置信度就要打折扣。另外建议第一次跑的时候挑一个你自己非常熟悉的标的。看着模型分析你熟悉的公司你能立刻判断出它是真读懂了数据还是在编故事这比拿陌生标的跑一百次都有用。4. 成本、时延与参数调优4.1 一次完整运行的调用量与成本估算很多人第一次跑完看到账单会愣一下所以提前把账算清楚很有必要。下面是基于我实际运行记录的粗略估算具体数字会随分析师数量、辩论轮数和上下文长度浮动。环节大致调用次数特点四位分析师8 到 20 次含工具调用决策和报告撰写研究员辩论4 到 8 次强模型上下文最长研究主管裁判1 到 2 次强模型长输入交易员1 到 2 次中等风控三方 裁判6 到 10 次强模型合计约 25 到 55 次输入 token 8 万到 20 万输出 2 万到 5 万把 token 量乘上你所用模型的公开单价就能得到单次成本。这里不给具体金额因为各家定价和优惠变动太快用老数据算账反而误导人。你只需要记住一个结论用顶级模型跑高频回测成本会远超你的预期。想验证策略有效性先用便宜模型跑小样本确认流程没问题再换强模型跑关键日期。4.2 五个立竿见影的降本手段第一个是模型分层前面说过了把格式化、摘要、工具选择类任务交给便宜模型。第二个是结果缓存同一天同一标的的决策结果完全可以落盘缓存重复调试时直接读缓存我在调提示词的阶段靠这个省下了大部分开销。第三个是压缩历史上下文。反思记忆是越长越贵的不要无脑把所有历史都塞进去按相关性召回最近若干条就够了。第四个是减少辩论轮数从 2 轮到 1 轮大约能砍掉三成调用量。第五个是先小样本后批量——不要一上来就跑一整年的全标的回测先挑 10 个交易日、3 只标的跑通确认数据对齐和解析逻辑都没问题再放开。我见过太多人直接跑大规模回测跑到一半发现日期对齐有 bug整批结果作废。4.3 回测口径最容易自己骗自己的地方用这套框架做回测有三个坑必须避开。第一个是未来函数。你在回测里指定分析日期是 5 月 10 日但数据工具实际返回的可能是包含 5 月 10 日之后信息的数据集尤其是新闻和情绪类接口很多默认按抓取时间排序而不是按发布时间。上线前必须抽查几条新闻的时间戳确认它们都早于分析日期。这一条比什么都重要。第二个是执行时点对齐。决策是 T 日收盘后生成的合理假设是 T1 开盘执行而不是 T 日收盘价。用 T 日收盘价成交会凭空多出一截收益回测曲线会好看得离谱。第三个是交易成本和样本量。别忽略手续费和滑点尤其对小市值标的。更关键的是样本量——单只标的、单个季度跑出来的结论基本没有统计意义你至少需要覆盖几十个决策点和不同市场环境才勉强能看出点东西。至于涨跌停、停牌这些特殊交易日的处理如果你做的是非美市场必须在数据层就先过滤掉否则信号根本执行不了。5. 踩坑记录与排查技巧实录5.1 数据源报错、字段缺失与限流数据层是最容易出问题的地方因为它的失败往往是静默的——接口返回 200但内容是空的模型照样能写出一份看起来完整的报告。我遇到的典型情况有三类。一是免费额度耗尽。金融数据接口的免费额度通常按分钟或按天限制批量跑的时候很容易触发报错信息有时藏在返回体的某个字段里不仔细看会以为是代码 bug。二是标的代码格式不统一有的接口要求带交易所后缀有的只认纯代码跨市场时尤其混乱。三是财报字段缺失小市值公司或者非美市场的公司经常拿不到完整财务数据。处理办法是在工具层加一层校验数据为空时直接返回明确的数据不可用标记而不是返回空字符串让模型自由发挥。同时给每个数据源配一个兜底源主源失败时切换。这一层改造大概二十行代码但能省掉后面无数次的报告看起来对其实全是编的。5.2 结构化输出解析失败多智能体框架里Agent 之间传递的消息大量依赖结构化格式一旦模型输出的 JSON 不规范整条链路就会断掉。常见的失败形式包括模型在 JSON 外面包了一层 Markdown 代码围栏或者在 JSON 后面加了一段解释文字又或者干脆少了一个括号。排查顺序我一般是这样的先看原始返回文本确认是格式问题还是内容问题如果是格式问题先把生成该部分的温度调低还不行就在提示词里给一个完整的输出样例并明确要求只输出 JSON不要任何额外文字最后再加一层容错解析比如用正则从返回文本里抠出第一个完整的 JSON 块失败则自动重试一次。注意重试一定要设次数上限。模型在某些输入上会稳定失败无限重试只会烧钱。设成最多 2 次超过就记录日志跳过事后再人工看。5.3 结论横跳与假共识跑了足够多次之后你会发现一个现象辩论很多时候并没有真正产生对抗。多头说完空头只是换个说法重复了同样的担忧裁判于是给出了一个模糊的中间结论。这种假共识在模型温度偏高或者辩论轮数过多时特别明显。我的改进办法有三条。一是在提示词里强制要求每一方必须引用对方上一轮的具体句子进行回应不允许泛泛而谈。二是降低温度让论证更聚焦。三是在裁判的提示词里加入一条要求如果多空双方的关键分歧没有被解决必须在结论里明确标注分歧未收敛而不是硬给一个方向。第三条最有用。我把它加进去之后输出的决策明显更诚实了很多原本被包装成持有的案例现在会直接告诉你证据不足建议观望。对做研究来说一个诚实的不知道比一个虚假的看多有价值得多。5.4 常见问题速查表现象可能原因优先排查动作报告内容空洞工具返回空数据检查原始接口返回体解析报错中断输出格式不规范降温度 加输出样例结论每次都不同温度过高或辩论轮数太多降温度轮数降到 1成本远超预期未做模型分层和缓存分流任务加结果缓存回测收益异常好未来函数或执行时点错抽查新闻时间戳判断老是偏向某类记忆被错误反思污染检查并清理记忆文件中文标的分析质量差数据源不支持该市场更换数据源或自建数据层6. 二次开发的几条可行路线6.1 替换数据源、接入自有因子框架的工具层是相对独立的替换数据源不用动主图结构。常见做法是保留工具的函数签名把内部实现换成你自己的数据接口比如接内部的行情库、自建的财报数据库、或者公司的因子计算服务。这样上层所有 Agent 完全无感。接入自有因子是最有价值的改造方向之一。你可以在技术面分析师之外新增一个量价因子分析师让它读取你自己算好的因子值并给出解读。但要注意别让新角色抢了原有角色的活——如果它输出的内容和基本面分析师高度重叠决策质量不会提升成本却上去了。判断标准还是那条输入数据是否真正独立。6.2 把决策信号接进回测框架框架输出的决策文本是给人读的要接进回测系统必须先做信号抽取。我的做法是让模型在输出最终结论时额外输出一个极简的结构化字段只包含方向和置信度两个值然后在回测脚本里统一读取这个字段。这样既保留了完整报告供人工复核又有了机器可读的信号。信号和仓位之间还要加一层映射规则不要直接把方向当成满仓满卖。我的经验是信号只控制在有限区间内调仓具体上限根据自己的风险承受能力和历史回撤测试来定。另外回测和实盘一定要用同一套解析代码我见过因为两边解析逻辑不一致导致回测里的一部分信号在实盘根本没被识别的情况。6.3 落地时的边界与风险提示这类框架有一个天然的边界它的输出是基于历史信息的文本推理不包含任何对未来价格的确证能力。它可以帮你更快地读完一堆材料、更系统地列出多空论据、更早地注意到被忽略的风险点但它不能替你做仓位决策更不能当成自动交易信号源直接接单。另一个现实约束是合规。如果你的使用场景涉及他人资金、公开传播投资建议或者任何形式的代客操作那已经远远超出技术工具的范畴需要走完全不同的路径。我自己只把它当作辅助阅读和研究的工具所有最终判断仍然人工复核。还有一点关于预期管理这套系统的表现高度依赖底层模型能力和数据质量。换一个弱一点的模型或者换一个覆盖不全的数据源效果可能天差地别。所以看到别人晒出的惊艳结果时先问清楚他用的是哪个模型、什么数据源、什么时间区间再决定要不要参考。最后说个我个人养成的习惯。每次跑完一次完整决策我不会只看结论而是会把四位分析师的报告和三方风控意见并排打开专门找一件事哪一方的论据最少被其他人引用。被引用得最少的那份报告往往要么是最没价值的要么是最被低估的——两种情况都值得你自己去判断一下。这个动作花不了几分钟但比反复调参数更能提升你对这套系统的理解。