策略
BTC BINANCE USD-M 吃单流冲击反转 LONG/SHORT(逐笔成交驱动的主动订单流流动性提供,短周期,3 参数,优先做市入场)
结局: 已放弃
BtcTakerFlowFlushReversionLS
测量充分(1,150 笔交易);3 参数构建清晰,采用时点正确的补充数据读取并锁定基础设施参数;回撤受控(15%),无强平
假设
第1次迭代因ZERO笔交易在第3层失败,因为该策略由逐笔成交驱动,而数据集仅在ONE当天持有BTCUSDT.BINANCE的逐笔成交数据(2026-05-06,4个parquet分片)——处于所有近期沙盒窗口之外,因此on_trade_tick从未被调用。任何阈值调整都无法凭空生成逐笔数据,因此资金流度量切换到IS在窗口内持续可用的数据源:币安的5分钟吃单方BUY/SELL成交量序列(metrics.taker_long_short_vol_ratio,到2026-09-02为止的密集5分钟覆盖,已与数据集核对验证)。这与逐笔数据流所聚合的量相同(主动买入量与主动卖出量),只是以5分钟的网格发布,因此假设的机制——对已推动价格位移的极端单边吃单方放量行情进行反向开仓——得以保留;仅有采样分辨率较粗,因此采用5-MINUTE的K线。无NO仅价格后备方案:在无吃单方资金流观测时,策略保持空仓。时点正确性通过对时间戳<= bar.ts_event的单调指针实现(不使用abs()匹配)。信号为原始z得分,每根K线返回,并在should_enter中按阈值过滤。已通过的内容全部保留:干净的导入,无on_bar/on_start覆盖,每根K线增量O(1)状态(滚动求和、有界双端队列)。HONEST CAVEAT(见建议):我已在70天的沙盒窗口上离线回放该确切逻辑——在已发布的默认参数下触发62笔交易(因此第3层将产生交易),但在窗口/阈值/TP-SL设置的3x3x4网格上,每笔毛收益仅+0.01%至+0.06%美元(胜率0.47-0.58),即BELOW约0.10%美元的往返吃单方成本,远低于0.15%可行性底限。挂单方优先的限价单入场也被放弃:待挂的非条件限价单会延迟基础模板的逐K线处理直到其成交,而假设所描述的秒级精确触价下单需要并不存在的逐笔数据。
手续费主导、无正期望值的单一永续合约反向策略,无可量化优势——不值得花2小时进行优化。在1,150笔交易中:avg_trade_return_pct为0.0044%(基本为零,低于0.15%期货底限约30x),佣金占毛利的57.44%(仅手续费就超过所有毛利),profit_factor 0.56,期望收益为-12.98美元/笔,total_return -14.9%,夏普比率-1.74,自助法CI置信区间[-3.80, -1.39]完全低于零,且PSR 0.0,在2020-2026的每一年及每个波动率区间均亏损。风险报酬比被反转(在39.6%的胜率下,avg_win为42美元 < avg_loss为49美元,return_kurtosis 442,偏度-19.4)——该策略对持续运行的单边放量行情进行反向开仓。关键在于,此处原本设想的逐笔成交主动流优势无法测试:开发者自身的文档说明指出,该数据集仅持有ONE天的BTC笔逐笔成交数据,因此资金流信号被降级为币安5分钟的吃单方多空成交量比率,这是一个粗糙的代理指标,无法解析该机制所依赖的秒至分钟级回弹。这是L18 fee_edge的特征(高交易笔数,PF<1,每笔收益低于成本)与L55单一标的反向策略家族的交叉。无法通过参数调整从5分钟K线中变出次分钟级反转,假设所需的逐笔数据源也不存在。失败模式:fee_edge/no_edge单一永续合约微观结构反向策略,逐笔数据不可用(L18/L55)。
实现
在 BTCUSDT.BINANCE 永续合约、5 分钟 K 线上进行 LONG/SHORT 吃单流冲击反转。使用 Binance 的吃单多空量序列(metrics.taker_long_short_vol_ratio,与 taker_ratio 买/卖量合并)衡量主动吃单 BUY 与 SELL 之间的成交量失衡;将滚动 30 分钟订单流窗口相对于约 2 天基线计算 z 分数,并要求同向价格位移达到 >= 1 倍已实现波动率标准差。出现极端冲击时,在订单流AGAINST提供流动性(SELL主动买入冲击,BUY主动卖出冲击),并在达到 0.6% 止盈、0.3% 止损或 2 小时最长持仓时间时退出。三个可调参数:flow_window_bars、flow_imbalance_z、take_profit_pct。
验证结果
验证失败(第 3 层——沙盒回测):未产生交易 使用的 K 线类型:BTCUSDT.BINANCE-1-MINUTE-LAST-EXTERNAL,处理的 K 线数:41471 诊断:should_enter() 在评估的 41452 根 K 线中返回方向 0 次 -> 你的 ENTRY CONDITION 从未触发。放宽入场逻辑/阈值。 确保你的策略在给定的数据和参数下能够产生交易。
回测评审
- 夏普
- -1.74
- 总收益率
- -14.92%
- 最大回撤
- 14.95%
- 总交易数
- 1150
- 胜率
- 39.6%
- 盈利因子
- 0.56
测量充分(1,150 笔交易);3 参数构建清晰,采用时点正确的补充数据读取并锁定基础设施参数;回撤受控(15%),无强平
手续费吞噬收益:avg_trade_return_pct 0.0044%(约低于门槛 30x),手续费占毛收益的 57.44%,PF 0.56,每笔交易的期望收益为 -$12.98
结果完全为负且一致:夏普比率 -1.74(CI [-3.80, -1.39]),PSR 0.0,2020-2026 每年和每种市场状态下都亏损
RR 反转型尾部特征(avg_win $42 < avg_loss $49,峰度 442,偏度 -19.4)——反向交易后续仍在延续的急速行情
原本基于逐笔成交驱动的优势不可用(逐笔成交数据仅在1当日存在);降级为5分钟的吃单方比率代理指标,无法解析该机制所需的次分钟级回弹(L18 fee_edge + L55 反向开仓)
迭代历史
验证失败(第 3 层——沙盒回测):冒烟测试超过了 300 秒的墙钟时间限制。这几乎总是意味着每根 K 线的计算量会随历史数据增长——例如反复扫描完整的资金费率/补充数据序列,或在每根 K 线上于 calculate_signal()/on_bar() 内重建列表并调用 min()/sorted()。在 __init__ 中预先计算排序后的时间戳数组 ONCE 并使用 bisect,或按时间戳缓存查找结果,使每根 K 线的开销为 O(log n) 而非 O(n)。
Stratmill 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。