binance-trading-bot · 回测与实盘放行门禁
binance-trading-bot 回测与实盘放行:为什么改了参数就得重跑
它把回测当成上线前的证据,而不是一张成绩单:回测与实盘跑的是同一个执行器,每次完成都会把「实际执行的那份配置」算成一个配置指纹,只有找到同一份指纹的近期回测,放行卡片才会给出一致性判断。改一个执行参数,指纹就变了,旧回测不再为你作证。这一页讲清成交假设、报告字段、样本外检查与 AI 回测顾问的边界。
放行门禁一轮回路
配置一变,指纹就变;指纹变了,就必须用新配置重跑一次。
放行门禁是怎么走完一轮的
这套判定是提示性的:结果显示在 Profile 的 Live gate 卡片上,既不阻止你启用实盘,也不会在实盘中途暂停买入。但它是唯一能告诉你「这份配置到底有没有被验证过」的地方,所以顺序必须照着走。
先改配置
在 Profile 的 Strategy 区调整参数,或者换一套 rulebook。改完先别急着开实盘。
预期输出Strategy 区保存成功;Live gate 卡片上的指纹与旧回测不再匹配,状态回到「未证实」。生成配置指纹
每次回测完成时,系统会把实际执行的那份有效配置(Profile 配置合并本次运行覆盖)算成一个稳定哈希,存在本次运行记录里。增删一个参数,哈希就不同。
预期输出backtest_runs.config_fingerprint = 该次运行实际执行的配置哈希用同一份指纹跑独立回测
放行只看独立回测(不加配置覆盖)的结果:只有它测的才是你准备上线的这份配置。带覆盖的运行测的是另一份配置,指纹不会匹配。
预期输出Live gate 卡片:找到指纹一致的近期完成运行 → 进入判定;找不到 → 显示未证实(仍可启用)。按固定顺序判定
判定顺序是:数据覆盖 → 样本内阈值 → 样本外阈值。数据覆盖是硬性前置,因为它不通过时后面的数字再好看也不可信。
预期输出数据覆盖通过 → 再比样本内三项 → 再比样本外三项;任一步不过即在该行标红。拿到一致性结论
结果只有三种:已证实(validated)、未证实(unproven)、门禁关闭(gate-off)。未证实只是一个提醒,交易照常继续;门禁关闭是你在 Live gate 弹窗里主动关掉阈值测量的结果,属于可见的显式选择。
预期输出卡片显示 validated / unproven / gate-off,每 30 秒轮询一次;测试网 Profile 不显示该卡片。上线后继续对照
启用之后,edge-decay 监控每 15 分钟用实盘已实现净盈利因子与「钉住的基线回测」做对比,发现衰减只做提醒,不会暂停买入。
预期输出判定 insufficient-data / warn / breached;warn 与 breached 在面板标记并推一条通知,同一轮衰减只提醒一次。
成交与滑点假设:回测的乐观就藏在这张表里
官方在回测章节开头就写明:回测相对实盘是偏乐观的。原因是下面这些假设。先用它们校准你对结果的期待,再去看报告里的数字。
| 假设 | 官方怎么定义 | 对结果的影响 | 你该怎么读 |
|---|---|---|---|
| 挂单只在「穿过」时成交 | 限价单要等后续 bar 穿过该价格才成交(买单:bar 最低价低于限价;卖单:bar 最高价高于限价),仅仅触及不算 | 比「触价即成交」保守,模拟了排队未成交的情形 | 不要指望每个触及价位的挂单都会成交;未成交是机制的一部分 |
| 价差扣减 | 每次成交(含限价单)都按买卖价差的一半扣减;表单默认 5 个基点,留空则不扣 | 没有这一项时,限价单会以正好等于挂单价成交,高估做市型策略 | 核对这次运行有没有把价差设为 0;留空属于异常口径 |
| 市价单付滑点、挂单不付 | 市价单按下一根 bar 的开盘价加滑点,再叠加价差扣减;挂单成交在限价(同样叠加价差扣减)但不计滑点 | 市价单的成本被显式计入;挂单省下的正是这部分 | 这与「maker 模式省的是点差与滑点、不是手续费」是同一件事 |
| 成交量参与上限 | 单笔成交不超过该成交 bar 基础成交量的百分比;表单默认 5%,留空则不限;超过部分留到后续 bar 继续成交 | 限制了大单在稀薄行情里「一次吃掉整根 bar」的乐观假设 | 小单在流动性好的 bar 上不受影响,只有大单遇稀薄 bar 才会被切分 |
| 与实盘共用同一个执行器 | 回测执行器实现的是实盘同一个执行器契约,策略无法分辨自己是在回测还是实盘 | 这是回测与实盘不会各自漂移的根本原因 | 它保证的是「逻辑一致」,不等于「结果一致」——见下一张表 |
| 前视保护与预热 | 只喂已收盘的 candle;信号出现在第 N 根,订单最早在第 N+1 根成交;窗口前会先预热(最长指标周期的量级,例如 EMA200) | 策略不可能用上作决定时还不存在的信息 | 预热段不交易;窗口太短导致全被预热吃光时会直接失败,而不是给一个空结果 |
| 订单约束真的会被执行 | 会检查步长与最小变动价位、最小数量、最小名义金额;不够资金的买单或超过持仓的卖单整单拒绝,而不是悄悄缩小 | 避免出现实盘中必然被交易所拒掉的成交 | 若回测里订单被大量拒绝,问题在预算或下单量级,不在行情 |
| 技术指标新鲜度被当作前提 | 回测假定信号管道是健康的,不模拟计算任务停摆造成的过期信号 | 回测衡量的是策略行为,不是运维水平 | 实盘里信号过期属于运维问题,由监控发现,不在回测范围内 |
回测在界面上的样子:一份被保留的历史
它不是跑完就消失的数字。每次运行都会被保留下来,可以对比不同窗口、不同币种的结果,也可以把某次运行钉成基线供后续对照。
| 界面元素 | 它是什么 | 怎么用 |
|---|---|---|
| 运行列表 | 每次回测一行,带窗口区间、状态与结果摘要 | 用来横向对比同策略在不同窗口/币种的表现,而不是挑看起来顺眼的那一行 |
| 运行状态 | 排队中 / 运行中 / 完成 / 出错 / 已取消,非终态不会被当成结论 | 长时间卡在运行中说明 worker 可能有异常,可用中止或重试操作处理 |
| 窗口与币种 | 本次回测覆盖的行情区间与标的组合 | 对比两条结果前先确认窗口一致,否则不可比 |
| 钉住为基线 | 把某次完成的运行指定为该 Profile 的对照基线 | 上线后 edge-decay 监控就是拿实盘与这条基线比;基线被钉住时不能直接删除 |
| 深链接 | 选中的运行会写进 URL(?run=…) | 可以把一次运行的结果与配置直接分享或重新打开 |
| 数据覆盖警告 | 某个标的的覆盖不足、或存在一段连续长缺口时会给出警示 | 看到警告就先别解读结果——数据本身不完整 |
| 进度阶段 | 回填行情 → 预热指标 → 回放策略 → 汇总 | 预热阶段本身不交易;短窗口被预热占满时会直接失败 |
报告字段怎么读,以及判定顺序为什么是这样
官方给了一页完整的指标参考。这里只挑出决定「能不能上线」的那几个字段,并说明它们各自回答什么问题。
| 字段 | 它回答什么问题 | 怎么用 | 注意点 |
|---|---|---|---|
| 相对持有的超额(alpha vs 持有) | 这套策略相比「什么也不做、直接拿着这一篮子」多还是少 | 这是第一个要看的字段;它扣掉手续费后再和被动基准比 | 总回报为正但该字段为负,说明跑输了一直持有;界面会直接给出「建议持有」的提示 |
| 样本外检查(outOfSample) | 把调参没针对过的那段(最近 30%)单独算一遍,结论还成立吗 | 这是判断有没有过拟合的主要依据,也是门禁默认要求通过的一项 | 窗口太短切不出留出段时该字段为空,属于「不通过」,需要重跑更长的窗口 |
| 按行情状态分解(regimeBreakdown) | 上涨 / 震荡 / 下跌三种行情里,各自表现如何 | 看它的正超额是不是只出现在上涨行——那更接近「在涨市里持有」而不是找到边缘 | 用基准标的日线与 50 日均线划分,无前视;窗口太短则为空 |
| 往返交易(roundTrips) | 每一笔「卖出配对平均成本」的完整闭环记录 | 看不同离场原因分别贡献了什么,用来发现某类离场在拖后腿 | 网格多次买入后一次卖出算一笔往返,不是每次成交算一笔 |
| 为什么交易 / 为什么没交易(漏斗) | 有多少次入场被哪一道门拦下、各拦了多少 | 先看漏斗再谈调参,否则容易把「门禁本来就该拦」当成策略失效 | 门禁按顺序短路判定,因此各原因计数是分段划分的,不会重复计数 |
| 确定性诊断(diagnosis spine) | 只列出「可被证明」的原因,排在指标前面 | 按它给的顺序读:漏斗拦截 → 门禁未过项 → 分段事实 → 兜底说明 | 它不会用回撤或亏损金额倒推原因——那些是结果,不是原因 |
| 门禁评分卡 | 三项质量阈值在当前配置下的通过情况 | 让你在回测阶段就知道离上线门槛差在哪,而不是等启用实盘时才被拒 | 它只判断质量阈值;真正启用还要看配置指纹与新鲜度,那是放行卡片的职责 |
| config-proof 状态 | 当前配置到底有没有被验证过 | 卡片三态:已证实 / 未证实 / 门禁关闭 | 仅供参考,不阻塞:未证实也会照常交易,不会有任何运行时开关 |
| 运行血缘与对比锚点 | 这次结果与哪次基线可比 | 对比前先对齐窗口、币种与配置指纹 | 指纹不同的两次结果没有可比性 |
实盘与回测的差距:哪些是模型偏差,哪些是运行差异
把差距分成两类看会更清楚:一类是回测模型天生做不到的事(无法消除,只能理解),另一类是运行环境与历史窗口不同带来的差异(可以在实盘中被监控发现)。
| 差距来源 | 性质 | 官方怎么处理 | 你该怎么做 |
|---|---|---|---|
| 成交被理想化 | 模型偏差 | 用价差扣减与成交量上限把成交做得更悲观;但幅度取决于你是否设了这两项 | 不要把价差与成交量上限留空;留空的运行会让你误读偏乐观的数字 |
| 幸存者偏差 | 模型偏差 | 标的覆盖低于区间的 95% 会给出告警,但不会重建缺失的历史 | 看到覆盖告警就换窗口或换标的,不要硬解读 |
| bar 内部路径未知 | 模型偏差 | 用更细周期的明细 bar 收窄顺序偏差,但仍无法完全消除 | 明细周期越细越好,并且能整除策略周期更省事 |
| 成交价处假定流动性无限、且不计延迟与盘口深度 | 模型偏差 | 明确写入局限声明,不做模拟 | 把回测当成「上界」,不是「预期」 |
| 止盈止损的触发价 | 模型偏差 | 策略读到的现价是最后一根已收盘 candle 的收盘价;实盘喂给同一条门禁的是约 1 秒新的迷你逐笔价 | 实盘里离场或止损可能比回测提前至多一根 candle 触发(成交价不受影响) |
| 账户被当作只属于本 Profile | 模型偏差 | 截面敞口只汇总本次运行自己的持仓 | 多 Profile 共享一个账户时,回测里的敞口上限比实盘更宽松 |
| 护栏型停损单可能失效 | 模型偏差 | 按交易所的真实行为建模:先触发再挂限制价,若行情直接跳空越过限价则一直不成交 | 这正是「保护性止损也可能不保护」的尾部风险,要有心理与实际准备 |
| 发现模式(discovery) | 模型偏差 | 整个窗口按「已由发现机制管理」处理,不建模加入与淘汰的时点 | 它的结果是该模式的上界;且必须配置止损比例,否则每次入场都会被拦下 |
| 上线后的表现漂移 | 运行差异 | edge-decay 监控每 15 分钟用实盘已实现净盈利因子与钉住的基线对比 | 收到提醒≠自动停手:它只提示,是否收手由你的风控断路器与你自己决定 |
| 过拟合 | 方法风险 | 用样本外留出段作为默认必过项 | 调参越多,越要只看留出段结论 |
AI 回测顾问:能帮你做什么,不能替你做什么
它是回测侧的一个可选辅助:把这次运行的上下文交给模型,让模型提出「可以试哪几个改动」,然后你照旧回到「加载 → 重跑 → 过样本外门禁」这条回路。它不写你的实盘配置。
在应用内配置 provider
位置是 Account → AI assistant。可选 Anthropic,或任何 OpenAI 兼容端点(例如本地 Ollama)。Key 与模型名存在数据库里,不通过 .env 配置。
预期输出AI assistant 保存成功;研究角色的 worker 就绪标志 advisor:ready 置位后才可用。在运行的顾问区请求建议
建议是后台持久化的:每个(Profile、运行、变体)一行结果,刷新页面或关掉标签页都不丢,打开旧运行会复用以前的建议,不重复计费。
预期输出请求返回 202 表示已入队(后台任务);返回 503 表示研究 worker 离线或没有配置 AI provider。选择变体
默认是 safe:只提出「更可能改善未来表现」的改动,并且在没有一个改动能胜过持有现金时会直接建议持有。另外四个是显式开启的探索视角:让赢家跑更久的 ride-trend、放宽入场节流的 trade-more、更激进的 aggressive、控回撤的 defensive。
预期输出探索型变体的建议会被标注为中/高过拟合风险,且属于「假设」,不是结论。加载、重跑、再过门禁
建议以卡片形式出现,可以勾选后「加载进表单并重测」。任何建议都不会直接写入实盘配置;只有重跑之后通过了样本外门禁,才会出现「应用到实盘配置」这一步。
预期输出重跑产生新运行 → 新运行必须自己过门禁;未通过则不会提供应用入口。没有服务端 provider 也能用
可以点「自己跑」:界面会把服务端本来要发的完整提示词交给你,你复制到自己的对话工具里,再把回复粘回来。它走的是同一套策略 schema 校验,保存在该运行的 manual 槽位,不需要服务端凭据。
预期输出校验不通过的条目会被丢弃并标记为 dropped,只有合法条目会呈现给你。
| 边界 | 说明 |
|---|---|
| 它会看到的上下文 | 本次配置与参数、指标、放行检查清单与当前通过情况、数据覆盖告警、持有对比基线、成交模型真实性、为什么不交易的分解、行情状态分解、样本外留出、同市场历史运行、下采样后的资金与回撤曲线、离场原因分布 |
| 它被要求做什么 | 只提出「可能改善未来(样本外)表现」的改动;不得放松看跌评级的否决,也不得去调那些放行门禁明确忽略的风险调整比率 |
| 它不能做什么 | 不能越过门禁直接上线;不能修改你的实盘配置;不能承诺收益;建议必须重新回测并被样本外门禁接受才算数 |
| 前置条件 | 需要一个可用的 AI provider(自带 Key),或在没有 provider 时走「自己跑」的手动回路;研究角色 worker 未就绪时接口直接返回不可用 |
| 风险 | 模型建议属于统计假设;探索型变体的改动方差更高、过拟合风险被显式标注;把建议当预测就是误用 |
先把边界说清楚,再看数字
这一节不是客套话,而是官方自己在 README 与文档首页用最醒目方式写下的立场。本站照原意转述,不做软化。
| 本站不会提供的内容 | 为什么 | 依据 |
|---|---|---|
| 任何收益预期或回报区间 | 官方明确无法保证盈利,任何区间都是编造 | 官方 README 与文档首页的风险声明 |
| 胜出概率类指标当作承诺 | 样本内的比例不构成未来概率 | 官方指标说明与样本外检查的存在理由 |
| 任何形式的盈利承诺表述 | 与官方「无法保证盈利」的立场直接冲突 | 同上 |
| 把某一次回测的具体金额当作推荐依据 | 哪怕数值来自真实回测,也只是历史窗口里的一次结果 | 官方「过去不等于未来」声明 |
| 投资建议、代客操作或代下单服务 | 本站是项目研究站,不是投顾 | 站点定位与官方免责声明 |
| 把回测通过说成「可以放心上实盘」 | 门禁是提示性的,且回测本身偏乐观 | 官方回测局限声明 |
关于回测与放行门禁的常见问题
回测能证明什么?
能证明的是「这份配置在一段历史窗口上、按一套明确写出的成交假设跑出来的结果」。它回答的是配置之间可比性的问题,不能证明未来表现。官方在同一章里明确写着回测相对实盘偏乐观,并逐条列出原因;具体条款以官方 backtesting 文档为准。
回测结果和实盘差在哪?
差在两处:一是模型本身做不到的部分(bar 内部路径未知、成交价处假定流动性无限、不建模延迟与盘口深度、账户被当作只属于本 Profile);二是可直接被感知的差异(策略读到的现价在回测里是最后一根已收盘 candle 的收盘价,而实盘喂进同一条门禁的是约 1 秒新的迷你逐笔价,因此离场或止损在实盘里可能提前至多一根 candle 触发)。以上均以官方 backtesting 文档为准。
为什么改了参数就得重跑?
因为放行的依据是「同一份配置指纹」。回测完成时会把实际执行的那份有效配置算成指纹;配置一变,指纹就变,旧回测不再匹配,卡片也就无法给出已验证的结论。只有用新配置重新跑一次,才重新有证据。以官方 backtesting 文档中关于配置来源与指纹的说明为准。
能不能只看回测好看就直接上实盘?
技术上可以——这套判定是提示性的,门禁不会阻止你启用实盘,也不会在实盘中途暂停买入。但官方自己写着不建议投入真实资金,且回测偏乐观;如果配置指纹不匹配或样本外没通过,你是在没有证据的情况下承担真实风险。是否启用由你自己决定,本站不提供「可以放心上」的结论。
config-proof 显示未证实,要不要处理?
它是提醒,不是故障。未证实意味着当前配置没有找到指纹一致的近期回测,交易会照常继续,后台也不存在任何会因此暂停交易的定时任务或开关。若你想让卡片变成已证实,就用当前配置跑一次独立回测(不加配置覆盖)。以官方文档中「config-proof 仅供参考」一节为准。
回测历史里的某次结果被删掉了会怎样?
已完成的运行可以从历史里删除,但有两种情况会被拒绝:它仍是该 Profile 钉住的基线时(需要先解除钉住,否则放行卡片引用的基线会被清空),或者它还在跑(需要先中止)。以官方 backtesting 文档中关于运行恢复与删除的说明为准。
不想承担实盘风险,只想验证一个想法怎么办?
可以只做研究:EasyClaw 本机已核验的量化分析类技能能做策略回测与风险指标计算,图表类技能能把结果出成图片,都不需要接交易所、也不下任何单。需要说明的是:EasyClaw 没有下单类技能,与 binance-trading-bot 之间也无已证实集成,两条路线解决的是不同任务(研究 vs 执行)。相关能力的边界以各技能自己的说明为准。