这个系列写到第六期我先把前面干的事简单捋一遍第一期搭数据底座第二期定模型选型第三四期把Agent框架跑通、把提示词调到能稳定输出结构化结论第五期重点做了单Agent的深度分析流程。今天这期题目叫选股器的实现[六]核心就一件事——把之前的单兵作战改成多Agent协同并把输出从分析报告变成可执行建议顺带把回测、部署、监控这条链路上所有踩过的坑一次性讲清楚。说实话做到这一步我才觉得Stock Agent AI模型的选股器这个项目真正有了产品雏形。前五期产出的东西更像一个能回答问题的分析工具到了第六期它才勉强敢说自己是选股器。下面讲的每一个模块都是我在模拟项目X里跑过、改过、推翻重来过的方案未必是最优解但绝对是可以直接照着落地的主线。这篇文章适合两类人一类是正在做LLM Agent量化投研应用、卡在跑通Demo但不敢实盘阶段的开发者另一类是传统量化研究者想看看大模型Agent这套东西能不能融进现有框架。两类人看完都能拿到对应的操作方案。1. 第六期补什么选股Agent从能跑到能信1.1 前五期留下了什么还缺什么先说我当时的项目状态。五期结束时我已经有一个能用的单Agent选股流程输入一个股票池Agent会按预置的分析框架抓取财务数据、行情数据、舆情信息最后生成一份带结论和理由的分析报告。跑了几百个样本报告质量看起来不错结构化字段也基本稳定。但把它当选股器用问题立刻暴露出来。第一单个Agent面对不同行业、不同市场风格时提示词只能折中结果是分析框架千人一面对成长股和周期股用同一套估值逻辑很多结论自己都在打架。第二Agent输出的是一份报告不是一组决策下游没法直接消费——我需要的是这个标的给多少分、给多大权重、什么条件下剔除而不是一段该公司具备一定成长性这种正确的废话。第三整个流程没有验证闭环你不知道Agent上一周给的选股结果到底对不对更不知道它的分析逻辑什么时候开始失效。所以第六期的目标非常明确把单Agent重构为多Agent协同架构同时补上从信号到决策、从回测到监控的整条生产链路。这个能跑到能信的跨越工程量和难度比前五期加起来都大但它才是一个选股器真正该有的样子。1.2 第六期的整体架构设计我最终落地的架构分五层数据接入层统一封装行情、财务、舆情三类数据源提供标准接口屏蔽不同数据格式差异。Agent执行层包含调度编排器、若干专业分析Agent、一个风险复核Agent通过结构化工具调用协同。信号聚合层把各Agent的输出做归一化、加权融合生成综合评分和评估结论。决策映射层把综合评分映射为仓位建议叠加风险约束条件输出可执行指令。验证反馈层回测引擎和在线监控模块持续记录信号表现反哺提示词和权重调整。这层架构里最关键的设计决策是Agent之间的通信不走自然语言走结构化JSON。当时我也纠结过让Agent自由对话看起来更智能但实际跑下来发现两大问题——token消耗成倍增长而且对话链路一长语义漂移严重互相引用对方结论时经常张冠李戴。改成固定schema的JSON消息传递后每个Agent只消费上游传入的字段产出自己负责的字段问题立刻少了大半。这是个在实践里试错试出来的结论不是看论文看出来的。2. 多Agent协同基本面、技术面、情绪面如何分工2.1 为什么单一Agent撑不住选股这件事选股这件事天然是多目标的。基本面要看盈利能力、成长性、财务健康度技术面要看趋势、动量、量价配合情绪面要留意舆情热度、资金流向、市场关注度变化。任何一个专业分析师都很难同时把这三块都做深LLM Agent也一样——你让一个Agent既算DCF又数K线形态再去看新闻情感它的注意力就被摊薄了输出的每一项都是浅尝辄止。更重要的问题是提示词会互相干扰。同一个模型实例里一会儿要求它严格依据财务数据一会儿要求它尊重市场情绪它很容易在长上下文里迷失优先级。我实测过一个典型失败案例单Agent分析某只模拟标的时候因为近期舆情热度过高它在基本面结论里也悄悄提高了估值容忍度这种情绪污染基本面判断的现象在单Agent里极难根除。把职责拆给不同的Agent实例每个实例只维护一套判断标准这个问题就从架构层面解决了。2.2 三个专业Agent的职责边界与提示词设计我最后保留了三个分析Agent加一个复核Agent分工如下基本面AgentFundamental Agent输入财务报告、行业对比数据输出盈利质量、成长性、财务风险三项评分每项附带不超过200字的核心论据。技术面AgentTechnical Agent输入量价序列和技术指标输出趋势状态、动量强度、波动风险三项评分。明确禁止它讨论估值和基本面。情绪面AgentSentiment Agent输入新闻摘要、舆情热度、资金流向数据输出情绪极性、关注度变化、潜在反向指标三项评分。风险复核AgentRisk Checker接收三个Agent的评分和论据专门挑刺检查逻辑矛盾、数据时间错配、过度自信等十类问题。提示词设计上有一个核心原则每个Agent的提示词里都要有两条硬约束——只依据输入数据说话和判断不确定时必须降低评分置信度。前一条防幻觉后一条防Agent为了显得专业而给出极端结论。我还为每个Agent配了独立的温度参数基本面Agent用0.2严格控制创造性情绪面Agent放到0.5允许它稍微灵活一些。这套参数组合是跑了大量样本调出来的后面还会细说。2.3 调度编排器的运转逻辑编排器Orchestrator是整个协同架构的中枢它不负责分析只负责调度和数据路由。一次完整的选股流程大概是这样编排器接收股票池清单先做数据预检剔除停牌、数据缺失的标的。并行调用三个分析Agent每个Agent只拿到自己需要的数据子集。这里我用了真正的并行处理而不是顺序执行三个Agent互不依赖串行跑一遍要40秒并行只要15秒。三个Agent的评分结果进入风险复核Agent复核Agent只输出发现问题列表不改写任何评分。编排器汇总所有结果交给信号聚合模块做下一步处理。这套流程看起来不复杂但工程细节都在数据路由上。比如技术面Agent需要的是前复权行情基本面Agent需要的是最新的已披露财报而不是预估值情绪面Agent要的是过滤掉重复转载的新闻。如果数据路由错了Agent分析得再严谨也是空转。我在编排器里加了一层数据血缘记录每个评分都能追溯到用了哪批数据、什么时间拉取的复盘时非常有用。3. 特征数据的脏与净实盘数据处理的几个硬骨头3.1 停牌、复权、财报口径三个最常见的脏数据陷阱多Agent架构跑起来之后第一个让我头疼的环节反而是数据。写Agent用了两周清理数据用了两个月这句话真不是段子。停牌问题最隐蔽。很多行情接口在股票停牌期间会返回最后一笔价格如果Agent不知道标的已经停牌了技术面Agent会把一根横盘K线当成波动极低的信号进而给出风险偏低的结论。我的处理是在数据预检阶段就把停牌标记传给下游并让技术面Agent在停牌超过5个交易日时直接输出数据不足而不强行评分。复权问题则是老生常谈但永远有人踩。用不复权数据算动量遇到除权除息日会出现一个假摔的大阴线技术面Agent会误判趋势破位。我统一使用前复权数据做技术分析但这里有个细节前复权价格会随着最新行情变化而变化所以同一只标的昨天的前复权序列和今天的可能不一样。这意味着每次回测都必须固定一个复权基准日否则结果不可复现。我在数据层加了复权基准日期字段每次计算都强制指定。财报口径最容易被忽略。不同数据源对营收的定义可能不同有的含其他业务收入有的是主营业务收入直接混用会导致基本面Agent的比较基准错乱。我统一采用审计后的定期报告数据并规定只有报告发布日期之后的数据才允许被Agent引用从源头避免未来函数问题。3.2 数据质量验证与Agent输入的校验机制数据清理做到位之后还需要一道自动化校验防线。我写了一个数据质量检查模块在每次调度前执行四类检查完整性检查关键字段缺失率超过阈值则拒绝分析。时效性检查财务数据是否晚于最新报告期行情数据是否最新交易日。一致性检查同一标的不同数据源的关键字段如总股本、收盘价比对偏差超过0.5%告警。异常值检查单日涨跌幅超过限幅、市盈率出现负值或极端值标记为可疑数据。这套校验机制最有价值的部分是它能挡掉很多Agent幻觉的诱因。我做了个对照实验同一批标的数据在不做任何校验直接喂给Agent运行时技术面Agent对停牌标的给出信号的概率大约是18%加上停牌标记后降到1%以下。很多Agent的错误结论不是模型笨而是底层数据本身就在误导它。3.3 特征工程让Agent的产出更稳定的三个小技巧数据干净之后我还对喂给Agent的特征做了几处优化效果非常明显。一个是把所有原始数值统一转成相对值——比如不直接给PE绝对值而是给PE处于近三年分位数的百分比Agent对相对位置的理解远比对绝对数值的解读稳定。另一个是给关键财务指标附带历史趋势方向比如毛利率连续三个季度上升这种带趋势描述的特征可以显著降低Agent做纵向比较的负担。第三个是标准化日期表达全部用时间戳避免Agent把2024年3月和去年第一季度这类表达混淆。这些特征工程的改动虽然看起来不起眼但对整个系统的稳定性贡献很大。我统计过同一标的重复分析5次特征优化前综合评分方差在12分左右优化后降到5分以内。选股器如果每次跑的结论都不一样那它就没有任何使用价值这个稳定性指标直接决定了系统能不能进入下一阶段。4. 回测框架设计与过拟合防御4.1 为什么不能直接拿历史收益说话选股器改造成多Agent之后我面临一个灵魂拷问它选出来的股票到底靠不靠谱最直接的办法是拿历史数据回测看它当年能不能选出涨得好的股票。但这里有个巨大的陷阱——Agent的训练语料里包含了大量历史信息它可能不是在分析历史数据而是在回忆哪只股票当年涨过。这种记忆驱动的选股在回测里会表现得异常优秀实盘里却完全失效。我管这个问题叫Agent背答案。识别方法很粗暴把股票池里的公司名称全部匿名化为代号只保留财务和行情特征重新跑一遍回测。如果匿名前后的表现差异巨大说明Agent在依赖公司名称的记忆而不是特征分析。我实测下来早期版本确实存在这个问题匿名后胜率掉了将近两成。解决方式是在回测时对Agent屏蔽标的名称同时要求它不得在工具调用时按名称检索历史信息。这个改动让它真正回到了看数据说话的轨道上。4.2 Walk-Forward验证与样本划分的正确姿势传统的时间序列回测怕未来函数Agent回测更怕。我用的是Walk-Forward滚动验证框架简单说就是分段滚动用前6个月数据做训练或校准Agent的参数然后让Agent预测后3个月预测完把窗口往前推3个月如此滚动下去。每段预测都被框在只能使用当时可得数据的约束里这样可以最大程度还原实盘的信息可得性。这里有个容易翻车的地方Agent的提示词和权重如果在滚动过程中持续人工调整就会引入前视偏差。我的做法是先把整段历史区间划分成开发期和验证期开发期可以随便调参验证期一次都不允许动全部调优完成后才在验证期跑最终成绩。这个纪律很反人性因为验证期的结果出来发现不行时会特别想回去改参数但一旦破了这个规矩回测数据就完全失真了。4.3 交易成本与滑点建模的保守策略很多回测框架默认的交易成本是一边0.1%滑点按固定比例。对高频交易可能够用对选股器这种周频或双周频调仓的策略成本建模必须更细。我发现市场上的实际交易成本受流动性和冲击成本影响很大尤其是小市值标的挂单量一大就会把价格打穿。我的做法是建一个分层成本模型按标的日均成交金额分成三档流动性好的档位双边成本按0.3%计流动性中等的按0.8%流动性差的按1.5%同时还要再叠加一个与换手率成正比的冲击成本项。这个模型明显比固定成本保守但它有一个好处——如果策略在保守成本假设下还能盈利实盘表现大概率会更好。做AI选股器的人尤其容易死在成本假设上因为Agent选的标的往往有风格偏好经常集中在小市值或者高弹性区间这些标的的滑点可能远超直觉。5. 信号聚合到仓位映射Agent输出如何变成可执行建议5.1 多Agent评分的归一化与加权融合三个分析Agent的输出都是0到100的评分但它们的分布特征完全不同。基本面Agent打分会比较分散因为财务指标的个体差异大技术面Agent的分数容易集中在40到70之间情绪面Agent则可能出现极端值例如舆情爆发的标的直接打到90分。如果直接加权平均情绪面的极端值会主导结果。我把三个评分先做截面标准化处理即计算同一期股票池内各评分的z-score再做加权融合。权重设定上我一开始拍脑袋定了基本面0.4、技术面0.3、情绪面0.3回测后发现这个比例在不同市场风格下的适应性不够。后来改成动态权重用近60个交易日各Agent评分的IC均值来确定下一期权重IC高的Agent分到的权重自然就大。这套动态权重机制是第六期里投产效果最明显的一个模块。5.2 从综合评分到仓位建议的映射规则综合评分出来之后下一个环节是把分数映射成仓位建议。我的映射规则设计得相对保守分档处理综合分前10%且风险复核无重大问题的标的建议配置档单标的上限5%仓位。综合分前10%但复核有瑕疵的标的降档处理按半仓建议。综合分处于前50%的标的只进入观察池不给予实际建仓建议。综合分后50%的标的明确给出回避或减仓建议。这个映射规则看起来机械但它最大的价值是让Agent的输出有了明确的操作含义而不是停留在值得关注这种模糊层面。选股器既然是器就必须输出可执行的决策这是它和分析师的本质区别。当然仓位映射规则必须与实盘的账户约束对齐比如个股集中度上限、行业暴露上限、总仓位限制。我把这些约束写成一个独立的约束检查模块任何Agent输出在落袋之前都必须过一次约束检查不满足就直接拦截。5.3 下游对接输出Schema设计与异常降级为了让仓位建议能直接被交易系统消费我设计了一套固定的输出Schema核心字段包括标的代码、建议动作买入/持有/回避/减仓、置信度、建议仓位、核心逻辑摘要、风险提示列表。每个字段都有枚举约束和取值范围Agent自由发挥的空间被压缩到最低。降级处理是这里不能省的一环。Agent偶尔会给出明显偏离常理的输出例如对一只停牌标的给出买入建议。我在下游设了三道防线第一道是schema校验字段不合规的直接拒收第二道是规则引擎命中硬规则的输出被自动修正或剔除第三道是人工复核队列置信度低于阈值或风险提示达到一定数量的标的自动进入待人工确认列表。这套降级机制上线后系统的可靠输出率从89%提升到了97%以上剩下的2%到3%异常情况则基本都被挡在了交易执行之前。6. 上线后的监控与迭代模型漂移和Agent幻觉怎么管6.1 信号质量跟踪与收益归因选股器上线不是终点监控才是长期的日常工作。我搭了一套信号质量看板核心指标有三个信号IC值评分与未来收益的相关性、分档命中率高分组股票在持有期跑赢基准的比例、换手稳定性相邻两期建议的标的变动比例。这三个指标能分别反映选股能力、策略有效性和调仓稳定性。收益归因同样重要否则你根本不知道策略赚的是什么钱。我把组合的超额收益拆解成几个成分行业配置贡献、风格因子贡献大小盘、成长价值、个股选择贡献。拆完经常会发现意外情况——有时候Agent辛苦选股的贡献是负的超额收益全部来自行业暴露这种信息对判断Agent的真实能力非常关键。有一期数据就显示技术面Agent的评分在震荡市里贡献为正但核心收益来源其实是高波动风格暴露并非真正的个股挑选能力这促使我把技术面Agent的提示词里加了一条风格中性约束。6.2 Agent幻觉的在线识别与降级策略LLM幻觉问题在选股场景里是绝对不能放过的。我遇到过Agent言之凿凿地引用一个不存在的财务指标自由现金流利润率还给出了具体数值在离线验证时才发现这个指标完全是我虚构的。在线状态下幻觉会更难防因为没有人会逐条核对。我的对策是给Agent配置的工具调用加引用必须带来源的硬要求每个数据点必须关联到具体的数据集名称和拉取时间无法溯源的数据点直接被判为不信任。另外我准备了一组探针题目定期用已知答案的标的测试各Agent如果某个Agent对探针题的回答开始偏离正确答案说明它的能力或状态出了问题就自动降级为参考模式并触发告警。这套在线检测机制最大的价值不是抓幻觉本身而是让你对系统能保持信任这是AI系统能否长期使用的心理基础。6.3 迭代节奏与数据回放的闭环选股器的持续迭代不能靠拍脑袋我采用了一个简单但严格的迭代流程每次想改动提示词、权重或数据逻辑都在一个固定的离线快照数据集上跑全量回放对比改动前后的信号质量指标。快照数据集每两周更新一次包含历史行情、财报、舆情和当时的Agent完整决策记录。这套回放机制最有价值的能力是重现问题。比如某段时间情绪面Agent频繁给出极端评分我可以把当时的数据和决策记录完整回溯逐个环节定位是数据输入问题还是提示词问题还是模型波动问题。有一次我发现情绪面评分在某类新闻类型上系统性偏高追查后确认是新闻去重模块把同一事件的重复报道没有完全过滤导致情绪信号被放大。没有回放机制这种问题可能要在实盘亏损之后才暴露。写在最后第六期做完之后我的几点真实感受这个系列做到现在最大的体会是AI选股器的核心难点不在模型而在工程。模型能力半年一迭代但数据治理、回测纪律、监控闭环这些工程问题一个都躲不掉。第六期最大的收获不是多Agent跑通了而是我建了一套可以持续修正自己错误的系统框架——信号聚合有回放输出有校验质量有监控迭代有纪律。最后分享一个实操层面的建议如果你也要做类似的Agent选股系统别急着追求复杂的Agent间对话机制先把结构化消息、数据血缘、输出Schema校验这三件事做扎实。我见过太多项目死在了Agent之间聊得太嗨但下游根本不敢用的阶段。把这些地基打好后面加什么能力都顺手。这套系统我会继续维护后续的迭代方向大概率会往自适应决策方向走——让Agent根据市场环境变化自动调整分析框架的侧重点到时候再来更新这个系列。