Agent 炒股如何回测?¶
简短答案:回测炒股 Agent,不是把一段 K 线塞给大模型后询问“该买还是该卖”。可信的方法是把 Agent 放进一个严格按历史时钟推进的市场环境:它只能看到当时已经公开的数据,只能通过受控工具研究和下单;环境负责撮合、账户与风控,并保留从模型请求到最终成交的完整审计证据。
TraderHarness 是面向这套评测合同的开源 Python 环境,目前聚焦中国 A 股。它同时处理时点数据、日期与公司实体掩码、5 分钟级渐进撮合、模型调用记录、指纹回放和轨迹导出。
三步运行免 Key 回放 查看 Masked vs Unmasked 实验 English guide
回测不是投资建议
历史模拟不能证明未来盈利,也不能替代持牌投资咨询。TraderHarness 不连接真实券商账户,不提供跟单或收益承诺。
为什么普通股票回测方法不够¶
传统量化策略通常是一段确定性代码:输入行情,输出仓位。LLM 交易 Agent 则会研究、调用工具、生成判断、修改计划并下单,因此多出三类特殊问题。
1. Agent 可能看到未来信息¶
最常见的问题是未来函数或前视偏差。例如,Agent 在开盘阶段看到了当天收盘价,看到了一份收盘后才发布的公告,或者下单后以决策前不可见的低价成交。仅按“日期”过滤数据不够,日线、分钟线、公告、新闻和财务数据都有不同的实际发布时间。
2. 大模型可能记得历史¶
即使数据接口完全遵守时点,大模型仍可能认出股票代码、公司产品、著名公告或某段历史行情。它输出的答案看似正确,实际上可能来自训练语料记忆,而不是回测时允许看到的证据。
这也是为什么 LLM Agent 回测需要把普通的 look-ahead bias 与模型记忆污染分开处理。TraderHarness 可以把绝对日期改写为 D+0、D-1,并把公司名称和代码替换为确定性伪名,同时保留交易规则需要的市场和板块语义。
3. 同一个模型也可能返回不同答案¶
云端模型会升级,推理服务会变化,即使温度为零也不保证逐字一致。只保存最终买卖记录,无法解释结果为什么变化。可信的回测必须记录完整消息、模型与供应商配置、工具 schema、模型响应、工具调用和工具结果。
一套可信的 Agent 炒股回测合同¶
| 边界 | 最低要求 | 应保留的证据 |
|---|---|---|
| 市场数据 | 每个出口都按模拟时钟过滤 | 来源时间、模拟时间、可见行 |
| 公司与日期 | 必要时做日期和实体掩码 | 掩码策略、种子、泄漏审计 |
| 成交 | 决策后才逐步揭示可成交价格 | 下单时间、可见窗口、成交时间与价格 |
| 账户 | Agent 只能读取账户视图 | 订单、成交、现金、持仓、公司行动 |
| 模型 | 记录完整请求、响应和工具循环 | 模型 ID、请求指纹、调用模式 |
| 对比 | 相同市场时钟,账户相互隔离 | 配置、随机种子、基准序列 |
| 发布 | 公开前审计全部工件 | 代码版本、数据清单、审计报告 |
最核心的原则是:相同的可见数据和动作序列,必须产生相同的环境结果。模型生成可以先完整记录、再指纹回放;撮合、账户和指标计算必须由环境确定性地执行。
六步完成一次 LLM 股票 Agent 回测¶
第一步:定义 Agent,而不是只写一句提示词¶
明确 Agent 的研究风格、可使用工具、模型、风险限制和交易阶段。TraderHarness 的 Agent 卡片会参与三个阶段:
- 盘前研究,不能下单;
- 开盘窗口,5 分钟数据逐步揭示;
- 尾盘窗口,继续渐进揭示并允许交易。
多角色系统还要区分只读顾问和唯一执行者。不能让每个角色都持有交易工具,否则账户责任和决策归因都会失真。
第二步:准备严格时点有效的数据¶
至少需要未复权日线、盘中分钟线、交易日历、股票状态和基准。若 Agent 使用公告、新闻、基本面或估值,还必须按真实发布时间过滤,而不是只按报告期或自然日过滤。
历史成交和公司行动应使用未复权价格;前复权序列适合画图,却不能直接替代真实成交价格。
第三步:同时控制未来数据和历史记忆¶
时点过滤解决“Agent 看到了未来”,日期与实体掩码解决“Agent 可能记得过去”。二者不是同一问题,也不能互相替代。
建议对同一张 Agent 卡进行 masked/unmasked 配对实验:市场、模型、工具、资金和执行规则保持一致,只改变日期与公司身份是否可见,再比较行为与结果。TraderHarness 的一键实验页面展示了这种可审计结构。
第四步:让所有订单经过同一撮合路径¶
Agent 不应直接修改持仓,也不应自行声明成交。所有订单必须通过环境的唯一入口完成校验和撮合。TraderHarness 使用 TradingBus.place_order() 处理下单路径,由环境拥有现金和持仓状态。
盘中数据必须先揭示一个子窗口,再允许 Agent 决策,然后才能使用之后可见的价格撮合。这样可以阻止 Agent 看完整天走势后回头选择早盘最优价格。
第五步:记录并回放完整模型轨迹¶
每次调用都保存完整请求和响应,并为规范化请求计算 SHA-256 指纹。回放时,提示词、工具定义、可见输入或调用顺序只要发生变化,就应立即失败,而不是悄悄返回不匹配的缓存答案。
这使测试能够区分两件事:模型本次生成了什么,以及市场环境如何执行这些动作。
第六步:报告行为和风险,而不只报告收益¶
至少应报告:
- 区间收益、沪深 300 相对收益、最大回撤和风险调整指标;
- 订单数、成交数、拒单数、空仓天数和换手率;
- 暴露度、集中度、持有周期与工具使用行为;
- 日期范围、股票池、初始资金、费用、撮合规则和掩码配置;
- 模型与供应商、Agent 卡片、数据版本、代码提交和工件审计结果;
- 未建模因素,例如市场冲击、实盘延迟和供应商模型漂移。
用 TraderHarness 运行 A 股 Agent 回测¶
安装包和完整数据集,然后运行内置的 masked replay:
pip install "traderharness[llm,data,ui]"
traderharness data download --full
traderharness demo
这个演示不需要模型 API Key。它会回放已经记录的 LLM 轨迹,但仍使用本地规范行情重新执行市场环境和指标计算。
记录一次新的模型运行:
traderharness run \
--agent trend-breakout \
--start 2024-03-04 \
--end 2024-03-29 \
--mask-entities \
--record-replay run.jsonl
公开或导出训练数据之前执行审计:
traderharness audit result.json run.jsonl
traderharness export sft result.json --output training.jsonl
如果要比较多个独立 Agent,使用 traderharness compare 为每个 Agent 分配隔离账户;如果要复现 TradingAgents 风格的多角色委员会,应让顾问保持只读,只允许一个执行者下单。两者是不同的实验合同,不能混在同一排行榜中解释。
常见的无效回测方式¶
- 把整段历史行情一次性发给模型,再要求它逐日“模拟”;
- 在开盘决策时提供当天最高、最低或收盘价;
- 用前复权价格直接模拟真实成交和公司行动;
- 只告诉模型“不要使用未来信息”,却不在工具层强制过滤;
- 只保存最终交易,不保存模型请求和工具调用;
- 在同一账户里并发运行多个执行 Agent;
- 只挑选盈利轨迹公开,不报告失败、拒单和空仓行为;
- 把一次历史收益直接宣传为模型能力或未来收益。
Agent 炒股回测常见问题¶
Agent 炒股如何回测?¶
使用按历史时钟推进的市场环境,让 Agent 只能读取当时已公开的数据,通过受控工具研究和下单;环境负责撮合、账户、风控和完整轨迹记录。不要让模型直接读取整段历史,也不要让它自行修改持仓。
AI 炒股回测和普通量化回测有什么不同?¶
LLM Agent 除了未来数据和成交偏差,还会遇到历史记忆污染、模型调用漂移、工具越权和自然语言决策不可复现等问题,因此需要额外的掩码、轨迹和指纹回放机制。
为什么要隐藏日期和股票名称?¶
通用模型可能从训练语料中认出著名公司、日期或行情。掩码用于减少记忆线索,检验 Agent 是否依赖当前允许看到的数据。它是污染控制手段,不是模型绝对无法反向识别的证明。
LLM 调用不确定,回测还能复现吗?¶
新鲜调用通常不能保证完全确定,但可以保存完整交互并用请求指纹严格回放。这样,模型响应可以原样重放,市场环境的撮合和账户结果仍保持确定性。
TraderHarness 支持 A 股吗?¶
支持。公开数据集覆盖五年全市场 A 股日线、284,219,844 条去重 5 分钟线,以及公告、政策新闻、基本面、估值、分红和沪深 300 基准,使用 SHA-256 发布清单校验。
回测收益好是否说明 Agent 可以实盘盈利?¶
不能。回测只能描述明确数据、模型和执行规则下的历史结果。市场冲击、真实延迟、交易成本、样本选择和模型升级都可能改变实盘表现。
下一步¶
- 按快速上手运行免密回放和本地研究控制台;
- 阅读无数据泄漏的 LLM 交易回测了解时点与实体掩码;
- 查看TraderHarness 与 TradingAgents、StockBench、Qlib 的区别;
- 在 GitHub 检查源码、测试和公开工件。