策略
BTC 被动微观错位流动性供给,市场中性均值回归(单品种 BTCUSDT.BINANCE 永续合约,QUOTE-TICK 驱动,MAKER 限价单 —— 通过 PROVIDING 流动性来消除对短期公允价值的小幅偏离,赚取价差 + 回归收益,延续行情下硬性吃单止损,3 参数)
结局: 已放弃
BtcMakerMicroDislocationLiquidityProvisionLS
BTC 被动微观错位流动性供给,市场中性均值回归(单品种 BTCUSDT.BINANCE 永续合约,QUOTE-TICK 驱动,MAKER 限价单 —— 通过 PROVIDING 流动性来消除对短期公允价值的小幅偏离,赚取价差 + 回归收益,延续行情下硬性吃单止损,3 参数)
假设
一项在 BTCUSDT.BINANCE USD-M 永续合约上的 MARKET-NEUTRAL(均值回归)、单品种、报价-逐笔微观结构策略,通过 PASSIVE MAKER LIMIT ORDERS 提供流动性 —— 与本次会话中的所有策略在执行模型上根本不同,这些策略均使用吃单/市价单,并且全部因 fee_edge 而失败(195x)或在结构上受到威胁。这是对单一最持续失败模式的刻意回应。K线级别的方向性 FADING 在本次会话中被决定性地驳倒(横截面反转 −48%;VWAP/影线无效),但这与做市商所做的事情是 DIFFERENT 不同的事情:做市商从 MICRO 错位的均值回归中获利,正是因为它们 (a) EARN 买卖价差而非支付价差,并且 (b) 支付 MAKER 手续费(Binance USD-M 0.02%),而非吃单手续费(0.05%),因此一次被动往返的成本约为 0.04%,相对于使吃单策略走向灭亡的 0.10%。低约 2.5x 的成本下限是此处任何方向性策略都不具备的结构性优势。机制:通过报价逐笔数据跟踪短期公允价值(微价格 / 中间价的 EMA);当中间价从公允价值小幅偏离(瞬时噪声错位,NOT 趋势),在有利一侧挂出 MAKER LIMIT 单,以更优价格提供流动性;若成交,则在公允价值附近/处被动平仓,捕获价差的 PLUS 回归;若价格沿不利方向继续运行超过硬性阈值(逆向选择 / 真实行情),立即以吃单止损砍仓。它与已挂起的三项吃单微观结构探针(BTC 流动性扫单、SOL CVD 流、ETH 订单簿深度 —— 均为 AGGRESSIVE/方向性)确有不同:这是 PASSIVE/均值回归且具有手续费优势。填补了代表性不足的 SHORT 周期(9.2%)、空缺的市场中性桶,并引入了 quote_ticks 原语和 maker 单执行,这些都是当前组合中所缺失的。单品种、单场所(无跨场所基础设施陷阱)。BTC 在 Binance 上拥有最窄价差和最深的报价流,且具备多年历史 -> 可量化的成交笔数非常高。仅 3 个参数,直击过度拟合的痛点。增加了代表性过度的 BINANCE —— 已接受;理由正是报价深度/价差紧度。我预先在风险因素中标记出核心注意事项(被动成交的真实性),以便 QA 仔细审视。
在真正的成因(数据而非阈值)上修复了第 -3 层的零交易失败:公允价值在 on_trade_tick 内部以 ONLY 方式播种,而目录审计显示沙盒窗口(最近约 30 天的 1 分钟K线)对任何品种都不包含 NO 秒以下数据 —— trade_tick/BTCUSDT.BINANCE 是 2026-05-06 上的 4 个文件,quote_tick/BTCUSDT.BINANCE 持有 2 条记录(12 KB),目录中最深的逐笔数据(SOLUSDT.BINANCE)止于 2026-07-17。因此 _fv 在全部 40,572 根已评估K线上都保持为 None,_manage() 在其首个守卫处返回,从未提交任何订单;任何阈值调整都不可能产生交易。最小的修复:将 EWMA 更新和风险止损被抽离到 _update_fv/_check_stop,由两条观察路径共享,并且 _ingest_bar_price 在(且仅在)tape_gap_seconds 内无任何逐笔数据到达时输入K线收盘价 —— 在任何存在逐笔数据的窗口中,逐笔数据仍然优先,因此对于存在逐笔数据的窗口代码保持不变。此前仅基于逐笔数据的止损(即在无逐笔数据的窗口中缺失),现在可在更新状态的任一观察上运行。fv_span_seconds 默认值 30 -> 300 秒,以使该跨度在 1 分钟分辨率下有意义(约 5 根K线的 EMA);仍以秒为单位且与到达率无关。已针对真实的最近 -30 天 BTC 1 分钟K线进行离线验证:中位 sigma 3.5 基点,带宽钉在 10 基点手续费下限,约 5,257 次报价触及 —— 现在能够以一定余量产生交易。第 1-2 层所通过的检查均保持不变:导入未改、单边报价未改、_cur_bar_ts 命名(基础 _bar_ts 阴影修复)未改、信号仍为连续的 (last_px - fv)/sigma。诚实地告知 QA 的范围说明(亦写入模块文档字符串):假设要求的是报价逐笔微价格,而目录中根本不存在报价流,因此所衡量的是同等手续费优势的 maker 均值回归,仅在分钟级分辨率下进行 —— 且无队列位置的触及成交模型使得每一个数字都是乐观的上界。
verification_loop:sandbox_timeout:验证失败(第 3 层 — 沙盒回测):冒烟测试在约 20000 根K线的窗口(BTCUSDT.BINANCE-1-MINUTE-LAST-EXTERNAL 的 30 天)上超出了 300 秒的挂钟时间限制。这几乎总是意味着每根K线的工作量随历史数据规模增长 —— 例如重新扫描完整的资金费/补充序列,或在每根K线的 calculate_signal()/on_bar() 内重建列表并调用 min()/sorted()。请在 __init__ 中预计算排序后的时间戳数组 ONCE 并使用 bisect,或按时间戳缓存查找,使每根K线的成本为 O(log n) 而非 O(n)。
实现
在 BTCUSDT.BINANCE USD-M 永续合约上进行市场中性被动流动性提供,采用 1 分钟时钟。维护一个随时间衰减的 EWMA 公允价值(fv_span_seconds),以及一个 EWMA 偏离尺度 sigma,依据最新可用的价格观察值计算(若该时间窗口存在亚秒级成交记录,则使用该记录;否则使用 1 分钟 K 线收盘价)。空仓时,仅在能够 FADES 当前偏离的一侧挂出恰好 ONE post_only MAKER 限价单(价格高于公允价值 -> 在 fv+band 挂 SELL;低于 -> 在 fv-band 挂 BUY),其中 band = max(band_k*sigma, 价格的 10 个基点),因此成交后的往返交易必须覆盖约 4 个基点的做市成本。成交后,在公允价值(回归目标)处挂出限价平仓单,并设置仅用于风险控制的吃单止损,触发价位为入场价之外 stop_mult*sigma,另设 30 分钟时间止损。两侧报价不可能同时存在,因此从设计上杜绝了双向震荡中的双重成交。
验证结果
sandbox_timeout:验证失败(层级 3 — 沙盒回测):烟雾测试在约 20000 根柱的窗口内(BTCUSDT.BINANCE-1-MINUTE-LAST-EXTERNAL 的 30 天)超过了 300s 墙钟时间限制。这几乎总是意味着每根柱的工作量会随历史数据增长——例如重新扫描完整的资金费率 / 补充序列,或在每根柱的 calculate_signal()/on_bar() 内重建列表并调用 min()/sorted()。在 __init__ 中预先计算排序后的时间戳数组 ONCE 并使用 bisect,或按时间戳缓存查找结果,使每根柱的成本为 O(log n),而不是 O(n)。
迭代历史
验证失败(层级 4 — QA 审查): - SIGNAL-PRIMITIVE / TIMEFRAME MISMATCH。假设明确由 QUOTE-TICK 驱动(microprice/EMA-of-mid 公允价值;将“引入 quote_ticks 基元”列为其新颖贡献),但代码未订阅任何报价 tick,而是从 15-MINUTE 分钟柱收盘价的 EMA 推导公允价值。这是被迫采用的数据变通方案(quote_tick 目录只有 2 条记录),但影响重大:在 15m 柱上,“微观偏离”变成普通的 bar 级均值回归——而假设本身宣称本次会话已否定这种做法,并将其与 MM 微观回归区分开来。因此,代码并未测试所述优势。 - DECISIVE FEE/EDGE FLOOR FAILURE。avg_trade_return_pct -0.0056%(负值,低于底线),total_return -88.8%,PF 0.617,在具有决定性的 2438 笔交易 / 364 天样本中为 max_drawdown 89.1%。开发者自己的 48 单元网格测试发现每个单元的净值都为负,最佳毛优势 +0.023% 对比 0.040% 做市成本——没有可供获取的回归优势。触价成交引擎高估了被动成交,因此现实表现会更差。这不是 L17 缺陷特征(胜率为 68% 且反向 RR 是预期的均值回归收益形态),而是优势不存在。 - 两侧报价(BUY @ fv-band、SELL @ fv+band)都可能在同一根 15m 柱内成交,早于 on_order_filled 取消另一侧,产生一轮已支付做市费用但净结果持平的往返交易,并导致费用损耗 / 换手率虚高(1222)。 - 被动成交真实性:引擎在挂单限价触价时即成交,不考虑队列位置或逆向选择,因此回测中的做市表现是乐观上限。即使在这种乐观假设下,结果也已经不合格。
验证失败(层级 3 — 沙盒回测):'int' 对象不可调用 使用的柱类型:SOLUSDT.BINANCE-1-MINUTE-LAST-EXTERNAL,处理的柱数:0 确保你的策略能用给定的数据和参数产生交易。
验证失败(第 3 层 — 沙盒回测):未产生任何交易 所使用的K线类型:BTCUSDT.BINANCE-1-MINUTE-LAST-EXTERNAL,已处理K线数:40576 诊断信息:should_enter() 在 40572 根已评估K线中某一方向返回了 0 次 -> 您的 ENTRY CONDITION 从未触发。请放宽入场逻辑 / 阈值。 请确保您的策略在给定数据和参数下能够产生交易。
验证失败(层级 1.5 — 假设 / 配置一致性)[class=hypothesis_mismatch]: - config.instrument_id 为 SOLUSDT.BINANCE,但假设声明的是 BTCUSDT.BINANCE——这是不同的资产。请按假设原文实现(或由 Research Lead 修订假设)。
Stratmill 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。