binance-trading-bot · 回测与实盘放行门禁

binance-trading-bot 回测与实盘放行:为什么改了参数就得重跑

它把回测当成上线前的证据,而不是一张成绩单:回测与实盘跑的是同一个执行器,每次完成都会把「实际执行的那份配置」算成一个配置指纹,只有找到同一份指纹的近期回测,放行卡片才会给出一致性判断。改一个执行参数,指纹就变了,旧回测不再为你作证。这一页讲清成交假设、报告字段、样本外检查与 AI 回测顾问的边界。

用途:上线前核对配置依据官方 docs/concepts/backtesting 与 backtest-metrics不含任何收益预期

放行门禁一轮回路

配置一变,指纹就变;指纹变了,就必须用新配置重跑一次。

配置 + 指纹对实际执行的有效配置取哈希
用该指纹回测独立回测,不作配置覆盖
放行判定数据覆盖 → 样本内 → 样本外
放行 / 未证实改配置则回到第一步重跑
实盘放行门禁示意图(依据官方 backtesting / execution-modes 文档绘制)。放行的依据是「同一份 config 指纹的回测」,不是任何收益预期;改了执行参数就得用新配置重跑。
Enablement gate

放行门禁是怎么走完一轮的

这套判定是提示性的:结果显示在 Profile 的 Live gate 卡片上,既不阻止你启用实盘,也不会在实盘中途暂停买入。但它是唯一能告诉你「这份配置到底有没有被验证过」的地方,所以顺序必须照着走。

  1. 先改配置

    在 Profile 的 Strategy 区调整参数,或者换一套 rulebook。改完先别急着开实盘。

    预期输出
    Strategy 区保存成功;Live gate 卡片上的指纹与旧回测不再匹配,状态回到「未证实」。
  2. 生成配置指纹

    每次回测完成时,系统会把实际执行的那份有效配置(Profile 配置合并本次运行覆盖)算成一个稳定哈希,存在本次运行记录里。增删一个参数,哈希就不同。

    预期输出
    backtest_runs.config_fingerprint = 该次运行实际执行的配置哈希
  3. 用同一份指纹跑独立回测

    放行只看独立回测(不加配置覆盖)的结果:只有它测的才是你准备上线的这份配置。带覆盖的运行测的是另一份配置,指纹不会匹配。

    预期输出
    Live gate 卡片:找到指纹一致的近期完成运行 → 进入判定;找不到 → 显示未证实(仍可启用)。
  4. 按固定顺序判定

    判定顺序是:数据覆盖 → 样本内阈值 → 样本外阈值。数据覆盖是硬性前置,因为它不通过时后面的数字再好看也不可信。

    预期输出
    数据覆盖通过 → 再比样本内三项 → 再比样本外三项;任一步不过即在该行标红。
  5. 拿到一致性结论

    结果只有三种:已证实(validated)、未证实(unproven)、门禁关闭(gate-off)。未证实只是一个提醒,交易照常继续;门禁关闭是你在 Live gate 弹窗里主动关掉阈值测量的结果,属于可见的显式选择。

    预期输出
    卡片显示 validated / unproven / gate-off,每 30 秒轮询一次;测试网 Profile 不显示该卡片。
  6. 上线后继续对照

    启用之后,edge-decay 监控每 15 分钟用实盘已实现净盈利因子与「钉住的基线回测」做对比,发现衰减只做提醒,不会暂停买入。

    预期输出
    判定 insufficient-data / warn / breached;warn 与 breached 在面板标记并推一条通知,同一轮衰减只提醒一次。
为什么「市场模式」的回测不能授权 maker 模式:执行模式(market / maker)属于配置的一部分,改它会改变配置指纹。用市场模式跑出来的回测证明的是市场模式下那份配置,拿去给 maker 模式的 Profile 作证属于指纹不匹配——必须用 maker 的配置重新跑一次。详见策略页的执行模式一节。
Fill assumptions

成交与滑点假设:回测的乐观就藏在这张表里

官方在回测章节开头就写明:回测相对实盘是偏乐观的。原因是下面这些假设。先用它们校准你对结果的期待,再去看报告里的数字。

假设官方怎么定义对结果的影响你该怎么读
挂单只在「穿过」时成交限价单要等后续 bar 穿过该价格才成交(买单:bar 最低价低于限价;卖单:bar 最高价高于限价),仅仅触及不算比「触价即成交」保守,模拟了排队未成交的情形不要指望每个触及价位的挂单都会成交;未成交是机制的一部分
价差扣减每次成交(含限价单)都按买卖价差的一半扣减;表单默认 5 个基点,留空则不扣没有这一项时,限价单会以正好等于挂单价成交,高估做市型策略核对这次运行有没有把价差设为 0;留空属于异常口径
市价单付滑点、挂单不付市价单按下一根 bar 的开盘价加滑点,再叠加价差扣减;挂单成交在限价(同样叠加价差扣减)但不计滑点市价单的成本被显式计入;挂单省下的正是这部分这与「maker 模式省的是点差与滑点、不是手续费」是同一件事
成交量参与上限单笔成交不超过该成交 bar 基础成交量的百分比;表单默认 5%,留空则不限;超过部分留到后续 bar 继续成交限制了大单在稀薄行情里「一次吃掉整根 bar」的乐观假设小单在流动性好的 bar 上不受影响,只有大单遇稀薄 bar 才会被切分
与实盘共用同一个执行器回测执行器实现的是实盘同一个执行器契约,策略无法分辨自己是在回测还是实盘这是回测与实盘不会各自漂移的根本原因它保证的是「逻辑一致」,不等于「结果一致」——见下一张表
前视保护与预热只喂已收盘的 candle;信号出现在第 N 根,订单最早在第 N+1 根成交;窗口前会先预热(最长指标周期的量级,例如 EMA200)策略不可能用上作决定时还不存在的信息预热段不交易;窗口太短导致全被预热吃光时会直接失败,而不是给一个空结果
订单约束真的会被执行会检查步长与最小变动价位、最小数量、最小名义金额;不够资金的买单或超过持仓的卖单整单拒绝,而不是悄悄缩小避免出现实盘中必然被交易所拒掉的成交若回测里订单被大量拒绝,问题在预算或下单量级,不在行情
技术指标新鲜度被当作前提回测假定信号管道是健康的,不模拟计算任务停摆造成的过期信号回测衡量的是策略行为,不是运维水平实盘里信号过期属于运维问题,由监控发现,不在回测范围内
还有三项是蜡烛级回放天生做不到的:① bar 内部的真实价格路径未知,只能假设;② 成交价处假定流动性无限,真实成交会沿着盘口逐层吃单;③ 不建模网络延迟与盘口深度。因此回测无法从原理上「证明」实盘结果。
Evidence

回测在界面上的样子:一份被保留的历史

它不是跑完就消失的数字。每次运行都会被保留下来,可以对比不同窗口、不同币种的结果,也可以把某次运行钉成基线供后续对照。

binance-trading-bot 的回测历史列表截图,显示每次回测的时间窗口、状态与盈亏
回测历史列表(来源:项目官方文档 docs/assets/readme/backtest-history.png,Apache-2.0)。官方声明指南内截图均为种子演示数据;历史回测结果不代表未来表现,不构成收益预期。
界面元素它是什么怎么用
运行列表每次回测一行,带窗口区间、状态与结果摘要用来横向对比同策略在不同窗口/币种的表现,而不是挑看起来顺眼的那一行
运行状态排队中 / 运行中 / 完成 / 出错 / 已取消,非终态不会被当成结论长时间卡在运行中说明 worker 可能有异常,可用中止或重试操作处理
窗口与币种本次回测覆盖的行情区间与标的组合对比两条结果前先确认窗口一致,否则不可比
钉住为基线把某次完成的运行指定为该 Profile 的对照基线上线后 edge-decay 监控就是拿实盘与这条基线比;基线被钉住时不能直接删除
深链接选中的运行会写进 URL(?run=…)可以把一次运行的结果与配置直接分享或重新打开
数据覆盖警告某个标的的覆盖不足、或存在一段连续长缺口时会给出警示看到警告就先别解读结果——数据本身不完整
进度阶段回填行情 → 预热指标 → 回放策略 → 汇总预热阶段本身不交易;短窗口被预热占满时会直接失败
看这一页的边界:截图来自官方文档,官方声明其中所有数字均为种子演示数据。本站不复述截图里的任何数字,也不把任何一次回测当作可预期收益的依据。
Read the report

报告字段怎么读,以及判定顺序为什么是这样

官方给了一页完整的指标参考。这里只挑出决定「能不能上线」的那几个字段,并说明它们各自回答什么问题。

字段它回答什么问题怎么用注意点
相对持有的超额(alpha vs 持有)这套策略相比「什么也不做、直接拿着这一篮子」多还是少这是第一个要看的字段;它扣掉手续费后再和被动基准比总回报为正但该字段为负,说明跑输了一直持有;界面会直接给出「建议持有」的提示
样本外检查(outOfSample)把调参没针对过的那段(最近 30%)单独算一遍,结论还成立吗这是判断有没有过拟合的主要依据,也是门禁默认要求通过的一项窗口太短切不出留出段时该字段为空,属于「不通过」,需要重跑更长的窗口
按行情状态分解(regimeBreakdown)上涨 / 震荡 / 下跌三种行情里,各自表现如何看它的正超额是不是只出现在上涨行——那更接近「在涨市里持有」而不是找到边缘用基准标的日线与 50 日均线划分,无前视;窗口太短则为空
往返交易(roundTrips)每一笔「卖出配对平均成本」的完整闭环记录看不同离场原因分别贡献了什么,用来发现某类离场在拖后腿网格多次买入后一次卖出算一笔往返,不是每次成交算一笔
为什么交易 / 为什么没交易(漏斗)有多少次入场被哪一道门拦下、各拦了多少先看漏斗再谈调参,否则容易把「门禁本来就该拦」当成策略失效门禁按顺序短路判定,因此各原因计数是分段划分的,不会重复计数
确定性诊断(diagnosis spine)只列出「可被证明」的原因,排在指标前面按它给的顺序读:漏斗拦截 → 门禁未过项 → 分段事实 → 兜底说明它不会用回撤或亏损金额倒推原因——那些是结果,不是原因
门禁评分卡三项质量阈值在当前配置下的通过情况让你在回测阶段就知道离上线门槛差在哪,而不是等启用实盘时才被拒它只判断质量阈值;真正启用还要看配置指纹与新鲜度,那是放行卡片的职责
config-proof 状态当前配置到底有没有被验证过卡片三态:已证实 / 未证实 / 门禁关闭仅供参考,不阻塞:未证实也会照常交易,不会有任何运行时开关
运行血缘与对比锚点这次结果与哪次基线可比对比前先对齐窗口、币种与配置指纹指纹不同的两次结果没有可比性
判定顺序(官方默认阈值,写在 Profile 的放行策略里,可在 Live gate 弹窗修改):数据覆盖——运行带任何覆盖警告就直接不通过(覆盖低于预期的 95%,或存在一段 ≥12 根 bar 的连续缺口);② 样本内——净盈利因子 ≥ 1.1、闭环交易数 ≥ 100、相对持有的超额 ≥ 0,且用作证据的运行距离现在不超过 14 天;③ 样本外——留出段同样要过净盈利因子与超额门槛,并且留出段交易数 ≥ 20。阈值是可调的默认值,不是战绩;它们只表示「这份配置有没有被验证过」。
Live vs backtest

实盘与回测的差距:哪些是模型偏差,哪些是运行差异

把差距分成两类看会更清楚:一类是回测模型天生做不到的事(无法消除,只能理解),另一类是运行环境与历史窗口不同带来的差异(可以在实盘中被监控发现)。

差距来源性质官方怎么处理你该怎么做
成交被理想化模型偏差用价差扣减与成交量上限把成交做得更悲观;但幅度取决于你是否设了这两项不要把价差与成交量上限留空;留空的运行会让你误读偏乐观的数字
幸存者偏差模型偏差标的覆盖低于区间的 95% 会给出告警,但不会重建缺失的历史看到覆盖告警就换窗口或换标的,不要硬解读
bar 内部路径未知模型偏差用更细周期的明细 bar 收窄顺序偏差,但仍无法完全消除明细周期越细越好,并且能整除策略周期更省事
成交价处假定流动性无限、且不计延迟与盘口深度模型偏差明确写入局限声明,不做模拟把回测当成「上界」,不是「预期」
止盈止损的触发价模型偏差策略读到的现价是最后一根已收盘 candle 的收盘价;实盘喂给同一条门禁的是约 1 秒新的迷你逐笔价实盘里离场或止损可能比回测提前至多一根 candle 触发(成交价不受影响)
账户被当作只属于本 Profile模型偏差截面敞口只汇总本次运行自己的持仓多 Profile 共享一个账户时,回测里的敞口上限比实盘更宽松
护栏型停损单可能失效模型偏差按交易所的真实行为建模:先触发再挂限制价,若行情直接跳空越过限价则一直不成交这正是「保护性止损也可能不保护」的尾部风险,要有心理与实际准备
发现模式(discovery)模型偏差整个窗口按「已由发现机制管理」处理,不建模加入与淘汰的时点它的结果是该模式的上界;且必须配置止损比例,否则每次入场都会被拦下
上线后的表现漂移运行差异edge-decay 监控每 15 分钟用实盘已实现净盈利因子与钉住的基线对比收到提醒≠自动停手:它只提示,是否收手由你的风控断路器与你自己决定
过拟合方法风险用样本外留出段作为默认必过项调参越多,越要只看留出段结论
edge-decay 的判定口径(官方默认):实盘净盈利因子与基线相比,低于基线 ×0.85 判为 warn,低于基线 ×0.6 判为 breached,另外有一条绝对底线——实盘净盈利因子低于 1(净亏损)无论基线多少都算 breached;样本不足(少于 10 笔)则显示数据不足。默认模式是 warn(提醒不拦截),也可以关掉。它永远不会暂停买入——运行时唯一能暂停买入的机制是三个风控断路器。
AI advisor

AI 回测顾问:能帮你做什么,不能替你做什么

它是回测侧的一个可选辅助:把这次运行的上下文交给模型,让模型提出「可以试哪几个改动」,然后你照旧回到「加载 → 重跑 → 过样本外门禁」这条回路。它不写你的实盘配置。

  1. 在应用内配置 provider

    位置是 Account → AI assistant。可选 Anthropic,或任何 OpenAI 兼容端点(例如本地 Ollama)。Key 与模型名存在数据库里,不通过 .env 配置。

    预期输出
    AI assistant 保存成功;研究角色的 worker 就绪标志 advisor:ready 置位后才可用。
  2. 在运行的顾问区请求建议

    建议是后台持久化的:每个(Profile、运行、变体)一行结果,刷新页面或关掉标签页都不丢,打开旧运行会复用以前的建议,不重复计费。

    预期输出
    请求返回 202 表示已入队(后台任务);返回 503 表示研究 worker 离线或没有配置 AI provider。
  3. 选择变体

    默认是 safe:只提出「更可能改善未来表现」的改动,并且在没有一个改动能胜过持有现金时会直接建议持有。另外四个是显式开启的探索视角:让赢家跑更久的 ride-trend、放宽入场节流的 trade-more、更激进的 aggressive、控回撤的 defensive。

    预期输出
    探索型变体的建议会被标注为中/高过拟合风险,且属于「假设」,不是结论。
  4. 加载、重跑、再过门禁

    建议以卡片形式出现,可以勾选后「加载进表单并重测」。任何建议都不会直接写入实盘配置;只有重跑之后通过了样本外门禁,才会出现「应用到实盘配置」这一步。

    预期输出
    重跑产生新运行 → 新运行必须自己过门禁;未通过则不会提供应用入口。
  5. 没有服务端 provider 也能用

    可以点「自己跑」:界面会把服务端本来要发的完整提示词交给你,你复制到自己的对话工具里,再把回复粘回来。它走的是同一套策略 schema 校验,保存在该运行的 manual 槽位,不需要服务端凭据。

    预期输出
    校验不通过的条目会被丢弃并标记为 dropped,只有合法条目会呈现给你。
边界说明
它会看到的上下文本次配置与参数、指标、放行检查清单与当前通过情况、数据覆盖告警、持有对比基线、成交模型真实性、为什么不交易的分解、行情状态分解、样本外留出、同市场历史运行、下采样后的资金与回撤曲线、离场原因分布
它被要求做什么只提出「可能改善未来(样本外)表现」的改动;不得放松看跌评级的否决,也不得去调那些放行门禁明确忽略的风险调整比率
它不能做什么不能越过门禁直接上线;不能修改你的实盘配置;不能承诺收益;建议必须重新回测并被样本外门禁接受才算数
前置条件需要一个可用的 AI provider(自带 Key),或在没有 provider 时走「自己跑」的手动回路;研究角色 worker 未就绪时接口直接返回不可用
风险模型建议属于统计假设;探索型变体的改动方差更高、过拟合风险被显式标注;把建议当预测就是误用
Boundaries

先把边界说清楚,再看数字

这一节不是客套话,而是官方自己在 README 与文档首页用最醒目方式写下的立场。本站照原意转述,不做软化。

官方原意转述:该项目尚未达到生产可用(not production-ready),是一次从底层重写、仍在开发中的项目,官方明确不建议投入真实资金;官方同时声明无法保证使用者是否能盈利,使用风险自负,作者不为任何直接或间接损失承担责任。官方文档里所有界面截图都基于种子演示数据生成,不是真实账户,也不是业绩记录。
本站不会提供的内容为什么依据
任何收益预期或回报区间官方明确无法保证盈利,任何区间都是编造官方 README 与文档首页的风险声明
胜出概率类指标当作承诺样本内的比例不构成未来概率官方指标说明与样本外检查的存在理由
任何形式的盈利承诺表述与官方「无法保证盈利」的立场直接冲突同上
把某一次回测的具体金额当作推荐依据哪怕数值来自真实回测,也只是历史窗口里的一次结果官方「过去不等于未来」声明
投资建议、代客操作或代下单服务本站是项目研究站,不是投顾站点定位与官方免责声明
把回测通过说成「可以放心上实盘」门禁是提示性的,且回测本身偏乐观官方回测局限声明
官方给的读法建议(按顺序):先看相对持有的超额,再看它在样本外是否还成立,最后才用风险调整类比率在「已经过了前两条」的配置之间挑更平稳的那条。如果一份配置在前两条都不成立,官方的结论是「未证明存在边缘」,而不是「再调得更狠一点」。
FAQ

关于回测与放行门禁的常见问题

回测能证明什么?

能证明的是「这份配置在一段历史窗口上、按一套明确写出的成交假设跑出来的结果」。它回答的是配置之间可比性的问题,不能证明未来表现。官方在同一章里明确写着回测相对实盘偏乐观,并逐条列出原因;具体条款以官方 backtesting 文档为准。

回测结果和实盘差在哪?

差在两处:一是模型本身做不到的部分(bar 内部路径未知、成交价处假定流动性无限、不建模延迟与盘口深度、账户被当作只属于本 Profile);二是可直接被感知的差异(策略读到的现价在回测里是最后一根已收盘 candle 的收盘价,而实盘喂进同一条门禁的是约 1 秒新的迷你逐笔价,因此离场或止损在实盘里可能提前至多一根 candle 触发)。以上均以官方 backtesting 文档为准。

为什么改了参数就得重跑?

因为放行的依据是「同一份配置指纹」。回测完成时会把实际执行的那份有效配置算成指纹;配置一变,指纹就变,旧回测不再匹配,卡片也就无法给出已验证的结论。只有用新配置重新跑一次,才重新有证据。以官方 backtesting 文档中关于配置来源与指纹的说明为准。

能不能只看回测好看就直接上实盘?

技术上可以——这套判定是提示性的,门禁不会阻止你启用实盘,也不会在实盘中途暂停买入。但官方自己写着不建议投入真实资金,且回测偏乐观;如果配置指纹不匹配或样本外没通过,你是在没有证据的情况下承担真实风险。是否启用由你自己决定,本站不提供「可以放心上」的结论。

config-proof 显示未证实,要不要处理?

它是提醒,不是故障。未证实意味着当前配置没有找到指纹一致的近期回测,交易会照常继续,后台也不存在任何会因此暂停交易的定时任务或开关。若你想让卡片变成已证实,就用当前配置跑一次独立回测(不加配置覆盖)。以官方文档中「config-proof 仅供参考」一节为准。

回测历史里的某次结果被删掉了会怎样?

已完成的运行可以从历史里删除,但有两种情况会被拒绝:它仍是该 Profile 钉住的基线时(需要先解除钉住,否则放行卡片引用的基线会被清空),或者它还在跑(需要先中止)。以官方 backtesting 文档中关于运行恢复与删除的说明为准。

不想承担实盘风险,只想验证一个想法怎么办?

可以只做研究:EasyClaw 本机已核验的量化分析类技能能做策略回测与风险指标计算,图表类技能能把结果出成图片,都不需要接交易所、也不下任何单。需要说明的是:EasyClaw 没有下单类技能,与 binance-trading-bot 之间也无已证实集成,两条路线解决的是不同任务(研究 vs 执行)。相关能力的边界以各技能自己的说明为准。

下一步:把风控配好,再决定要不要放行

回测只回答「这份配置有没有被验证过」。真正决定实盘风险的,是三个断路器与三级急停——它们才是运行时唯一能暂停买入的机制。