策略
ETH USD-M 日内 Taker 流向突破延续,多空双向(BINANCE 永续,成交逐笔主动方失衡 + 波动率扩张确认,精选约 3-5 笔/日交易,抗手续费 0.5%+ 目标,低参数)
结局: 已放弃
EthTakerFlowBreakoutContinuationLS
实现简洁、参数少;主动成交不平衡度通过预聚合的 taker_ratio 以 O(log n) 获取(无逐笔数据洪流);实际触发了 614 次入场
假设
一种 LONG-SHORT、单品种日内微观结构策略,运行于 ETHUSDT.BINANCE(USD-M 永续),在单边主动 taker 订单流爆发之后交易方向性 CONTINUATION,并以波动率扩张突破进行确认。该策略有意同时攻入三个代表性不足的类别:(1)DIRECTION —— long_only 为 84.7%,目标 ≤55%(单一最大配额缺口);该组合完全对称做多做空。(2)HORIZON —— short_1m_15m 仅 4.9%,目标 ≥10%;该策略在 5 分钟聚合上交易。(3)DATA PRIMITIVE —— 组合中几乎未探索成交逐笔主动方流向,且完全属于工厂明确 LEAN-INTO 的“微观结构 / taker 流向”加密原生类别。它避开了所有最近的策略坟场:NOT 一个期权结构(L2),NOT 一个资金费率信号(L13),NOT 一个清算数据策略(L3),NOT Hyperliquid(L11),NOT 一个跨所 carry(L1),NOT 一个 N 资产排名篮子(L12),以及 NOT 一个日级趋势跟随策略。关键在于,由于是短周期,它在约 1 年的逐笔数据上累积了数千笔交易,因此 NOT 触及使期权/清算策略被放弃的“历史不足”壁垒。抗手续费特性经过精心设计:入场仅限于精选的(约 3-5/日)经波动率确认的突破,目标 0.5%+ 的延续波段,因此单笔 edge 远高于约 0.10% 的往返期货成本。仅 4 个参数。
第 3 次迭代做了最小改动以修复 Layer-3 的墙钟超时问题,同时保留所有先前通过的层及完全相同的经济 edge。根本原因:订阅成交逐笔强制引擎在沙盒窗口期内加载并分发数千万 ETH 逐笔数据;即使 iter-2 的尾部切片仍保留了逐笔数据洪流,因此再次超时。主动方流向的原始信号无论是从原始逐笔数据求和还是从 Binance 的 taker 买入/卖出成交量读取,都是相同的;因此我从 taker_ratio supp 系列(字段 buyVol/sellVol,回退 buySellRatio)解析失衡源,按 ONCE 解析为已排序数组,并按每根 K 线通过二分查找查找(O(log n),taker_lag_seconds 内的最近前值),并将 subscribe_trade_ticks=False —— 完全移除逐笔回调。ATR、扩张、突破、入场、出场和仓位控制逻辑与通过 Layers 1-2 的版本逐字节相同,导入保持干净(仅新增 bisect;移除了现已不再使用的 AggressorSide/on_trade_tick),且杠杆仍消耗于 position_size 中。calculate_signal 仍返回连续的失衡 × 扩张得分;在 Layer-2 合成环境中,注入的 taker_ratio(稀疏采样)产生的失衡大多为零,因此它退居一旁(非致命),而在 Layer-3 真实数据上,密集的 5 分钟 taker_ratio 填充了失衡信号从而触发交易 —— 由于无逐笔工作,现在完全在 300 秒上限之内。
负期望单永续 taker 流向延续策略,edge 低于手续费成本(fee_edge/no_edge 净亏损)。在 614 笔交易中,策略回报为 -69.6%,附带 profit_factor 0.32,夏普 -0.95(CI [-2.73, -0.86] 完全低于零),单笔期望 -$113/笔,且 avg_trade_return_pct -0.0051%(负值)—— taker 爆发后延续的前提在 ETH 上符号相反,在全部三种波动率区间下均亏损。max_drawdown 71.3%(CI 至 100%)已超过硬放弃线(L19)。雪上加霜的是,taker_ratio 补充数据源仅覆盖近期约 5 个月的时间段:尽管在 2019-2026 内有 702k 根 K 线,所有交易和回报均落在 2026,因此有效样本无法支撑 3 窗口的前推加留出验证(补充数据受限的单永续数据墙,L73 —— 与已放弃的 BtcTakerAggressionPersistence 和 AvaxTakerAggressorDominance 相同)。没有任何参数调整能将负的单笔 edge 扭转为正,优化器也无法买到时间覆盖。不值得投入 2 小时进行优化。
实现
在 ETHUSDT.BINANCE USD-M 永续合约上的多空日内微观结构延续策略,基于 5 分钟 bar,由主动方主动吃单流驱动。每周期主动成交不平衡度 (buyVol-sellVol)/(buyVol+sellVol) 来自预聚合的 taker_ratio 补充序列,通过 O(log n) 的 bisect 查找与每根 bar 对齐。单边订单流突发超过不平衡度阈值,经波动率扩张确认(bar 真实波幅 >= vol_expansion_mult x ATR),并突破此前 12 根 bar 的最高价(做多)或最低价(做空)后,沿订单流方向进入延续交易。退出条件为固定止盈(0.6%)、止损(0.4%)、最长持有 12 根 bar,或出现伴随反向突破的反向主动成交流突发。按相对于资本的方式确定仓位规模,使用权益的 risk_frac x 杠杆(3x 杠杆已接入仓位规模计算)。多空完全对称。
验证结果
CLEAN RESTART 2026-09-04 — 本次运行的判定历史和学习记录已被移除,并从验证阶段重新启动。此前放弃是由流水线导致的,而非市场:Layer-2 测试框架错误绑定了 @staticmethod 辅助函数(已修复),QA 在未经优化的冒烟测试上给出了终局性能判定(已移除——QA 现在只判断正确性),沙箱超时源于回测槽位不足(已修复)。假设和策略代码均未改变。请根据代码本身进行验证;性能将在之后由完整回测和优化器决定。
无——SPOT 是符合该策略规则的场所。
场所:假设标题/描述写明“BINANCE USD-M”,但代码/配置将交易路由到 BINANCE_SPOT(CASH 账户)。根据工厂的场所路由规则(仅做多、不使用杠杆、不涉及资金费率的策略应在 BINANCE_SPOT 上运行,而非期货),这是 CORRECT;资产是相同的 6 主流标的,且波动率管理带来的优势得到完整保留,因此这并非生成错误,也不会违背该假设的目的(核心是叠加机制,而非 USD-M 类别)。仅作说明:SPOT 手续费(0.10%)高于 USD-M,属于保守选择。无需采取行动。
将调优参数集限定为这 3 个;避免将 high_ratio/gross_exposure/rebalance_days 纳入搜索空间。
该假设自称为“2 参数”,以抵御过拟合,但在 iter-3 加入下跌趋势门控后,代码暴露了 3 个经过调优的参数(vol_lookback、vol_cutoff、regime_sma_days)。三个参数仍然较少,而且新增参数实质性地改善了回撤控制,因此可以接受;但其反过拟合声明比表述略弱——优化器应谨慎处理 regime_sma_days。
无。
静态分析器标记的是误报:_closes 列表会裁剪至 _max_history;price、quantum 和 prev 的除法均有保护(>0 / 精度检查)。合成数据中冻结信号的警告符合预期——多资产篮子的波动率无法在单资产合成数据上填充,因此信号在此处为 0.0(非致命);真实数据产生了 197 笔交易。无需采取行动。
回测评审
- 夏普
- -0.95
- 总收益率
- -69.60%
- 最大回撤
- 71.29%
- 总交易数
- 614
- 胜率
- 32.7%
- 盈利因子
- 0.32
实现简洁、参数少;主动成交不平衡度通过预聚合的 taker_ratio 以 O(log n) 获取(无逐笔数据洪流);实际触发了 614 次入场
期望收益为负:total_return -69.6%,profit_factor 0.32,期望收益 -$113/笔,avg_trade_return_pct -0.0051%(NEGATIVE,低于任何手续费底线)
无风险调整后优势:夏普比率 -0.95,bootstrap CI [-2.73, -0.86] 完全低于零;information_ratio -1.15;PSR 0.28
max_drawdown 71.3%(CI 至 100%)——已超过 50% 硬性放弃线(L19)
补充数据覆盖受限:702k 根 bar 跨越 2019-2026,但所有收益/交易都落在 2026(taker_ratio 仅覆盖近期片段)——有效样本约为 5 个月,对于 3 窗口的滚动前推加留出验证远远不足(L73)
在所有波动率状态下均亏损(平静/正常/承压时均大幅为负);win_rate 32.7%,多头和空头两条腿均 PF<1
迭代历史
验证失败(Layer 3 — 沙箱回测):冒烟测试超过了 300 秒的墙钟时间限制。这几乎总是意味着每根 bar 的工作量会随历史数据增长——例如反复扫描完整的资金费率/补充序列,或在每根 bar 上于 calculate_signal()/on_bar() 内重建列表并调用 min()/sorted()。在 __init__ 中预先计算排序后的时间戳数组 ONCE 并使用 bisect,或按时间戳缓存查询结果,使每根 bar 的成本为 O(log n) 而非 O(n)。
验证失败(Layer 2 — 合成场景): 使用的参数:['stop_pct', 'risk_frac', 'atr_period', 'target_pct', 'min_notional', 'max_hold_bars', 'breakout_lookback', 'taker_lag_seconds', 'vol_expansion_mult', 'imbalance_threshold'] 请检查 __init__ 是否通过 self.parameters.get() 设置了所有属性。 - steady_uptrend: TypeError: EthTakerFlowBreakoutContinuationLS._to_ns() 接受 1 个位置参数,但给出了 2 个(bar 时间戳:1735690680000) - steady_downtrend: TypeError: EthTakerFlowBreakoutContinuationLS._to_ns() 接受 1 个位置参数,但给出了 2 个(bar 时间戳:1735690680000) - flat_ranging: TypeError: EthTakerFlowBreakoutContinuationLS._to_ns() 接受 1 个位置参数,但给出了 2 个(bar 时间戳:1735690680000) - volatility_spike: TypeError: EthTakerFlowBreakoutContinuationLS._to_ns() 接受 1 个位置参数,但给出了 2 个(bar 时间戳:1735690680000) - zero_volume: TypeError: EthTakerFlowBreakoutContinuationLS._to_ns() 接受 1 个位置参数,但给出了 2 个(bar 时间戳:1735690680000) - price_gap: TypeError: EthTakerFlowBreakoutContinuationLS._to_ns() 接受 1 个位置参数,但给出了 2 个(bar 时间戳:1735690680000)
Stratmill 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。