资讯动态

从零手搓投资Agent:百亿token背后的工程实践与架构设计

发布时间:2026/10/15 6:15:17 来源:尧图企业网站定制
1. 从零拆解一个投资Agent的底层逻辑1.1 为什么是“手搓”而不是“调包”看到“百亿token”这个量级很多人的第一反应是“这得烧多少钱”。但真正做过大规模Agent系统的人会告诉你token消耗量本身不是重点重点是这些token到底花在了什么地方。一个投资Agent如果只是简单地把行情数据喂给大模型然后问“买不买”那它消耗的token可能连百万级都到不了。能跑到百亿token说明这个系统在持续地做推理、反思、记忆更新和多轮决策校验。“手搓”这个词用得很准确。市面上现成的Agent框架不少但投资这个场景太特殊了。它要求系统具备几个硬性能力第一对时间序列数据的敏感度要极高因为金融数据的时间戳就是生命线第二决策链路必须可追溯不能是一个黑箱说“买”就完了第三要能处理多模态输入财报文本、K线图、新闻情绪、宏观指标这些东西的格式和更新频率完全不同。现成框架要么太重要么太浅很难在灵活性和稳定性之间找到平衡点。所以自己从头搭建反而是最务实的选择。我见过不少团队一开始图省事直接拿通用Agent框架套金融场景结果跑到后面发现光是数据对齐这一件事就够喝一壶的。行情数据是秒级的财报是季度的新闻是随机分布的这三条时间线要在同一个决策窗口里对齐通用框架的默认调度逻辑根本扛不住。手搓的意义就在于你可以从底层把时间对齐机制做成系统的一等公民而不是事后打补丁。1.2 投资Agent到底在解决什么问题传统量化交易系统依赖的是硬编码规则和统计模型。比如均线金叉买入、RSI超卖反弹这些规则写死了就是写死了市场风格切换的时候规则不会自己调整。投资Agent要解决的核心痛点就是让系统具备“环境感知”和“策略自适应”的能力。具体来说它要能做到几件事第一理解自然语言形式的投资逻辑比如“当美联储释放鸽派信号且就业数据不及预期时增加成长股仓位”这种逻辑用传统规则引擎写起来非常别扭但大模型可以直接理解第二在多个信息源之间做交叉验证比如财报里说营收增长但供应链新闻显示上游原材料涨价系统要能判断这个增长是否可持续第三对自己的历史决策做复盘识别出哪些判断逻辑在什么市场环境下容易出错然后动态调整权重。这三点听起来简单但落到工程实现上每一个都是深坑。自然语言理解需要Prompt工程和结构化输出约束交叉验证需要多源数据融合和冲突消解机制决策复盘需要完整的日志系统和归因分析模块。百亿token的消耗很大一部分就花在这些“看不见”的地方。1.3 系统整体架构的选型考量一个完整的投资Agent从架构上可以拆成四层数据接入层、特征工程层、推理决策层、执行反馈层。每一层的技术选型都有讲究。数据接入层的关键是“统一时间轴”。不管数据源是API推送、文件导入还是消息队列进入系统后第一件事就是打上统一的时间戳并且标注数据的“有效窗口”。比如一条新闻的情绪得分它的有效窗口可能只有几个小时过了这个窗口这个特征就应该被降权。这个机制如果不做系统就会拿着昨天的新闻做今天的决策这在实盘里是致命的。特征工程层要解决的是“异构数据同构化”。文本、数值、类别、图像这些数据要变成模型能吃的向量。这里有个经验不要试图用一个模型吃掉所有特征。文本用文本编码器数值用归一化加分桶图像用轻量级CNN或者直接调用视觉模型提取特征最后在决策层做融合。一锅炖的做法在小规模实验里可能work但到了百亿token的规模效率会急剧下降。推理决策层是核心。这里通常采用“多专家仲裁”的结构。不同的子Agent负责不同的分析维度比如基本面Agent、技术面Agent、情绪面Agent、宏观Agent每个Agent独立给出判断和置信度然后由一个仲裁模块综合所有意见做最终决策。仲裁模块本身也可以是一个经过微调的模型它的训练数据就是历史上各个子Agent的判断和最终的实际收益。执行反馈层负责把决策变成订单同时收集执行结果和滑点数据回传给推理层做在线学习。这一层最容易被忽视但它的数据质量直接决定了系统能不能持续进化。2. 核心模块的工程实现细节2.1 数据管道的搭建与时间对齐数据管道是整个系统的血管。我建议采用“事件驱动微批处理”的混合模式。行情数据用事件驱动来一条处理一条保证低延迟财报和新闻用微批处理比如每5分钟汇总一次做批量特征提取。这样既能保证实时性又不会因为单条新闻的噪声触发不必要的决策。时间对齐的具体做法是为每个数据点维护一个“时间区间”而不是“时间点”。比如某公司发布了季度财报这个财报数据的时间区间就是从发布时刻到下一份财报发布时刻。在这个区间内这个数据点的权重会随着时间衰减。衰减函数可以用指数衰减半衰期根据数据类型设定财报的半衰期可以设长一些比如30天新闻的半衰期可能只有6小时。这里有个坑不同数据源的时间戳精度不一样。有的API给的是毫秒级有的只给到秒级还有的给的是“大约时间”。如果不做统一在回测的时候会出现“未来函数”问题就是用到了当时还不可能知道的信息。解决办法是所有数据进入系统时强制对齐到一个统一的时间网格上网格粒度根据策略频率来定日频策略用天级网格分钟级策略用分钟级网格。2.2 多模态特征融合的实操方案多模态融合最怕的是“维度灾难”。文本特征动辄768维图像特征512维数值特征几十维直接拼接起来上千维模型训练会非常吃力。我的经验是先做模态内的降维和抽象再做模态间的融合。文本模态不要直接用大模型的最后一层输出。大模型的中间层往往包含更丰富的语义信息。可以取倒数第三层或第四层的输出然后做一个池化得到256维左右的文本表征。如果要做情绪分析可以单独训练一个轻量级分类头输出情绪得分和置信度。数值模态标准化是必须的但不要只用Z-score。金融数据分布往往有厚尾Z-score会把极端值压缩得太厉害。建议用Robust Scaling用中位数和四分位距来做标准化保留极端值的区分度。另外对于不同量纲的数值特征分桶离散化有时候比连续值更有效特别是当特征和标签的关系是非线性的时候。图像模态K线图、热力图这些如果直接用CNN提取特征计算量会很大。一个取巧的办法是把图像转换成一组结构化特征比如K线图可以提取出“最近N根K线的形态编码”用一些经典的形态识别算法先做一轮筛选只把有意义的形态送给视觉模型做细粒度分析。这样能省下大量算力。融合策略上早期融合和晚期融合各有优劣。早期融合在特征层面拼接适合模态间相关性强的场景晚期融合在决策层面加权适合模态间独立性强的场景。投资Agent通常采用混合策略基本面和技术面做早期融合因为它们共享价格和成交量信息情绪面和宏观面做晚期融合因为它们的信息来源相对独立。2.3 推理链的设计与Prompt工程投资Agent的推理链不能是单步的。一个完整的推理链至少包含信息收集、假设生成、证据评估、反事实推理、决策输出五个步骤。每个步骤都需要专门的Prompt模板和输出格式约束。信息收集阶段的Prompt要引导模型“只陈述事实不做判断”。比如“请列出过去24小时内与标的X相关的所有重要信息每条信息标注来源和时间戳”。这个阶段的输出应该是结构化的列表方便后续处理。假设生成阶段要让模型提出多个可能的投资逻辑。比如“基于以上信息请提出至少三个不同的投资假设每个假设包含核心逻辑、支持证据、反对证据、预期收益区间”。这里的关键是强制模型提出多个假设避免过早收敛到单一结论。证据评估阶段要对每个假设做打分。可以设计一个评分卡从证据强度、时效性、一致性三个维度打分每个维度1-5分。这个评分卡本身也可以由模型来填但要有明确的评分标准写在Prompt里。反事实推理阶段是最容易被忽略但最有价值的。让模型思考“如果某个关键假设不成立会发生什么”。比如“如果美联储的鸽派信号被证伪当前仓位应该如何调整”。这个步骤能显著提升系统的鲁棒性。决策输出阶段要给出明确的仓位建议和止损止盈位。输出格式建议用JSON方便程序解析。同时要输出决策的置信度置信度低的决策可以降低仓位或者不执行。2.4 记忆系统的分层设计投资Agent的记忆不能是一个简单的向量数据库。它需要分层短期记忆、中期记忆、长期记忆。短期记忆存储最近几天的市场状态和决策记录用于捕捉市场情绪的短期变化。这部分数据更新频繁可以用内存数据库或者Redis来存查询速度要快。中期记忆存储最近几个月的交易模式和策略表现用于识别市场风格的变化。这部分数据量适中可以用关系型数据库或者时序数据库来存支持复杂的聚合查询。长期记忆存储历史上的重大事件和策略的长期表现用于做跨周期的归因分析。这部分数据量最大但查询频率低可以用对象存储加索引的方式来做。记忆的写入和读取都需要有优先级机制。不是所有信息都值得记住也不是所有记忆都值得在每次决策时读取。可以设计一个“记忆重要性评分”根据信息的新鲜度、与当前决策的相关性、历史准确率来动态调整。这个评分机制本身也可以由模型来学习。3. 从回测到实盘的完整流程3.1 回测框架的搭建要点回测框架最核心的要求是“避免未来函数”。除了前面说的时间对齐还要注意几个细节第一财报数据要用“实际发布日”而不是“报告期”第二指数成分股要用“当时的成分股”而不是“现在的成分股”第三停牌、涨跌停这些特殊状态要正确处理不能假设所有订单都能成交。回测的评估指标不能只看收益率。夏普比率、最大回撤、卡玛比率、胜率、盈亏比这些都要看。更重要的是要看“策略容量”也就是这个策略能容纳多少资金而不显著影响收益。很多回测看起来很美的策略一上实盘就崩就是因为容量太小稍微大点的资金就把价格打飞了。回测的另一个关键是“样本外测试”。不要把所有数据都用来调参要留出一部分数据做样本外验证。更严格的做法是“滚动窗口回测”用过去N个月的数据训练用接下来M个月的数据测试然后窗口滚动。这样能更好地模拟实盘中的“在线学习”场景。3.2 实盘对接的风控机制实盘和回测最大的区别是“滑点”和“冲击成本”。回测里假设按收盘价成交实盘里可能滑点好几个基点。所以实盘系统必须要有滑点模型根据订单大小和市场流动性动态调整预期成交价。风控机制要分三层事前风控、事中风控、事后风控。事前风控在订单生成前检查比如单票仓位上限、行业集中度上限、总仓位上限。事中风控在订单执行中监控比如实时监控滑点是否超过阈值超过就暂停该策略。事后风控在收盘后分析比如归因分析看看当天的盈亏有多少来自选股多少来自择时多少来自运气。还有一个容易被忽视的风控点是“模型漂移”。市场环境变了模型的预测能力可能会下降。要定期监控模型的预测准确率如果连续N个周期低于阈值就要触发模型重新训练或者降权。3.3 在线学习与模型更新策略在线学习不是简单地用新数据继续训练。投资场景下数据分布变化很快直接用新数据训练容易导致“灾难性遗忘”模型把旧的知识全忘了。解决办法是“经验回放”把旧数据和新数据混合在一起训练旧数据的比例可以逐渐降低但不能降到零。模型更新的频率也要讲究。太频繁会导致系统不稳定太慢会跟不上市场变化。我的经验是核心决策模型每月更新一次辅助模型每周更新一次情绪分析这类快速变化的模型可以每天更新。更新的时候要用“影子模式”新模型先跑一段时间和旧模型对比确认表现更好再切换。还有一个技巧是“模型集成”。不要只依赖一个模型可以同时维护多个不同结构的模型比如一个基于树的模型、一个基于神经网络的模型、一个基于规则的模型决策的时候投票或者加权平均。这样能降低单模型失效的风险。4. 常见问题与排查技巧实录4.1 数据质量问题的排查清单数据问题是最常见也最隐蔽的。以下是我整理的一个排查清单问题类型典型表现排查方法解决思路时间戳错位回测收益异常高检查数据的时间戳和实际事件时间是否一致统一时间网格强制对齐缺失值填充不当模型在某些标的上表现极差统计缺失率检查填充逻辑用前向填充加缺失标记不要用均值填充异常值未处理模型权重被极端值主导画箱线图计算Z-score用Robust Scaling极端值单独处理数据泄露样本外表现远差于样本内检查特征计算是否用到了未来数据严格按时间切分特征计算只用历史数据幸存者偏差回测收益虚高检查标的池是否只包含当前存在的标的用历史成分股包含已退市标的这个清单我每次上线新策略前都会过一遍能省下大量debug时间。4.2 模型过拟合的识别与解决过拟合在投资Agent里特别常见因为金融数据的信噪比很低。识别过拟合有几个信号第一样本内夏普比率很高但样本外很低第二参数稍微变动收益就大幅波动第三模型在训练集上的准确率远高于验证集。解决过拟合的方法第一减少参数数量能用简单模型就不用复杂模型第二增加正则化L1/L2正则、Dropout、早停这些都要用上第三用交叉验证但要注意金融数据的时序性不能用随机K折要用时间序列K折第四集成学习Bagging和Boosting都能降低过拟合风险。还有一个经验不要追求太高的准确率。在金融预测里55%的准确率如果稳定就已经很好了。追求80%以上的准确率大概率是过拟合了。4.3 实盘与回测偏差的归因方法实盘表现和回测不一样这是常态。关键是要能归因知道偏差来自哪里。我通常从四个维度做归因第一滑点归因。统计实际成交价和预期成交价的差异看看滑点是否在模型假设的范围内。如果滑点远超预期说明流动性假设有问题。第二时机归因。回测里假设信号出现就立即成交实盘里可能有延迟。统计信号时间和成交时间的差异看看延迟对收益的影响。第三数据归因。实盘用的数据和回测用的数据可能有差异比如实盘数据有延迟、有缺失。统计实盘数据的问题率评估对决策的影响。第四行为归因。实盘里可能会有手动干预比如风控强制平仓。统计这些干预的频率和影响。归因做完之后要针对性地调整。如果是滑点问题就优化订单执行算法如果是数据问题就加强数据质量监控如果是模型问题就重新训练。4.4 系统性能优化的几个关键点百亿token的规模性能优化是绕不开的。几个关键点第一缓存。不是所有推理都要实时做。可以把一些高频查询的结果缓存起来比如某只股票的基本面摘要可以每天更新一次不用每次决策都重新生成。第二异步。数据接入、特征计算、模型推理这些环节可以异步做。用消息队列解耦避免一个环节卡住整个系统。第三批处理。单个请求推理效率低可以把多个请求攒成一批一起推理。特别是GPU推理批处理能显著提升吞吐量。第四模型蒸馏。大模型效果好但慢可以蒸馏一个小模型来做快速推理大模型只用在关键决策上。这样能在效果和速度之间找到平衡。第五硬件选型。推理用GPU数据预处理用CPU存储用SSD。不要所有东西都堆在一台机器上分布式部署能提升整体吞吐。5. 一些踩坑之后的经验之谈5.1 关于Prompt设计的几个反直觉发现第一个发现Prompt不是越长越好。早期我总想把所有信息都塞进Prompt里结果模型反而抓不住重点。后来发现把信息分层核心信息放前面辅助信息放后面模型的表现更好。第二个发现Few-shot示例的质量比数量重要。给三个精心挑选的示例比给十个随便找的示例效果好得多。示例要覆盖不同的市场环境不能都是同一种风格。第三个发现输出格式约束要强硬。不要指望模型“自觉”输出JSON要在Prompt里明确写“只输出JSON不要有任何其他文字”并且在解析的时候做容错处理。第四个发现温度参数要动态调整。做事实提取的时候温度设低一点做创意假设的时候温度设高一点。一个系统里可以针对不同模块设不同的温度。5.2 关于团队协作的建议投资Agent的开发不是一个人能搞定的。需要数据工程师、算法工程师、后端工程师、金融分析师一起配合。协作的关键是“接口标准化”。数据接口要标准化所有数据源统一成相同的格式方便替换和扩展。模型接口要标准化所有模型输入输出用相同的协议方便A/B测试。决策接口要标准化所有决策输出包含相同的字段方便回测和实盘对接。另外文档要写清楚。特别是特征的定义和计算逻辑一定要有文档。不然过几个月连自己都忘了某个特征是怎么算的。5.3 关于成本控制的实操技巧百亿token听起来很多但如果分摊到每天其实也没那么吓人。关键是要控制无效消耗。第一不要对所有标的都做全量分析。可以用一个轻量级模型先做初筛只对初筛通过的标的做深度分析。第二不要对所有信息都做实时处理。新闻可以攒批处理财报可以定时处理只有行情数据需要实时。第三不要重复计算。特征计算的结果可以缓存模型推理的结果也可以缓存。缓存命中率提升10%成本就能降不少。第四监控token消耗。要有一个dashboard实时显示token消耗情况按模块、按标的、按时间维度拆解。发现异常消耗能及时排查。5.4 关于系统迭代的节奏把握不要试图一次性把所有功能都做完。我的经验是先做一个最小可用版本能跑通“数据接入-特征计算-模型推理-决策输出”这个闭环就行。然后在这个基础上逐步迭代。迭代的优先级先解决数据质量问题再优化模型效果最后提升系统性能。数据质量是基础数据不对模型再好也没用。模型效果是核心但不要追求极致够用就行。性能是锦上添花等业务量上来了再优化也不迟。每次迭代都要有明确的评估指标。不要凭感觉说“好像变好了”要用数据说话。回测收益、夏普比率、最大回撤这些指标要持续跟踪。5.5 一个容易被忽视的细节日志系统日志系统看起来不起眼但它是排查问题的生命线。我的建议是日志要分级别DEBUG级别记录所有细节INFO级别记录关键流程WARN级别记录异常但可恢复的情况ERROR级别记录导致决策失败的问题。日志要结构化用JSON格式方便后续做聚合分析。每条日志要包含时间戳、模块名、标的代码、决策ID这样能把一次决策的完整链路串起来。日志要定期归档。热数据保留最近一周温数据保留最近一个月冷数据归档到对象存储。查询的时候按时间范围路由到不同的存储层。还有一个技巧在关键决策点打上“决策快照”把当时的输入特征、模型输出、最终决策都存下来。这样事后复盘的时候能精确还原当时的场景知道模型为什么做了那个决策。这个快照机制在排查“为什么这个决策看起来很不合理”这类问题时特别有用。5.6 关于模型可解释性的实践投资决策是要负责任的不能是一个黑箱。模型可解释性在投资Agent里不是可选项是必选项。一个实用的做法是“特征归因”。用SHAP或者Integrated Gradients这类方法计算每个特征对最终决策的贡献度。这样能知道模型是看了哪些信息才做的决策。另一个做法是“反事实解释”。对于每一个决策生成一个“如果某个特征变了决策会怎么变”的解释。比如“如果情绪得分从0.8降到0.3系统会从买入转为观望”。这种解释对风控和合规特别有用。还有一个做法是“决策路径记录”。把推理链的每一步都记录下来包括中间假设、证据评估、反事实推理的结果。这样能完整还原模型的“思考过程”。可解释性不仅是为了合规也是为了迭代。通过分析特征归因能发现哪些特征其实没用哪些特征被过度依赖了从而指导特征工程的优化。5.7 关于市场环境变化的应对市场环境是会变的。牛市里有效的策略熊市里可能亏钱。投资Agent要能感知环境变化并调整策略。一个做法是“市场状态分类”。用一个分类模型判断当前市场是趋势市还是震荡市是高风险偏好还是低风险偏好。然后根据市场状态动态调整子Agent的权重。比如趋势市里技术面Agent权重大一些震荡市里基本面Agent权重大一些。另一个做法是“策略切换”。维护多个策略每个策略适合不同的市场环境。用一个元学习器来决定当前应该用哪个策略。元学习器的输入是市场状态特征输出是各策略的权重。还有一个做法是“在线学习”。让模型持续从新数据中学习自动适应环境变化。但要注意控制学习率避免模型被短期噪声带偏。市场环境变化的应对没有一劳永逸的方案需要持续监控和调整。关键是建立一个反馈闭环让系统能自己发现“最近表现不好了”然后触发相应的调整机制。

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

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

免费获取报价 →
↑