资讯动态

StockBench:用真实市场模拟评测LLM智能体的交易能力

发布时间:2026/10/19 13:48:36 来源:尧图企业网站定制
1. 这个项目到底在回答什么问题1.1 LLM炒股的喧嚣与真实的研究空白LLM智能体炒股这个话题从它还是段子的时候我就开始关注了。早期大家拿大模型选股票本质上是娱乐性质的预测游戏跟抛硬币没有本质区别。后来事情起了变化——有人把大模型接进回测框架用历史K线喂给模型让它输出买卖信号再算收益曲线。这类工作多了之后一个尴尬的事实摆上台面回测里赚钱的智能体几乎没有一个敢真的拿真金白银去跑。这不是偶然。历史回测和真实市场之间的距离远比大多数人想象的大。回测里你能拿到当天的完整数据真实市场里你只能拿到数据到达你这一刻的快照回测里你假设下单立刻成交真实市场里你的订单会把价格推离你想要的位置更别提手续费、冲击成本、流动性缺口这些回测里根本不会被正确建模的东西。StockBench这个项目恰好戳中了这个痛点。它的全称翻译过来就是大语言模型智能体能否在真实世界市场中盈利地进行股票交易——注意关键词是真实世界市场。它不关心你的模型在历史数据上回测有多神只关心一件事如果现在给你一个模拟真实交易环境的沙盒让LLM智能体在里面连续交易一段时间它到底是赚钱还是亏钱。这个问题值得较真。因为如果LLM智能体真能在真实市场里稳定盈利哪怕只是跑赢买入持有那整个量化投资的逻辑都要改写如果不能那我们也需要知道它到底死在哪个环节——是信息理解不行、决策框架不行还是执行层面的摩擦太致命。StockBench的意义就是把这个模糊的问题拆成一个可量化、可复现、可控变量的测试协议。1.2 真实市场模拟与历史回测的本质差异要理解StockBench的设计逻辑必须先搞清楚一个核心区别为什么历史回测不能作为真实世界市场的近似。最简单的例子是幸存者偏差。你在回测里用的是当前依然存续的股票的数据那些已经退市的、暴跌到消失的股票在历史数据里根本不会出现在待选列表里。这就相当于考试前把成绩单给你看了一眼能赚钱根本不稀奇。更隐蔽的问题在于信息暴露的时序——回测框架里模型的每一次决策都基于那一刻历史上真实发生过的数据但模型在训练语料里已经见过这段历史大模型的训练数据覆盖了大量财经历史事件它不是在预测而是在回忆。这类问题不通过专门设计的样本外协议根本没法暴露。第二个差异是执行层面的。真实市场里你看到的价格和你能成交的价格之间有滑点你下的市价单会吃掉对手盘的挂单你的交易量足够大时会把价格打向不利的方向。所有这些统称为市场冲击。回测框架里常假设以看到的价格成交这在低换手率的策略里误差可以忽略但如果你让一个LLM智能体自由发挥它可能在几分钟内下一堆单冲击成本会直接把收益吞掉。第三个差异是噪音环境的性质。历史回测的数据是静止的、确定的而真实市场是连续流动的——新闻事件打断了价格趋势大单在盘口移动流动性在最需要的时候消失。LLM智能体面对的不是一张图表而是一个连续流式到达的信息流。它需要在噪音中做决策这跟给你一整根K线再判断是两种难度。所以StockBench做的事情用一句话概括把考试环境从历史回放的录像带换成一个实时运转、有完整交易规则、有对手盘、有费用结构的模拟交易所。智能体在里面感知到的、决策出的、执行掉的所有环节都尽量贴近真实交易的约束。2. StockBench的整体设计思路如何搭一个靠谱的炒股考场2.1 五大设计原则我把StockBench的设计思路重新梳理了一遍核心是五条原则。这五条不是拍脑袋定的而是把过去几年各种LLM交易评测的通病一条条列出来之后反推出来的约束条件。第一数据必须流式到达。智能体不能在决策前一次性看到全天或全时段的全部行情只能像真实交易员一样在每一个时间步拿到到目前为止的数据快照。信息到达的顺序要随机化防止模型记住固定模式。第二交易必须有成本。每笔交易都收手续费按真实市场的费率结构建模订单不能以看到的价格成交要按订单簿深度推进模拟的价格冲击限制最高杠杆和做空规则防止智能体通过极端仓位自爆式赚钱。第三信息边界必须清晰。哪些信息是智能体在当下这一刻能获取的比如当前盘口、近N根K线、新闻流哪些是不能的比如未来收益、当日最终收盘价必须在系统提示里强制声明并在环境层物理隔离。第四评估必须多维度。不能只看总收益率因为一个智能体可以靠单次极端押注赚大钱也可以靠极小仓位跑赢买入持有——这两种都没意义。评估要包含夏普比率、最大回撤、换手率、交易次数、胜率、风险暴露度等指标的综合。第五可复现性优先。同一个智能体、同一个市场时段、同样的随机种子跑出来的结果要能重复。这要求环境的随机因素被显式控制智能体运行的上下文和中间决策日志要完整记录方便事后归因。这五条原则合在一起才让StockBench区别于给模型看历史数据然后让它选涨跌的玩具评测。2.2 为什么能跑通不等于能盈利我在跟做这个模拟项目X的团队交流时一个重要共识是绝大多数LLM交易系统的第一版demo都能在回测里跑通偶尔还能跑出很漂亮的曲线。但一旦放到StockBench这类环境里第一步暴露的问题就是它们对真实市场的约束完全没有概念。举个例子。很多基于LLM的交易系统第一步是让模型输出看涨或看跌的二分类判断然后机械地映射为买入或卖出。这种设计在最朴素的回测里可以验收——模型预测准确率高一点收益曲线就好看一点。但在真实市场里预测方向只是交易的一部分。你还要决定仓位多大、什么时候入场、什么时候离场、遇到滑点怎么办、持仓过夜的风险怎么管理。这些决策在二分类信号体系里统统没有。另一个常见错觉是常识交易的陷阱。LLM脑子里全是教科书式的金融常识比如低买高卖分散投资不要追涨杀跌。这些常识本身没错但真实市场的价格运动往往由短期资金博弈驱动常识性的策略在特定市场环境下会系统性失效。StockBench的测试结果里很多LLM智能体表现出极端的常识过载一旦价格大跌它就想抄底一旦连续上涨它就想止盈最终在一个震荡市里被来回打脸手续费叠加上来账户很快缩水。所以能跑通的定义在StockBench里至少要被扩展为能连续交易数百轮不爆仓、能在不同市场环境下都有逻辑自洽的决策记录、能在扣除所有成本后还不亏钱。能做到这三点的系统才值得拿到真实市场里去试水。3. 核心模块拆解从感知到执行的完整链路3.1 数据环境智能体到底能看到什么数据环境是StockBench最值得细看的部分。它不是一个简单的K线新闻推送而是设计了一套分层的数据访问机制。第一层是行情快照。每个时间步设定为1分钟或5分钟智能体会收到当前交易对的最新价、过去N根K线的OHLCV聚合注意只有到当前时刻为止的片段、盘口前几个档位的挂单量。这些信息以结构化文本拼进上下文中比如当前时间2024-05-14 10:35最近5根1分钟K线[开/高/低/收/量]...。第二层是事件流。包括预设的新闻事件、财报发布、宏观数据公布、大额异常订单等。这些事件以自然语言形式投喂给智能体模拟真实交易员从资讯终端获取消息的场景。关键设计在于事件的到达时间有随机延迟——智能体不可能在财报发布瞬间就拿到解读这逼着它处理信息滞后和市场已经反应的矛盾。第三层是账户状态。包括当前持仓、可用余额、已实现/未实现盈亏、当日交易次数限制如果设了日内交易限制的话。这一层非常关键因为很多LLM智能体在测试里暴露的典型问题是忘记自己还有多少子弹——它给出了一个完美的加仓计划但账户里根本没有足够的现金。这三层数据是系统性拼接到提示词里的每个时间步都完整覆盖。智能体不需要自己去调用接口或查数据库它的全部感知就是提示词里的当前状态。这种设计把感知层从工程里剥离出来让研究者能专注于评估模型本身的市场判断能力。3.2 决策链路从自然语言到真正的下单动作决策链路的定义决定了StockBench评测的是LLM智能体还是LLM一大堆工程后处理。我见过一些项目模型输出一段模糊的自然语言比如我认为市场情绪偏多可以适当加仓然后由外部规则引擎把这段话翻译成具体下单指令。这种设计其实把大量决策逻辑搬到了规则引擎里模型只做了一个定性判断评测结果天然偏向乐观。StockBench的做法更严格。它要求智能体输出结构化的JSON指令例如{ action: buy, symbol: AAPL, quantity: 100, order_type: limit, limit_price: 189.5, reason: macd金叉且成交量放大预计短期上行 }环境只会解析这个结构化字段然后根据当前订单簿判断这笔单能不能成交。如果你输出的限价单价格远高于当前卖一那它就会以卖一价成交如果远低于买一它可能挂一整天都成交不了。这个设计直接把模型嘴上说的和市场实际给的之间的缝隙暴露出来——模型经常给出一个看起来合理的价格但真实市场根本不给你那个位置。reason字段不是装饰品它会被记录下来作为事后分析的核心材料。通过分析这些自然语言推理你能看到智能体在哪个环节犯了错——是信息解读错了还是决策框架本身有问题还是纯粹在胡编理由。决策链路里还有一个反直觉的设计环境会随机注入系统扰动比如模拟交易所临时维护、模拟网络延迟导致的指令超时、模拟某只股票被临时停牌。这些扰动在回测里根本不存在但在真实市场里随时可能发生。目的是测试智能体在意外情况下的鲁棒性——它会不会因为没有收到响应就盲目重试会不会在停牌期间还尝试下单从而导致指令被拒。3.3 成本模型手续费、滑点与市场冲击交易成本是StockBench与绝大多数学术评测拉开差距的地方。很多研究里交易成本只是一个固定比例比如每次交易扣0.1%手续费就当作成本模型了。这在低频策略里勉强凑合但LLM智能体天然会高频产生交易信号因为每一轮观察它都可能改变主意固定比例成本根本压不住这种交易频率带来的损失。StockBench的成本模型分三层。第一层是显性手续费按真实券商费率区间设定买入和卖出不对称还包含最低佣金。第二层是滑点建模——不是简单地在成交价上加减几个基点而是按照订单簿当前深度向前推进你要买入100股先从卖一挂单量里吃掉不够再从卖二吃直到满足数量加权平均出来的价格才是你的成交价。第三层是市场冲击即当你的订单超过某个阈值时即使订单簿里没有足够对手盘系统也会模拟价格滑向不利方向的额外冲击。三层成本叠加之后一个典型的实验结果是某个智能体在无视成本时年化收益50%扣掉手续费后只剩15%再算上滑点和市场冲击直接变成负收益。这不是模型不行而是真实市场里每一笔交易都在流血高换手率策略在这个环境里天然处于劣势。我建议所有自己搭评测环境的人至少要把成本模型做到显性手续费固定滑点这一档否则评测结果毫无参考价值。你做出来的智能体不是去参加论文答辩的是去市场里真刀真枪拼的成本就是它的命。3.4 评估体系为什么不能只看收益率StockBench的评估体系设计我直接说几个关键指标和它们各自的不可替代性。总收益率是最容易被误读的指标。一个智能体可能在测试期内只做了一笔交易恰好买到了最牛的股票收益率爆表但它的决策过程几乎没有可复制性。这种结果叫运气不叫能力。夏普比率衡量的是每承担一单位风险能换来多少超额收益它把收益的波动性拉进来账。一个靠巨幅仓位波动堆出来的高收益夏普比率一定难看。最大回撤是一个残酷的指标它记录的是账户从峰值跌到底部的最深幅度。LLM智能体的典型回撤图景是前期稳步盈利然后某一天突然重仓押注某个确定性极高的机会结果市场反向一天内把前面积累的利润全部吐回去。最大回撤直接暴露了这类重仓赌博行为。换手率和交易次数是隐藏指标。它们不直接衡量盈利但能揭示智能体的行为模式。换手率过高意味着决策不稳定、被短期噪音牵着走换手率过低意味着可能反应迟钝、错过关键转折。这两个指标配合每笔交易平均成本占收益的比例看能很快判断一个策略模式是不是可持续。StockBench会把所有指标汇总成一张排名表同时公开每个智能体的完整决策日志。这让归因成为可能你知道它赚了钱也知道它为什么赚了钱而不是只能对着收益曲线猜。4. 实测中的典型失败模式与教训4.1 我见过的一组对比测试基线策略与LLM智能体的差距在模拟项目X的测试环境里我带着几个朋友跑过一组对比测试。这里贴一组当时记录的数据虚构模拟环境下得到的不代表任何真实市场表现用来展示LLM智能体与简单基线策略的差距。策略总收益率最大回撤夏普比率换手率交易次数买入持有8.2%-7.4%0.92-1随机交易-3.5%-12.1%-0.28很高480动量策略5日均线6.7%-8.9%0.71中32LLM智能体默认-11.3%-19.8%-0.62极高1260LLM智能体 成本敏感配置1.4%-9.5%0.31中76这个表格每次看都很有信息量。买入持有策略什么都没做跑赢了大部分LLM智能体最简单的动量策略几乎不需要智能也稳稳跑赢而LLM智能体的表现高度依赖外部配置——你给它打的系统提示词里只要多一句注意控制交易频率或优先考虑低成本的限价单结果能差出十几个百分点。这说明了什么说明模型本身不是收益的决定因素环境约束和行动自由度才是。给LLM智能体足够的自由去发挥它会过度交易、过度自信、过度反应把它关进一个强约束的笼子里它反而能跑出接近基线策略的表现。4.2 失败模式一把推断当成事实凭空想象市场叙事LLM智能体最让我头疼的失败模式是它在信息不完整时强行编造一个自洽的故事然后基于这个故事做交易决策。举个例子。在某次测试里价格在几分钟内连续大幅下跌消息面没有任何异常。一个LLM智能体的reason字段里写着市场突然下跌怀疑有重大利空消息流出建议立即清仓——但环境里根本没有给它推送任何利空消息。它在没有消息的情况下宁愿相信自己的幻觉也不愿意承认这可能只是正常波动。这种行为的根子在LLM的训练目标上。语言模型被训练成一个永远说得通的东西面对一个没有明显原因的价格波动它会觉得没有解释是不可接受的于是自动生成一个解释来填补空白。交易员天天练的就是接受市场的随机性和承认自己看不懂而LLM天生跟这种训练目标反着来。在StockBench的测试中这种失败模式的直接后果是灾难性的智能体在每一个异常的短期波动中都会找到一个不存在的理由然后做出一系列理论上合理、实际上完全错误的操作。它的交易日志看起来逻辑通顺收益曲线却一路向下。4.3 失败模式二对高确定性机会的过度押注第二种典型失败模式是LLM智能体在遇到它自认为的极端机会时完全丧失仓位管理意识。在一次模拟重大政策利好的新闻事件后我观察到一个智能体给出了一个这样的决策把账户里几乎所有可用余额买入某只股票reason字段写的是重大利好确定性极高应满仓抓住机会。然后又过了两个时间步价格小幅回调它的reason变成了市场对利好的反应低于预期立即止损离场——一笔交易在十几个时间步内完成了从全仓进场到全仓割肉的完整循环。这个行为模式在人类交易员身上也存在叫过度自信灾难性止损的组合。但LLM把它放大了模型对确定性的判断没有概率校准它把这是一个高概率事件直接等同于这是一定会发生的事件然后投入与确定性不匹配的仓位。StockBench对这类行为是零容忍的因为它的评估指标里有最大回撤这一项一次满仓押注失败就能让整条回撤曲线彻底失控。这个失败模式的教训是任何基于LLM的交易系统必须在行动空间上做限制比如单笔最大仓位占比、单日最大亏损熔断这些硬约束不能指望模型自己学会。4.4 失败模式三上下文过长导致的决策漂移第三个让我印象深刻的失败模式是LLM智能体在运行一段时间后出现的决策漂移——它开始忘记自己最初的交易纪律行为模式发生显著改变。这是因为StockBench的数据环境是逐时间步拼接到提示词里的测试周期越长上下文里的历史数据越多。早期的观察和决策记录还留在上下文中但模型的注意力被大量新增的行情数据稀释它往往会忽略早期确立的规则或者策略声明。我观察到一个典型的漂移过程一个智能体在测试开始时明确说我将遵循动量策略只在突破关键均线时加仓并连续几笔交易都执行得很好。但几个小时后在上下文被塞满各类价格数据和新闻之后它开始频繁做与初始策略无关的操作——一会儿抄底一会儿追高一会儿又平掉盈利仓位。它的reason字段里还能看到互相矛盾的说法上一笔说应该持有等待突破下一笔却说市场走弱先出来观望。这种决策漂移在真实交易里同样致命因为策略一致性是任何可盈利交易系统的基本前提。StockBench通过记录完整决策日志让研究者能精确定位漂移发生的上下文长度阈值从而反推在不牺牲信息完整度的前提下如何通过摘要或其他压缩手段控制上下文规模。5. 如果你想自己复现类似评测这几个坑一定要避开5.1 数据对齐最容易出错也最容易被忽略的环节如果你打算自己搭一个类似StockBench的评测环境第一个要小心的坑就是数据对齐。很多人直接从数据供应商那里拉历史分钟数据然后在本地做一遍前复权或后复权处理就以为数据干净了。但真实交易中你要面对的是当时那个时刻的真实价格而不是复权之后的价格。除权除息当天价格会出现一个跳跃这个跳跃不是你策略的收益也不是你的损失它是一个纯粹的数据和现实之间的错位。忽略复权问题的回测会在分红季虚假地产生超额收益或虚假的暴跌。更隐蔽的坑是时间对齐。新闻事件推送的时间戳、K线的时间戳、订单簿快照的时间戳来自不同数据源时经常存在几十到几百毫秒的偏差。在真实市场里50毫秒的偏差足以让一个看到利好新闻再买入的策略持续买在最高点。你必须在环境层把所有这些数据流的时间戳统一到一个时钟上。我建议所有自己搭评测环境的朋友先用1分钟K线固定事件流这种低频率数据开始跑别一上来就挑战高频盘口数据。低频环境下数据对齐问题没那么致命可以帮你把环境本身的bug先排干净。5.2 撮合引擎不要天真地假设按看到的价格成交第二个坑在撮合引擎。如果你只是给智能体一个价格然后让它决定买或卖成交价简单设置为当前价那你的评测环境必然失真。我踩过的坑是这样的第一版环境里智能体报价199买入我用当前卖一价199.2作为成交价觉得已经够真实了。后来才发现当智能体连续几笔买入时我每笔都按卖一价成交但实际上第一笔成交已经把卖一的挂单吃掉了第二笔应该从更贵的卖二那里吃单。忽略这个细节等于给你的智能体每笔交易都补贴了滑点它在你的环境里赚钱不代表它在真实市场也能赚。如果你想做一个稍微够用的撮合引擎至少要做到按照实时订单簿的深度推进成交价限制单笔订单数量不能超过对应档位挂单量的某个倍数超出的部分要么拒绝成交要么按下一档的价格继续推进。这个引擎不需要做得多精致但成交价格会因自己的订单而变化这个基本事实必须体现出来。5.3 评估指标单看收益率会让你误判一切最后一个坑是评测指标设计得不完整。很多人在自己的测试里只看总收益率这真的很危险。我举一个真实发生过的事。当时测试一个智能体它在某段时间里收益率特别漂亮但仔细一看交易记录它只在某个暴涨时段满仓了一次然后一直空仓。这叫什么它其实是一个一次性赌对的代理不是可持续的策略。如果评测期拉长或者换一个没有暴涨的市场环境这个智能体的收益会直接归零。所以至少要用一套组合指标总收益率、最大回撤、夏普比率、换手率、胜率、盈亏比。其中最大回撤和换手率是用来过滤赌博式交易的利器。我自己在评测里还有个习惯会把剔除最大单笔盈利之后的累计收益也算出来这个指标能直接撕掉靠一笔神操作遮百丑的伪装。5.4 提示词工程评测环境里的隐性变量再补一个很多人不注意但影响巨大的点给LLM智能体的系统提示词怎么写本身就是一个巨大的隐性变量。同一个模型你用你是专业交易员请谨慎决策并根据综合分析给出操作和你是高频交易员追求每次小幅波动中的盈利机会跑出来的结果能差出好几个数量级。这也意味着你在评测LLM智能体能不能交易时其实在同时评测两件事模型本身的市场能力和你的提示词设计水平。StockBench的做法是提供一个标准化的系统提示词模板明确告诉智能体环境的规则、行动空间、成本结构、目标函数。它不鼓励你用花哨的提示词去榨出模型的潜力因为评测的目标是公平比较不同模型在同等条件下的能力。但如果你是在自己的项目里用我建议你多花时间调整提示词你会发现这比换一个更大参数的模型还要管用。6. 我个人的实践体会与扩展思路6.1 三个反直觉的发现参与了几轮类似评测之后我积累了几个反直觉的体会分享一下。第一让LLM智能体少做决策它的表现反而更好。这不是开玩笑。把行动限制到每日最多交易一次、单次仓位不超过20%就能跑赢那个可以自由交易的默认版本。限制行动空间在某种意义上强制了模型的纪律性而纪律性恰恰是交易最稀缺的品质。第二基线的水平比大多数人想象的高。很多人在讨论LLM能不能炒股时默认基线是跑赢买入持有。但等我自己跑了一堆基线策略之后发现简单的5日均线策略、布林带突破策略、甚至老老实实的月度定投都能在同样的成本模型下跑赢大部分LLM智能体。把基准线画高了LLM的真实水平就需要重新评价。第三模型输出的理由和它的实际决策质量之间的相关性极弱。一个reason写得天花乱坠的智能体和另一个reason写得乱七八糟的智能体收益表现可能完全一样。这说明LLM在交易场景里生成的自然语言解释很大程度是事后合理化而不是事前推演。这让我对用LLM做基本面分析再让规则引擎执行这类架构也多了几分谨慎——因为它的核心逻辑是先让模型讲道理再按道理行动可模型讲道理的过程本身就掺杂了大量幻觉。6.2 后续还能怎么扩展StockBench这类评测环境后续扩展方向其实很多。一个自然是把单股交易扩展为多资产组合交易。让智能体同时管理股票、ETF、商品等多个标的考验它的资产配置能力和跨资产风险对冲能力。这比单股交易更接近真实基金经理的工作场景也更能暴露模型的组合管理短板。另一个方向是引入市场之间交互影响——比如消息面事件如何在不同板块之间传导、流动性和波动率的跨市场关联。这需要更大的环境复杂度但也会让评测结果更贴近真实市场的生态感。还有一个我很看好的方向把人类交易员和LLM智能体放在同一个环境里做对比评测记录两者在同一市场状态下决策的差异。这不仅是在评估模型能力也是在反推人类交易员的哪些决策特征是模型还不具备的这对下一代交易人工智能的设计是有直接启发意义的。最后我自己在实践中最大的收获是别再相信任何AI炒股赚翻倍的段子了。段子里没有成本模型、没有滑点、没有最大回撤、没有上下文漂移。StockBench式的严肃评测才是这个领域从好玩走向可用的必经之路。你要是也打算做类似的实验记住那五个设计原则和那一堆坑能帮你省下大量跟空气斗智斗勇的时间。

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

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

免费获取报价 →
↑