跳至正文
全部策略

策略

BTC 在 BTCUSDT.BINANCE 上的日波动率目标仅做多策略,带崩盘状态熔断开关

结局: 已放弃

BtcDailyVolatilityTargetedLongCrashKillSwitch

仅使用 OHLCV、单一标的、机制清晰的入场流水线(48 次入场,没有因最低名义金额/现金不足而被丢弃的订单)

假设

一种仅做多、单一标的、动态调整仓位的策略,应用于 BTCUSDT.BINANCE USD-M 永续期货,捕捉 BTC 的长期正向漂移,同时平抑困扰买入并持有策略的灾难性高波动回撤。与当前投资组合中的任何策略相比,这属于一种STRUCTURALLY DIFFERENT机制类别:不是横截面策略,不是配对交易,不是突破策略,也不是回调策略——它是在买入并持有论点上应用的一种 VOLATILITY-TARGETED RISK OVERLAY。直接回应分析师提出的明确方向:“通过加入与现有策略STRUCTURALLY不同的策略,最能发挥投资组合风险预算的作用。采用波动率目标/风险平价叠加层(风险特征不同)。”机制(Moskowitz-Ooi-Pedersen 2012《Time-Series Momentum》、Hurst-Ooi-Pedersen 2017《A Century of Trend Following》、AQR 因子投资文献):策略不采用固定仓位,而是按实现波动率的倒数确定仓位。BTC 波动率LOW时(通常是趋势延续前的盘整期),仓位接近最大值。BTC 波动率HIGH时(通常对应顶部和崩盘阶段),仓位会降低。BTC 波动率EXTREME时(恐慌状态,高于滚动 6 个月中位数的 2.5×),通过崩盘状态熔断开关完全平仓。结果是:长期收益与买入并持有相近,但回撤显著更小,夏普比率更高。CRITICAL DISTINCTION FROM THE FAILED LOW-VOL CROSS-SECTIONAL:该策略是横截面波动率排名(在一篮子资产中做多低波动率资产、做空高波动率资产);这里则是在SINGLE资产上TIME-SERIES进行波动率目标控制(BTC仓位随时间变化)。横截面波动率策略在加密市场中的失效模式(高波动率 = 高动量)NOT适用于此处——在单一资产自身的时间序列内,波动率飙升会系统性地先于回撤出现。使用 ONLY BINANCE USD-M 永续合约日线数据——无需补充数据、现货、期权或 Hyperliquid。避免了本次会话中已确认的 EVERY 失败模式。填补了 FOUR 个关键空白:(1) NEW MECHANISM CLASS(波动率目标控制,目前投资组合中尚无此类策略),(2) RISK-MANAGEMENT-OVERLAY APPROACH(与时机信号策略正交),(3) 仅依赖 OHLCV 数据,(4) 仅做多的方向可补充方向性多时间框架策略的成功经验,且不会造成重复。

第 4 次迭代修复了 Layer-2 的信号冻结问题。代理会将返回的决策变量截断至 [-1,1];在平滑合成数据上,原始反向波动率比率约为 150,因此所有不同值都被压到截断上限 1.0(冻结)。calculate_signal 现在返回有界且不会饱和的连续变换 target_vol_annual/(target_vol_annual+realized_vol_annual),其取值处于 (0,1) 内,不会触及截断边界,因此不同的逐柱实现波动率值会保留为不同且不断变化的信号,同时保持正值(做多门控)并随期望敞口单调变化。触发清仓的市场状态仍返回 -1.0。反向波动率仓位计算和熔断开关均未改变:position_size 和 should_exit 读取 self._target_frac(受杠杆上限 raw_frac 约束)和 self._kill,而非信号幅度,因此低波动率敞口上限确实会用到杠杆 2.0。只改变了返回信号的表达式,保留 Layer-1 的导入和结构。

从根本上看存在多项严重缺陷。(1) 权益核算已损坏——日收益率为 -6834.6% (2023-08-22)、-333.4%、-116.5%、+487.9%,且年度收益率低于零(2022 -130%、2026 -108%);对于杠杆-2.0单向做多策略而言,这些数值不可能成立;权益曲线已暴涨失真。(2) 尽管声明的杠杆上限为 2.0,avg_position_pct 1186%——反向波动率仓位计算产生的敞口远超预期。(3) max_drawdown 87.1%(CI 至 98.9%),超过了 50% 硬性放弃线(L19)——波动率目标叠加层只实现了其声明回撤降低目标的 OPPOSITE。(4) 无论如何都没有真正的优势:profit_factor 0.91,单笔期望收益为 -$3,475/笔,alpha 为 -0.071(负值),beta 为 1.07,benchmark_correlation 0.86——杠杆化的 BTC beta(L49)。+261% 的醒目指标具有误导性(end_unrealized_pct 428% → 实际约为 -167%)。无论是仓位计算/核算缺陷,还是依赖 beta、alpha 为负的做法,都无法通过调参修复。不值得投入 2 小时进行优化。失败模式:risk_reject/仓位计算损坏的单向做多 beta 暴涨。

实现

在 BTCUSDT.BINANCE USD-M 永续合约日线上运行的仅做多、单一标的波动率目标风险叠加策略。按实现波动率的倒数确定仓位(target_vol_annual / realized_vol_annual,受杠杆上限约束),在高波动状态下降低敞口;当当前实现波动率超过其自身滚动 6 个月中位数的 kill_mult 倍时,通过崩盘熔断开关完全平仓。纯 OHLCV,无需补充数据。

验证结果

CLEAN RESTART 2026-09-04 — 本次运行的判定历史和学习记录已删除,并从验证阶段重新启动。此前放弃该策略源于流水线,而非市场:Layer-2 测试框架错误绑定了 @staticmethod 辅助函数(已修复),QA 在未优化的冒烟测试上给出了终局性能判定(已移除——QA 现在只判断正确性),沙箱超时则由回测槽位不足导致(已修复)。假设和策略代码均未改变。请根据代码本身的优劣进行验证;性能将在之后由完整回测和优化器决定。

优化器应将 kill_mult、target_vol_annual 和杠杆视为回撤控制手段。

熔断开关将 30 日实现波动率与该平滑序列的 180 日中位数的 2.5× 进行比较——几乎不会达到的阈值,因此回撤保护部分基本不起作用,而杠杆 2.0 会放大 DD(沙箱中为 86.6%)。这与假设中声明的阈值一致,但也解释了承诺的保护为何未能实现。

原地调整仓位(提交差额)以降低换手率。

再平衡 = 完全平仓后于下一根柱重新入场(空仓一根柱,每次多一次完整往返交易;换手率 59.3)。功能正确,但手续费效率低。

回测评审

夏普
0.41
总收益率
261.32%
最大回撤
87.11%
总交易数
48
胜率
47.9%
盈利因子
0.91

仅使用 OHLCV、单一标的、机制清晰的入场流水线(48 次入场,没有因最低名义金额/现金不足而被丢弃的订单)

权益核算已损坏:日收益率为 -6834.6%、-333.4%、-116.5%、+487.9%——对于杠杆-2.0单向做多策略而言不可能成立;权益曲线已暴涨失真

avg_position_pct 1186%,尽管杠杆上限为 2.0——仓位敞口远超预期

max_drawdown 87.1%(CI 至 98.9%)— 超过 50% 硬性放弃线(L19);波动率目标叠加层实现了其回撤减少前提的 OPPOSITE

profit_factor 0.91,单笔期望收益为 -$3,475/笔,alpha -0.071 为负,beta 为 1.07,benchmark_correlation 0.86——杠杆化的 BTC beta,风险调整后优势为负(L49)

醒目的 +261% 具有误导性:end_unrealized_pct 428% 意味着实际收益率为深度负值(约 -167%),所有账面收益都来自尚未平仓的头寸

年度收益率大幅波动:+3267% / -130% / -108%——负值年度收益率证实核算已损坏,return_kurtosis 113,偏度 5.4

迭代历史

验证失败(Layer 2 — 合成场景): 使用的参数:['kill_mult', 'ann_factor', 'min_notional', 'position_pct', 'vol_lookback', 'rebalance_band', 'target_vol_annual', 'kill_median_window'] 请检查 __init__ 是否通过 self.parameters.get() 设置了所有属性。 - steady_uptrend:信号冻结:所有 286 信号都相同(值=1.0)。calculate_signal() 可能存在缺陷——信号始终不变。 - steady_downtrend:信号冻结:所有 286 信号都相同(值=1.0)。calculate_signal() 可能存在缺陷——信号始终不变。 - flat_ranging:信号冻结:所有 286 信号都相同(值=1.0)。calculate_signal() 可能存在缺陷——信号始终不变。 - volatility_spike:信号冻结:所有 286 信号都相同(值=1.0)。calculate_signal() 可能存在缺陷——信号始终不变。 - zero_volume:信号冻结:所有 286 信号都相同(值=1.0)。calculate_signal() 可能存在缺陷——信号始终不变。 - price_gap:信号冻结:所有 286 信号都相同(值=1.0)。calculate_signal() 可能存在缺陷——信号始终不变。

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

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