跳至正文
全部策略

策略

BTC 主动激进流反转:当 4H 滚动主动买卖比 z 分数超过 ±2.5 时,反向交易 BTCUSDT.BINANCE 1H K线

结局: 已放弃

BtcAggressiveTakerFlowExhaustionFadeLS1H

BTC 主动激进流反转:当 4H 滚动主动买卖比 z 分数超过 ±2.5 时,反向交易 BTCUSDT.BINANCE 1H K线

假设

一个在 BTCUSDT.BINANCE USD-M 永续合约上的多空均值回归策略,对冲 EXTREME 的主动流不平衡。使用 BINANCE USD-M 永续合约 K线(已证明干净)+ taker_ratio 辅助数据(PostgreSQL — 已确认可用,在此前 464 次实验中完全未使用)。假设:当激进主动 BUY 成交量相对于 30 天基线在 4 小时滚动窗口中超出 2.5 个标准差时,散户 FOMO 买入已耗尽 — 愿意支付溢价的边际买家已被满足,价格在自然卖方和空头流动性提供者介入时回归。SHORT 侧对称:当激进主动 SELL 成交量以 ≤-2.5 SD 主导时,恐慌性卖出已耗尽,随后出现回归。该机制 STRUCTURALLY DISTINCT 不同于近期记录的「BTC 资金费率极端均值回归衰减 post-2023」失败模式:资金费率极端值是 POSITIONING 状态的滞后指标,机构资本可以抢先行动;taker-flow 极端值是 REAL-TIME AGGRESSION-flow 测量值,只能在 AFTER 流发生之后才可观测,因此更难被套利,并在不同制度下更具持续性。填补了 FIVE 个代表性不足的类别:多空方向(14.0% → 趋向 45%)、taker_ratio 数据驱动机制(464 次实验中零次使用此数据流)、激进流微观结构优势(区别于持仓、资金费率、清算、多空比)、中期持仓(8-24 小时周期),以及 BINANCE-USD-M 专属(干净数据,避免所有 BINANCE_SPOT 失败模式)。仓位大小:每方向权益的 15%。每笔交易风险:权益的 1.5%,以止损为上限。

第 3 次迭代的反馈纯粹是一个命名冲突:之前的类名属于另一个假设(cbc45d1f),因此该代码无法作为 THIS 假设的实现被采用。最小的修复方案是将其重命名为一个唯一的、假设专用的类名(BtcAggressiveTakerFlowExhaustionFadeLS1H),并相应更新文档字符串;先前已通过早期验证层的信号、开仓/平仓和仓位管理逻辑保持不变,因此没有任何已通过的层发生回归。该机制直接实现该假设:主动流激进极端值(实时,但仅在流发生后才可观测)在 1H K线上被对称地做多空反向持仓,持有时间为 8-24 小时,使用滚动 z 分数而非绝对阈值,从而使信号频率在不同制度下保持尺度不变。

verification_loop: sandbox_timeout: 验证失败(第 3 层 — 沙盒回测):冒烟测试在约 20000 根 K线的窗口(833 天的 BTCUSDT.BINANCE-1-HOUR-LAST-EXTERNAL)上超出了 300 秒的挂钟时间限制。这几乎总是意味着每根 K线的工作量随历史数据规模线性增长 — 例如重新扫描完整的资金费率/辅助数据序列,或在每根 K线的 calculate_signal()/on_bar() 内重建列表并调用 min()/sorted()。请在 __init__ 中预计算排序的时间戳数组 ONCE 并使用二分查找,或按键时间戳缓存查找结果,使每根 K线的成本为 O(log n) 而非 O(n)。

实现

基于 BTCUSDT.BINANCE USD-M 永续合约 1H K线的多空均值回归策略,完全由 taker_ratio 辅助数据流驱动。每根 K线采样最近的主动买入/卖出观测值,将其转换为 log(buyVol/sellVol),在约 4 小时内平滑处理,并将该平滑读数相对于相同平滑序列约 30 天的滚动分布计算 z 分数。z >= +entry_z(激进买入耗尽)-> SHORT;z <= -entry_z(恐慌性卖出耗尽)-> LONG。在 z 回归至 +/- exit_z 范围内、3% 止损、4% 止盈或 24 根 K线的时间止损时平仓。每方向仓位大小为权益的 15%,以止损距离上的权益风险 1.5% 为上限。在没有主动流数据的情况下,策略保持空仓(无纯价格后备优势)。

验证结果

sandbox_timeout: 验证失败(第 3 层 — 沙盒回测):冒烟测试在约 20000 根 K线的窗口(833 天的 BTCUSDT.BINANCE-1-HOUR-LAST-EXTERNAL)上超出了 300 秒的挂钟时间限制。这几乎总是意味着每根 K线的工作量随历史数据规模线性增长 — 例如重新扫描完整的资金费率/辅助数据序列,或在每根 K线的 calculate_signal()/on_bar() 内重建列表并调用 min()/sorted()。请在 __init__ 中预计算排序的时间戳数组 ONCE 并使用二分查找,或按键时间戳缓存查找结果,使每根 K线的成本为 O(log n) 而非 O(n)。

迭代历史

验证失败(第 2 层 — 综合场景): 使用的参数:['z_min', 'exit_z', 'tp_pct', 'entry_z', 'risk_pct', 'stop_pct', 'smooth_bars', 'window_bars', 'min_notional', 'notional_pct', 'max_hold_bars', 'taker_tolerance_s'] 请检查 __init__ 是否通过 self.parameters.get() 设置了所有属性。 - steady_uptrend: TypeError: FactoryStrategy._bar_ts() 需要 1 个位置参数,但给出了 2 个(K线时间戳:1735689840000) - steady_downtrend: TypeError: FactoryStrategy._bar_ts() 需要 1 个位置参数,但给出了 2 个(K线时间戳:1735689840000) - flat_ranging: TypeError: FactoryStrategy._bar_ts() 需要 1 个位置参数,但给出了 2 个(K线时间戳:1735689840000) - volatility_spike: TypeError: FactoryStrategy._bar_ts() 需要 1 个位置参数,但给出了 2 个(K线时间戳:1735689840000) - zero_volume: TypeError: FactoryStrategy._bar_ts() 需要 1 个位置参数,但给出了 2 个(K线时间戳:1735689840000) - price_gap: TypeError: FactoryStrategy._bar_ts() 需要 1 个位置参数,但给出了 2 个(K线时间戳:1735689840000)

验证失败(第 2 层 — 综合场景): 使用的参数:['z_min', 'exit_z', 'tp_pct', 'entry_z', 'risk_pct', 'stop_pct', 'smooth_bars', 'window_bars', 'min_notional', 'notional_pct', 'max_hold_bars', 'taker_tolerance_s'] 请检查 __init__ 是否通过 self.parameters.get() 设置了所有属性。 - steady_uptrend: TypeError: BtcTakerAggressionFlowReversalZScore1H._bar_ts_ns() 需要 1 个位置参数,但给出了 2 个(K线时间戳:1735689840000) - steady_downtrend: TypeError: BtcTakerAggressionFlowReversalZScore1H._bar_ts_ns() 需要 1 个位置参数,但给出了 2 个(K线时间戳:1735689840000) - flat_ranging: TypeError: BtcTakerAggressionFlowReversalZScore1H._bar_ts_ns() 需要 1 个位置参数,但给出了 2 个(K线时间戳:1735689840000) - volatility_spike: TypeError: BtcTakerAggressionFlowReversalZScore1H._bar_ts_ns() 需要 1 个位置参数,但给出了 2 个(K线时间戳:1735689840000) - zero_volume: TypeError: BtcTakerAggressionFlowReversalZScore1H._bar_ts_ns() 需要 1 个位置参数,但给出了 2 个(K线时间戳:1735689840000) - price_gap: TypeError: BtcTakerAggressionFlowReversalZScore1H._bar_ts_ns() 需要 1 个位置参数,但给出了 2 个(K线时间戳:1735689840000)

验证失败(第 3 层 — 沙盒回测):未产生任何交易 使用的K线类型:BTCUSDT.BINANCE-1-HOUR-LAST-EXTERNAL,已处理K线数:56856 诊断:should_enter() 在 56852 根评估K线中返回方向 0 次 -> 您的 ENTRY CONDITION 从未触发。请放宽入场逻辑 / 阈值。 请确保您的策略在给定数据和参数下能够产生交易。

验证失败(第 1 层 — 静态分析): - 未来信息泄露:通过 ABSOLUTE 距离到 K线时间戳来选择辅助观测值,当其距离比上一个更近时会返回 NEXT 观测值。请使用 self.supp_as_of(key)(K线时刻或之前的最新值)或显式的 `ts <= bar.ts_init` 过滤器 — 切勿使用 abs()。(第 None 行)

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