资讯动态

从零手搓投资Agent:三层架构与百亿token实战解析

发布时间:2026/10/17 9:47:44 来源:尧图企业网站定制
1. 从零拆解一个投资Agent的骨架设计1.1 为什么是“手搓”而不是“调包”看到“百亿token”这个量级很多人的第一反应是“这得烧多少钱”。但真正值得聊的不是成本而是为什么有人愿意花这么多token去手搓一个投资Agent而不是直接调用现成的接口。我自己在这个方向上摸索了大半年踩过的坑足够填满一个中型项目的需求文档。先说结论投资决策这件事通用大模型直接给的建议基本不能用。原因不复杂——通用模型的训练目标是“生成看起来合理的文本”而投资决策需要的是“在不确定条件下做出一致性判断”。这两件事的底层逻辑完全不同。手搓的核心价值在于控制权。你需要控制它看什么数据、用什么框架分析、在什么条件下给出什么结论、以及最关键的——什么时候选择不操作。调包方案在这些维度上几乎全是黑盒你没法审计它的推理链条更没法在它犯错之后定位问题。另一个现实原因是数据管线的特殊性。投资Agent需要接入的数据源五花八门行情数据、财报文本、公告、研报摘要、宏观指标、舆情信号。这些数据的格式、更新频率、可信度差异极大通用接口根本处理不了这种异构性。你必须自己写清洗、对齐、降级、缓存的全套逻辑。所以“手搓”不是炫技是被需求逼出来的。百亿token的消耗量大头不在推理而在反复的数据预处理、上下文构建和回测验证上。1.2 整体架构三层分离的设计哲学我最终采用的架构是三层分离数据层、推理层、决策层。这个划分不是拍脑袋定的而是从实际调试中总结出来的。数据层负责所有“脏活累活”拉取原始数据、清洗异常值、对齐时间戳、处理缺失值、生成标准化特征。这一层的输出必须是确定性的、可复现的。同样的输入无论跑多少次输出必须完全一致。为什么因为如果数据层有随机性后面推理层出了问题你根本不知道是数据的问题还是模型的问题。推理层是真正消耗token的地方。它接收数据层传来的结构化特征结合预设的分析框架生成对当前市场状态的判断。这里的关键设计是多轮推理交叉验证。单次推理的结论不可靠我会让模型从不同角度分析同一个问题然后对比结论的一致性。如果多个角度的结论矛盾就标记为“不确定”进入人工复核队列。决策层最薄但最重要。它把推理层的输出转化为具体的操作建议同时附带置信度、仓位建议、止损条件。这一层的核心逻辑是规则引擎模型判断的混合。纯规则太死板纯模型太飘混合方案在实际回测中表现最稳。三层之间的接口设计有个原则数据层不依赖推理层推理层不依赖决策层。每一层都可以独立测试和替换。这个原则在后期迭代时救了我无数次——当我想换一个推理框架时只需要保证输入输出格式不变决策层完全不用动。1.3 百亿token到底花在哪了很多人好奇token消耗的分布。我拉了一下实际数据大致比例如下环节token占比说明数据预处理与特征生成约35%文本类数据的摘要、结构化、异常检测多轮推理与交叉验证约40%核心分析环节通常需要3-5轮回测与验证约15%历史场景重放验证决策逻辑报告生成与解释约10%把结论翻译成人能看懂的话数据预处理占这么大比例可能出乎很多人意料。但实际就是这样——把非结构化数据变成模型能吃的格式比模型本身的分析更费劲。一份财报PDF要提取关键财务指标、识别管理层语气变化、对比历史同期数据、检测异常表述这些都需要模型反复处理。多轮推理的消耗也可观。我的设计是每个决策点至少跑三轮第一轮从基本面角度分析第二轮从技术面角度分析第三轮从风险角度做压力测试。三轮结论汇总后再做一致性判断。这个设计让token消耗翻了3倍但决策质量提升非常明显。2. 数据层的核心细节与实操要点2.1 数据源接入的优先级排序数据源不是越多越好。我一开始贪多接了十几个源结果光维护数据管线的稳定性就耗掉了大半精力。后来做了减法按可靠性、时效性、信息增量三个维度排序只保留最核心的几类。第一优先级是行情数据。这是所有分析的基础必须保证高可用和低延迟。我的做法是主备双源主源出问题自动切备源切换过程对上层透明。行情数据的清洗重点是异常值检测——比如某只标的突然出现偏离市场均值几个标准差的波动大概率是数据错误而非真实行情。第二优先级是公告和财报文本。这类数据的难点在于格式不统一。不同来源的公告排版差异极大有的用表格有的用纯文本有的夹杂大量无关信息。我的处理方式是先用规则做粗筛再用模型做精细提取。规则负责定位关键段落模型负责理解语义。第三优先级是宏观和舆情数据。这类数据信噪比低但有时能提供领先信号。我的做法是只提取变化率而非绝对值——比如舆情情绪指数从0.6降到0.4这个变化本身比0.4这个数值更有意义。实操心得数据源接入前先花时间做历史数据回填测试。用过去一年的数据跑一遍看清洗后的数据是否还有明显异常。这个步骤能提前发现80%的管线问题。2.2 文本数据的结构化处理流程财报和公告的文本处理是整个数据层最耗token的环节。我的流程分四步第一步是分块。把长文本按语义切成200-500字的块每块附带上下文元数据所属章节、时间、涉及主体。分块的质量直接影响后续提取效果。切得太碎会丢失上下文切得太大会引入噪声。第二步是并行提取。每个块独立送入模型提取预设的字段财务指标、管理层表述、风险提示、未来指引。这里用结构化输出约束模型要求它按固定JSON格式返回。如果返回格式不对自动重试。第三步是交叉校验。同一份财报的不同块可能提到同一个指标如果数值不一致标记为冲突进入人工复核。这个机制帮我抓到了好几次数据源本身的错误。第四步是时序对齐。把提取出的指标按时间轴排列生成时间序列。这一步的关键是处理财报的发布延迟——Q1的数据可能在Q2才发布对齐时必须用发布日而非报告期。# 文本分块的简化逻辑 def chunk_text(text, max_len400, overlap50): chunks [] start 0 while start len(text): end min(start max_len, len(text)) # 尽量在句号处切断 if end len(text): last_period text.rfind(。, start, end) if last_period start max_len // 2: end last_period 1 chunks.append({ text: text[start:end], start: start, end: end }) start end - overlap return chunks2.3 特征工程的取舍逻辑特征不是越多越好。我试过堆到200多个特征结果模型过拟合严重回测表现和实盘差距巨大。后来砍到40个左右反而稳定了。保留的特征分四类估值类市盈率、市净率、股息率等但只用历史分位数而非绝对值。绝对值在不同市场环境下不可比分位数能反映当前处于历史什么位置。质量类ROE、毛利率、现金流覆盖等重点看变化趋势而非单期数值。动量类近期涨跌幅、成交量变化等用于判断市场情绪。风险类波动率、最大回撤、下行风险等用于仓位控制。砍掉的特征主要是两类一是高度相关的冗余特征比如同时保留市盈率和市销率信息增量很小二是逻辑上说不通的特征比如某些技术指标在基本面分析框架里没有合理解释。注意事项特征选择必须基于逻辑而非统计。统计上显著但逻辑上说不通的特征在样本外大概率失效。我踩过这个坑——某个特征在回测中贡献很大实盘却完全没用后来发现它只是拟合了特定时期的噪声。3. 推理层的多轮交叉验证机制3.1 三轮推理的具体设计推理层的核心是多角度分析一致性判断。我的设计是每个决策点跑三轮每轮有不同的分析框架和输入侧重。第一轮基本面视角。输入主要是财务数据、估值指标、行业对比。模型的任务是回答“当前价格是否合理反映了基本面”。这一轮的输出是一个估值判断低估、合理、高估附带理由。第二轮技术面视角。输入是价格序列、成交量、动量指标。模型的任务是判断“当前市场情绪和资金流向”。输出是一个趋势判断上行、震荡、下行附带关键价位。第三轮风险视角。输入是波动率、相关性矩阵、宏观指标。模型的任务是回答“当前仓位的风险敞口是否可控”。输出是一个风险等级和建议仓位上限。三轮独立跑完后再做一致性判断。如果三轮结论方向一致置信度高如果两轮一致一轮矛盾置信度中等如果三轮各说各话标记为“不确定”不生成操作建议。3.2 提示词设计的核心原则提示词的质量直接决定推理质量。我总结了几条原则原则一角色定义要具体。不要说“你是一个分析师”而要说“你是一个管理过十亿规模组合、经历过两轮完整市场周期的基本面分析师”。角色越具体模型的输出越聚焦。原则二输出格式要约束。每个推理任务都要求模型按固定JSON格式返回包含结论、置信度、关键理由、反面证据四个字段。特别是“反面证据”强制模型考虑对立面能显著减少片面结论。原则三引入“不知道”选项。很多提示词设计逼着模型给结论但实际中“信息不足”是常见状态。我在每个判断项都加了“不确定”选项并统计模型选择“不确定”的频率。如果频率过高说明输入数据质量有问题。原则四少样本示例要精选。给模型看的示例必须覆盖典型场景包括成功案例和失败案例。只给成功案例会让模型过度自信。# 推理提示词的简化模板 PROMPT_TEMPLATE 你是一个{role}当前需要分析{target}。 输入数据 {data} 请从{perspective}角度分析按以下JSON格式返回 {{ conclusion: 看多/看空/中性/不确定, confidence: 0.0-1.0, key_reasons: [理由1, 理由2], counter_evidence: [反面证据1, 反面证据2], data_quality: 充足/一般/不足 }} 注意如果关键数据缺失conclusion必须填不确定。 3.3 一致性判断的量化方法三轮结论汇总后需要量化一致性。我的做法是加权投票每轮结论映射为数值看多1中性0看空-1不确定0每轮权重根据历史准确率动态调整。某轮在近期回测中表现好权重就高加权和超过阈值比如0.5才生成看多建议低于-0.5生成看空建议中间区域不操作这个机制的好处是可解释、可审计。每次决策都能追溯到三轮各自的结论和权重出了问题能快速定位是哪一轮的判断偏了。实操心得一致性判断的阈值需要根据市场状态动态调整。震荡市中阈值调高减少无效操作趋势市中阈值调低避免错过机会。这个调整逻辑本身也可以交给模型判断但要有规则兜底。4. 决策层的规则与模型混合方案4.1 规则引擎负责什么决策层最忌讳纯模型驱动。模型会犯错而且犯错的方式往往很隐蔽。我的方案是规则引擎做底线模型判断做增量。规则引擎负责三件事第一是仓位硬约束。单标的仓位不超过总资产的X%单行业不超过Y%总仓位不超过Z%。这些数字是风控底线任何模型判断都不能突破。我见过太多因为“模型特别看好”就重仓单一标的的案例结局都不太好。第二是止损止盈规则。亏损超过阈值强制减仓盈利超过阈值分批止盈。这些规则不依赖模型判断纯粹基于价格触发。模型可以建议调整阈值但不能取消规则。第三是流动性检查。如果某标的近期成交量萎缩到阈值以下自动降低仓位上限。这个规则防止在流动性枯竭时无法退出。4.2 模型判断的增量价值规则引擎管底线模型判断管优化。具体来说模型在三个地方提供增量一是仓位微调。规则给出仓位上限模型根据当前市场状态建议实际仓位。比如上限是10%模型判断当前风险较高建议降到6%。二是时机选择。规则不判断什么时候操作模型根据多轮推理结论建议立即执行、分批执行还是等待。三是异常识别。模型能发现规则覆盖不到的异常模式。比如某标的的基本面数据突然出现规则未定义的异常组合模型会标记出来进入人工复核。4.3 决策输出的完整结构每次决策输出包含以下字段字段类型说明action枚举买入/卖出/持有/观望target字符串标的标识position_ratio浮点数建议仓位比例confidence浮点数综合置信度stop_loss浮点数止损价位take_profit浮点数止盈价位reasoning字符串决策理由摘要risk_flags列表风险标记这个结构的设计原则是可执行、可追溯、可回测。每个字段都有明确含义回测时能逐项验证。5. 回测验证与常见问题排查5.1 回测框架的设计要点回测不是简单跑历史数据。我的框架有几个关键设计第一是防止未来函数。所有数据必须按实际可获得时间对齐。财报数据用发布日而非报告期宏观数据用公布日而非统计期。这个细节不注意回测结果会严重虚高。第二是模拟真实交易成本。佣金、印花税、滑点都要计入。滑点按成交量的函数模拟——成交量越大滑点越高。第三是分段验证。把历史数据分成多段每段独立回测看策略在不同市场环境下的表现。只跑一段完整历史容易过拟合。第四是压力测试。专门挑历史上的极端行情段跑看最大回撤和恢复时间。这个比平均收益重要得多。5.2 常见问题速查表问题现象可能原因排查方向解决方法回测收益高但实盘差过拟合或未来函数检查数据对齐、特征数量减少特征、严格时序对齐模型频繁输出“不确定”输入数据质量差检查数据完整性和时效性修复数据管线、增加数据源决策一致性低三轮推理框架冲突检查各轮提示词和输入调整框架权重或合并框架token消耗异常高数据预处理重复调用检查缓存机制增加中间结果缓存止损频繁触发阈值设置过紧分析波动率分布按波动率动态调整阈值5.3 踩过的坑与避坑技巧坑一数据源时间戳不统一。不同数据源的时间戳格式和时区不一样对齐时容易出错。我的解法是统一转换为UTC时间戳并在数据层入口做强制校验。坑二模型对同一输入输出不一致。即使温度设为0不同批次的输出也可能有细微差异。我的解法是关键决策跑三次取多数并在提示词中明确要求确定性输出。坑三回测中的幸存者偏差。只回测当前存在的标的忽略了已退市的。我的解法是使用完整历史标的池包括已退市的。坑四过度依赖单一数据源。某个数据源出问题整个决策链就断了。我的解法是关键数据双源冗余主备自动切换。避坑技巧每次修改推理框架或提示词后必须跑一遍完整的回归测试。我维护了一个包含50个典型场景的测试集任何改动都要通过全部测试才能上线。这个习惯帮我避免了多次“改一个地方坏三个地方”的事故。6. 实际运行中的经验与迭代方向6.1 运行监控的关键指标系统上线后我每天盯几个核心指标决策覆盖率有多少决策点生成了明确建议多少标记为“不确定”。覆盖率过低说明数据或推理有问题。决策一致性三轮推理结论一致的比例。这个比例突然下降通常是市场状态发生了结构性变化。回测与实盘偏差实盘表现和同期回测的差距。偏差持续扩大说明模型在适应新环境上出了问题。token消耗趋势单位决策的token消耗。突然上升通常意味着数据管线有重复调用或异常重试。6.2 迭代的优先级排序迭代不能什么都改。我的优先级是第一优先修复错误。任何导致决策错误的bug立即修复。第二优先提升数据质量。数据是基础数据质量提升的收益最直接。第三优先优化推理框架。调整提示词、增加推理轮次、改进一致性判断。第四优先扩展功能。增加新数据源、新分析维度、新决策类型。这个排序的逻辑是先保证正确再追求更好。很多项目失败是因为在基础不牢的情况下急着加功能。6.3 后续可以扩展的方向当前系统还有几个可以深挖的方向一是引入更多另类数据。比如供应链数据、招聘数据、专利数据这些能提供传统财务数据之外的视角。二是增强解释性。当前决策理由还是偏技术化可以生成更通俗的解释方便非技术背景的使用者理解。三是自适应阈值。当前的一致性判断阈值还是人工设定可以尝试让系统根据市场状态自动调整。四是多Agent协作。当前是单Agent多轮推理可以尝试多个专业化Agent分工协作各自负责不同维度最后汇总。我个人在实际操作中的体会是投资Agent的价值不在于预测准确率有多高而在于决策的一致性和可追溯性。人做决策容易受情绪影响今天一个逻辑明天另一个逻辑。Agent的优势是每次都按同样的框架分析错了能定位对了能复制。这个价值在长期运行中会越来越明显。最后分享一个小技巧定期用历史数据做“盲测”。把某段历史数据藏起来让系统跑完再对比实际结果。这个做法能有效检测过拟合比看回测曲线靠谱得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑