多Agent协作模拟交易系统:研报、决策与风控的工程化实践

1. 从"盯盘焦虑"到"多Agent协作":这套模拟交易系统到底在解决什么

做投资研究的人大概都有过这种体验:早上开盘前刷一遍研报,盘中盯着几个指标来回切换,收盘后还要复盘当天的操作逻辑,一天下来信息过载,真正有价值的判断却没几条。更麻烦的是,人一旦情绪上头,止损纪律就容易形同虚设。我搭这套AI Agent模拟交易系统的初衷很朴素——把"信息收集、逻辑推演、风险控制"这三件事拆开,交给不同的Agent各司其职,让它们像一个小型投研团队一样协作,而我只负责在关键节点做决策复核。

这套系统的核心不是"预测涨跌",而是"模拟一个完整的投研与交易流程"。它包含四个角色:一个负责抓取和整理市场信息的研报Agent,一个负责从数据中提炼逻辑的分析Agent,一个负责生成交易信号的决策Agent,以及一个负责仓位管理和止损止盈的风控Agent。四个Agent通过一个共享的上下文空间传递信息,最终输出一份带风控约束的模拟交易指令。

需要先说明的是,这是一套模拟交易系统,所有交易都在虚拟账户中执行,不接入任何真实券商接口。它的价值在于验证策略逻辑、训练交易纪律、观察多Agent协作的边界,而不是直接拿去实盘。适合对AI Agent架构感兴趣、同时想理解量化交易基本流程的开发者,也适合有投资经验但想用工程化手段约束自己情绪化操作的人。

关键词里提到的"多Agent研报""自主交易""风控",其实对应了这套系统的三个层次:信息层、决策层、约束层。下面我会把这套系统从架构设计到落地细节完整拆一遍,包括我踩过的坑和最后怎么绕过去的。

2. 四个Agent的分工设计:为什么不是一个大模型包办所有事

2.1 单Agent方案的三个致命问题

一开始我图省事,想用一个通用大模型把所有活都干了——给它一段市场数据,让它直接输出买卖建议。跑了几轮模拟之后,问题暴露得很明显。

第一个问题是上下文污染。研报信息、技术指标、新闻情绪、历史持仓,全部塞进同一个对话窗口,模型在生成交易信号时会被无关信息干扰。比如某天有一条行业政策新闻,模型就过度放大了它的权重,忽略了技术面已经出现的背离信号。

第二个问题是职责不清导致无法调试。当一笔模拟交易亏损时,我根本不知道是信息抓取错了、分析逻辑偏了,还是风控没生效。所有环节耦合在一起,出了问题只能整体重跑,效率极低。

第三个问题是风控形同虚设。让同一个模型既生成买入信号又负责止损判断,它往往会在浮亏时给自己找理由——"基本面没变,可以再拿一拿"。这不是模型能力问题,而是角色冲突。风控必须是一个独立的、有硬约束的模块。

2.2 四Agent架构的职责边界与数据流

最终我确定的架构是这样的:

Agent角色核心职责输入输出关键约束
研报Agent抓取并结构化市场信息行情数据、公告、新闻结构化研报摘要只做事实提取,不做判断
分析Agent从摘要中提炼逻辑链研报摘要、历史数据多空逻辑与置信度必须给出反方论据
决策Agent生成交易信号分析结论、当前持仓买卖方向与目标仓位信号需附带理由
风控Agent审核并约束交易交易信号、账户状态最终执行指令一票否决权

数据流是单向的:研报Agent的输出喂给分析Agent,分析Agent的结论喂给决策Agent,决策Agent的信号必须经过风控Agent审核才能进入模拟撮合。这个单向链路的好处是每一环都可以单独测试和替换。

2.3 为什么风控Agent必须有一票否决权

这是整个设计里我最坚持的一点。风控Agent不参与信号生成,它只做三件事:检查单笔仓位是否超过总资金的某个比例、检查当前回撤是否触发暂停交易阈值、检查交易信号是否与已有持仓形成过度集中。

我给它设了硬编码的规则,而不是让模型自由判断。比如"单只标的模拟仓位不超过总资金的20%""单日累计亏损超过3%则当日不再开新仓""同一行业持仓不超过40%"。这些规则写在配置文件里,风控Agent只负责执行和记录,不参与讨论。实测下来,正是这种"不近人情"的硬约束,让模拟账户在几轮极端行情里没有出现毁灭性回撤。

提示:风控规则一定要在系统初始化时就固定下来,不要中途因为"这次情况特殊"而临时放宽。我试过临时放宽一次,结果那笔模拟交易成了整个回测周期里亏损最大的一笔。

3. 研报Agent的信息处理链路:从原始数据到结构化摘要

3.1 数据源的选取与清洗

研报Agent的输入我选了三类:日频行情数据(开高低收、成交量)、公开公告文本、以及经过筛选的新闻摘要。行情数据用本地CSV文件模拟,公告和新闻用预先准备好的文本样本,整个系统不依赖任何实时接口,保证可复现。

清洗环节做了几件事:去掉重复公告、把长文本按段落切分、给每段打上时间戳和来源标签。这里有个细节值得说——时间戳对齐。如果一条新闻的发布时间是收盘后,那它只能影响下一个交易日的决策,不能用来解释当天的行情。我一开始忽略了这点,导致分析Agent经常"用未来的信息解释过去",回测结果虚高得离谱。

3.2 结构化摘要的字段设计

研报Agent的输出不是一段自由文本,而是一个固定字段的JSON结构:

{ "date": "2024-06-11", "symbol": "模拟标的A", "price_action": "放量上涨,突破近20日均线", "volume_note": "成交量较5日均值放大1.8倍", "news_items": [ {"time": "盘后", "summary": "行业需求预期上调", "impact": "待次日验证"} ], "risk_flags": ["短期涨幅偏大"] }

为什么要这么设计?因为下游的分析Agent如果拿到的是自由文本,每次解析的格式都可能不一样,后续逻辑就没法稳定复现。固定字段虽然前期麻烦,但让整个链路的可测试性提升了一个档次。

3.3 信息去重与优先级排序的实操技巧

实际跑的时候发现,同一件事经常被多个来源重复报道,如果不做去重,分析Agent会误以为这个信号很强。我的做法是给每条信息算一个简单的相似度,超过阈值的合并为一条,并在摘要里标注"多源确认"。

优先级排序则按"时效性+来源可靠性+与持仓相关性"三个维度打分。与当前持仓相关的信息权重最高,因为这类信息直接影响是否需要调整仓位。这个权重表我调了好几轮,最后发现把"与持仓相关性"的权重设到0.5左右比较合理,太高会让Agent只关注已有持仓而忽略新机会。

4. 分析Agent的逻辑链构建:让模型学会"自己反驳自己"

4.1 多空逻辑的双向生成

分析Agent最容易犯的毛病是"一根筋"——看到利好就一路看多,看到利空就一路看空。为了对抗这种倾向,我在提示词里强制要求它同时输出看多逻辑和看空逻辑,并且给每条逻辑标注置信度。

比如某天的输出是这样的:

  • 看多逻辑:均线多头排列(置信度0.7)、行业景气度回升(置信度0.6)
  • 看空逻辑:短期涨幅透支(置信度0.5)、成交量未能持续放大(置信度0.4)

最终的多空倾向不是简单相加,而是让模型自己权衡后给出一个综合判断,并说明"哪个逻辑如果被证伪,判断就要翻转"。这个"证伪条件"字段非常关键,它让决策Agent知道什么情况下应该退出。

4.2 置信度校准:避免模型过度自信

大模型有个通病,就是对自己的判断过度自信,动不动就给0.9以上的置信度。我做了两件事来校准:一是要求置信度必须附带依据,没有依据的置信度直接打折;二是引入历史准确率反馈,如果某个类型的逻辑在过去N次模拟中准确率只有50%,那它的置信度上限就被压到0.6。

这个校准机制让分析Agent的输出更接近真实的不确定性。实测下来,经过校准的置信度与后续模拟交易的实际胜率相关性明显更高,虽然绝对数值仍然偏乐观,但至少排序是对的。

4.3 反方论据的强制输出

这是我认为最有价值的一个设计。每次分析Agent给出结论后,必须再输出一段"如果我是反方,我会怎么反驳"。这段内容不参与信号生成,但会作为附件传给决策Agent和风控Agent。

效果很直接:决策Agent在看到反方论据后,会更谨慎地选择仓位;风控Agent则会把反方论据里的风险点纳入审核。有一次分析Agent强烈看多,但反方论据里提到"该标的近一个月已有三次冲高回落",风控Agent据此把建议仓位从20%压到了10%,后来那笔模拟交易果然没走出来。

5. 决策Agent的信号生成与风控Agent的硬约束

5.1 从分析结论到交易信号的映射

决策Agent拿到的输入包括:分析Agent的多空判断、置信度、证伪条件,以及当前模拟账户的持仓状态。它的输出是一个交易信号,包含方向(买/卖/持有)、目标仓位比例、以及触发条件。

映射逻辑我用的是一套简单的规则引擎加模型判断的混合方案。规则引擎负责处理硬性条件,比如"置信度低于0.5不操作""已有持仓且证伪条件未触发则持有";模型负责在规则允许的范围内做更细的权衡。这样既保证了基本纪律,又保留了一定的灵活性。

5.2 风控Agent的三道闸门

风控Agent的审核分三道闸门,任何一道不通过,信号就被拦截或修改:

第一道是单笔仓位闸门。检查目标仓位是否超过单标的上限。超过就按上限执行,并记录"信号被截断"。

第二道是组合集中度闸门。检查交易后同一行业的模拟持仓占比是否超过阈值。超过就要求决策Agent重新分配。

第三道是回撤保护闸门。检查账户当前回撤是否触发暂停线。触发则当日所有开仓信号一律拒绝,只允许平仓。

这三道闸门的参数都写在配置文件里,我调整过几轮。回撤保护线一开始设的是5%,后来发现太宽松,极端行情下还是会有较大回撤,最后收紧到3%。收紧之后模拟交易的频率下降了,但账户曲线明显更平滑。

5.3 模拟撮合的细节处理

信号通过风控后进入模拟撮合环节。这里有几个容易忽略的细节:成交价用次日开盘价还是当日收盘价?我最终选了次日开盘价,因为信号是基于当日收盘后生成的信息,用次日开盘价更符合实际可执行性。滑点方面,我设了0.1%的固定滑点,虽然模拟盘没有真实冲击成本,但加上滑点能让回测结果更保守。

手续费按单边0.03%计算,这个数值不高,但长期累积下来对高频策略的影响不小。我试过把手续费调高到0.1%做压力测试,结果一些原本盈利的短线信号直接变成亏损,这说明策略对交易成本非常敏感。

6. 实测中暴露的问题与我的修复过程

6.1 信息过载导致的分析瘫痪

系统跑第一周就遇到一个问题:某天公告和新闻特别多,研报Agent输出了三十多条信息,分析Agent处理完之后给出了一个"多空交织、方向不明"的结论,决策Agent直接卡住不输出信号。

排查后发现是信息没有做分层。我的修复方案是给研报Agent加了一个"重要性过滤"步骤,只把影响程度在前30%的信息传给分析Agent,其余信息作为背景存档。这样既避免了信息过载,又保留了完整记录供事后复盘。

6.2 风控规则与决策信号的冲突

有一次决策Agent生成买入信号,风控Agent因为集中度超限给拦了,但决策Agent在下一轮又生成了同样的信号,形成死循环。这个问题本质上是两个Agent之间缺少反馈机制。

修复方式是在风控Agent拦截信号时,把拦截原因写回共享上下文,决策Agent在生成新信号前必须先读取最近的拦截记录。如果同一原因连续拦截两次,决策Agent必须调整方向或降低仓位,不能重复提交。

6.3 回测结果与模拟盘结果的偏差

回测时账户曲线很漂亮,但切到逐日模拟后收益明显下降。排查下来有两个原因:一是回测用了未来数据(前面提到的时间戳问题),二是回测没有模拟"信号被风控拦截"的情况。

修复后我把回测引擎和模拟引擎统一到同一套风控规则下,并且严格按时间戳对齐信息。修正后的回测结果虽然不如之前好看,但和逐日模拟的结果基本一致了,这才是有参考价值的。

7. 这套系统跑稳之后的一些经验

7.1 关于Agent粒度的取舍

四个Agent是我试下来比较平衡的粒度。再拆细,比如把研报Agent拆成行情Agent和新闻Agent,通信成本会明显上升,而且两个Agent的信息在分析层本来就要融合,拆开反而增加复杂度。再合并,比如把分析和决策合成一个,又会回到职责不清的老问题。所以我的建议是:按"信息处理、逻辑推演、信号生成、风险约束"这四个不可再分的职能来划分Agent,基本不会错。

7.2 提示词里必须写死的几条规则

跑了一段时间后,我把几条规则直接写死在各个Agent的提示词里,不再依赖模型自由发挥:分析Agent必须输出反方论据;决策Agent必须说明信号的理由和证伪条件;风控Agent只执行规则不做判断。这几条写死之后,系统的稳定性提升非常明显。

7.3 日志与复盘的重要性

每个Agent的输入输出我都做了完整日志,按交易日归档。一开始觉得日志只是调试用,后来发现它是复盘的核心资产。当某笔模拟交易亏损时,我可以沿着日志链路回溯:是研报Agent漏了关键信息,还是分析Agent的逻辑有漏洞,还是风控规则需要调整。没有日志,这套多Agent系统就是一个黑箱,根本没法迭代。

7.4 对想上手的人的几点提醒

如果你也想搭一套类似的系统,我的建议是从最小的闭环开始:先跑通"研报→分析→决策→风控→模拟撮合"这条链路,哪怕每个Agent的逻辑都很粗糙。跑通之后再逐个优化,比一上来就追求完美要快得多。另外,风控规则一定要在系统跑起来之前就定好,不要等出了问题再补,那时候你已经在心理上接受了不设约束的状态,补起来会很难。

最后说一个我自己的体会:这套系统最大的价值不是帮我"赚"了多少模拟收益,而是让我看清了自己在交易决策中的思维漏洞。当分析Agent把反方论据摆在我面前时,我经常发现那些理由正是我实盘时会刻意忽略的。把决策流程拆解给多个Agent,本质上是在用工程手段对抗人性弱点,这件事本身就值得做。

相关新闻

分数阶统一混沌系统MATLAB程序:从跑不起来到稳定复现吸引子

分数阶统一混沌系统MATLAB程序:从跑不起来到稳定复现吸引子

简介:这份文档资料面向混沌系统与分数阶微积分方向的学习者和研究者,提供分数阶统一混沌系统的MATLAB实现程序,帮助读者理解分数阶导数在非线性动力学建模中的具体落地方式。资源包内仅含1个doc文件,约24KB,以代码与文…

2026/10/22 17:08:07 阅读更多 →
vim进阶操作、进制转换与C语言数据类型:嵌入式开发核心基本功

vim进阶操作、进制转换与C语言数据类型:嵌入式开发核心基本功

在嵌入式圈子里待久了,你会发现一个规律:真正决定项目顺不顺利的,往往不是那些看起来很炫的算法,而是几个最基础的东西——编辑器顺不顺手、进制换算是不是迷糊、变量类型用得对不对。标题里的“vim的进阶操作;进制转换…

2026/10/22 17:08:09 阅读更多 →
C++贪吃蛇增强版教程:VC6.0环境下的游戏源码与避坑指南

C++贪吃蛇增强版教程:VC6.0环境下的游戏源码与避坑指南

简介:一款基于VC6.0开发的增强版贪吃蛇游戏,面向C初学者和Windows图形界面开发入门者,用于实践面向对象编程、链表数据结构及基本游戏逻辑。项目采用双类设计,蛇体以单链表组织,清晰展示了节点创建、插入、删除和遍历等…

2026/10/21 8:10:21 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/22 10:18:38 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/22 11:01:53 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/22 9:44:47 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/22 10:42:00 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/22 10:40:08 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/22 10:56:37 阅读更多 →

日新闻

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/22 1:47:45 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/21 21:32:28 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/22 5:12:39 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 21:50:56 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 21:51:55 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 16:24:48 阅读更多 →