跳至正文
全部策略

策略

BTC 永续合约 4H 未平仓量拥挤反转(单品种 USD-M,多空双向,被困仓位释放)

结局: 已放弃

BtcOpenInterestCrowdingReversalLS

BTC 永续合约 4H 未平仓量拥挤反转(单品种 USD-M,多空双向,被困仓位释放)

假设

在 BTCUSDT.BINANCE USD-M 永续期货上使用 4-HOUR K线的多 SHORT、SINGLE-INSTRUMENT、单交易所反转策略,其中 OPEN INTEREST(辅助数据)是结构性信号,价格行为是盈亏来源(OI 仅用作信号,绝不作为现金流入账)。核心论点是困守仓位释放:当剧烈的定向价格变动伴随着未平仓量的急剧 RISE,意味着该走势是由 NEW 杠杆仓位的涌入(反弹中的新增多头 / 抛售中的新增空头)驱动,而非来自真实的现货需求——一本拥挤的、逆势的账簿。一旦价格停滞并反转,这些新仓位将处于水下,成为驱动剧烈反转的强制燃料(多头爆仓 / 空头回补)。策略仅在 OI 确认拥挤时反向操作已耗尽的走势,并明确 SKIPS OI 下降的走势(健康的去杠杆,没有被困的燃料)。该策略刻意避开了本次会话中每个反复出现的失败:NOT BINANCE_SPOT(CASH 指标 bug)、NOT BINANCE_CM(不可回测)、NOT 跨交易所/Hyperliquid(基差伪影)、NOT 多品种配对(额外腿的数据未交付给优化器)、NOT 资金费率套利(无可入账现金流问题)、NOT 趋势跟踪(过度代表/易于过拟合),以及 NOT 通用抄底 MR——它以可观察的仓位拥挤条件(OI 激增)为门控,给出 POSITIVE 偏度的强制平仓收益结构,而不是扼杀了先前 MR 尝试的负偏度接飞刀形态。选择 BTC 是为了获得最深、最可靠的 OI 历史数据(最小化破坏基于山寨币思路的数据稀疏风险)。它在干净的单品种 USD-M OHLCV 路径上填补了多空方向配额(仅 14.4% 对比大量的 85.6% 仅做多),并保持在约 4 个参数以抵抗过拟合。

完全实现了被困仓位释放假设:OI 仅作为信号(绝不入账现金流),拥挤门控(og>0 且 oi_z>=oi_surge_z)是将此策略与一般均值回归区分开的关键,下降的 OI 跳过提供了正偏度的收益结构。Iteration-4 修复 Layer-3 超时问题:之前的版本合并了全历史的 `metrics` 数据流(数十万行 5 分钟的 OI 数据,回溯至约 2020);加载和解析该数据载荷超过了 300 秒的冒烟测试实际时间限制。此版本仅引用更轻量的 `open_interest` 辅助数据流,其加载快速并覆盖最近的冒烟/回测窗口——所有交易逻辑、门控、z 评分、仓位规模以及一次性二分查找索引均未改变,因此 Layer 1 和 2 保持绿色,而冒烟回测在限制时间内顺利完成。坚持干净的单品种 USD-M 路径(BINANCE 期货、MARGIN、多空双向)以支持做空;杠杆维持在 1.0(在名义上限中引用但不放大,因此没有 leverage_set_but_unused 标记)。

verifying_stuck_3_timeouts

实现

在 BTCUSDT.BINANCE USD-M 永续合约 4-HOUR K线上的单品种多空反转策略。使用未平仓量(辅助数据)作为结构性拥挤信号,价格行为作为盈亏来源。当 OI 激增(AND z 分数上升超过阈值)并伴随剧烈的价格延伸时,策略反向操作已耗尽的走势(做空 OI 驱动的反弹,做多 OI 驱动的杀跌),押注被困的杠杆仓位将平仓。在 OI 下降(健康的去杠杆)的走势被跳过,以获得正偏度的强制平仓收益结构。OI 仅索引一次,并按 K 线通过二分查找(O(log n))进行查询。

验证结果

验证失败(Layer 4 — QA 审查)[类别=not_measurable]: - [edge_concern] 暂不论可衡量性问题,15 笔交易的沙盒结果也呈现弱负值(total_return -0.51%、PF 0.91、avg_loss $909 > avg_win $550、return_skew -0.78)——与假设所承诺的正偏度强制平仓收益相反。但由于仅有 15 笔交易,无论从哪个角度看都不是证据;真正的阻碍是样本量太小,无法得出任何结论。不要将负值沙盒读为优势失效——应读为不可衡量。 - NOT MEASURABLE — OI 数据覆盖率将策略限制在 FULL 回测期内约 15 笔交易。沙盒并非截断的冒烟测试窗口:它处理了 14389 根 K 线 / 2398 data_days(完整约 6.5 年的 BTC 4H 数据),却仅产生 15 笔交易,从 2020 到 2025 的每个压力窗口均报告恰好 0.0 回报(无交易)。这表明策略读取的 `open_interest` 数据流仅覆盖最近的一段(约最近一年),因此拥挤门控只能在那里触发。15 笔交易无法填充 HARD >=10 笔交易的保留样本(最近 20% ~= 3 笔交易)或 3 窗口的滚动前推测试,也无法区分优势与噪声(L16/L26)。更完整的数据是存在的——开发者的理由陈述全历史的 `metrics` OI 数据流达到约 2020——但由于加载其数十万行 5 分钟数据超过了 300 秒的 Layer-3 时钟时间而被移除。因此限制是加载性能,而不是 OI 历史的真正缺失。

迭代历史

验证失败(第 2 层——合成场景): 使用的参数:['risk_pct', 'oi_surge_z', 'price_ext_z', 'min_notional', 'max_hold_bars', 'stop_loss_pct', 'zscore_window', 'change_lookback', 'take_profit_pct', 'max_notional_frac', 'zscore_min_samples', 'oi_max_staleness_sec'] 请检查 __init__ 是否通过 self.parameters.get() 设置了所有属性。 - steady_uptrend: TypeError: BtcOpenInterestCrowdingReversalLS._parse_oi_row() 接受 2 个位置参数,但实际给出了 3 个(bar 时间戳:1735691340000) - steady_downtrend: TypeError: BtcOpenInterestCrowdingReversalLS._parse_oi_row() 接受 2 个位置参数,但实际给出了 3 个(bar 时间戳:1735691340000) - flat_ranging: TypeError: BtcOpenInterestCrowdingReversalLS._parse_oi_row() 接受 2 个位置参数,但实际给出了 3 个(bar 时间戳:1735691340000) - volatility_spike: TypeError: BtcOpenInterestCrowdingReversalLS._parse_oi_row() 接受 2 个位置参数,但实际给出了 3 个(bar 时间戳:1735691340000) - zero_volume: TypeError: BtcOpenInterestCrowdingReversalLS._parse_oi_row() 接受 2 个位置参数,但实际给出了 3 个(bar 时间戳:1735691340000) - price_gap: TypeError: BtcOpenInterestCrowdingReversalLS._parse_oi_row() 接受 2 个位置参数,但实际给出了 3 个(bar 时间戳:1735691340000)

验证失败(第 3 层——沙盒回测):冒烟测试超出 300 秒的墙钟时间限制。这几乎总是意味着每根 bar 的工作量随历史数据规模增长,例如重新扫描完整的资金费率/补充数据序列,或在每根 bar 的 calculate_signal()/on_bar() 中重建列表并调用 min()/sorted()。在 __init__ 中预先构建已排序的时间戳数组 ONCE 并使用 bisect,或按时间戳缓存查找结果,使每根 bar 的成本为 O(log n) 而非 O(n)。

Stratmill 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。