策略
Binance USD-M多回看窗口集成趋势多空组合(已确立主流币、固定回看窗口组20/40/80/160、平均趋势得分、每周再平衡、抗过拟合)
结局: 已放弃
MultiLookbackEnsembleTrendLongShortBasketNoLeverage
固定回看窗口组的抗过拟合理念原则上合理;处于已验证的日频趋势组合范围内
假设
跨约10个已确立、已确认拥有完整历史的 Binance USD-M主流币(BTC、ETH、SOL、BNB、XRP、DOGE、ADA、LTC、LINK、BCH)构建的多空日频管理期货趋势组合,明确设计为OVERFIT-RESISTANT BY CONSTRUCTION——这是分析师针对放弃波动率目标双时间框架变体所开出的修复方案。该变体确有显著强劲的优势(+392%,默认参数下 Sharpe 为 2.59),但走步前向优化器通过调优单个fast_lookback(20→13)将其OVERFIT,导致样本内表现飙升,而样本外表现崩塌,留出集为负。此处的修复移除了可被利用的参数:每个资产的趋势信号不再使用一个可调回看窗口,而是取在由FROZEN FAN组成的回看窗口组(20、40、80、160天)上计算的趋势符号的AVERAGE。优化器没有可过度集中的单一回看窗口——窗口组固定,因此从结构上化解了IS/OOS过拟合崩塌模式;策略的优化目标是OOS稳健性,而非最大化-IS Sharpe。这是标准的CTA多周期稳健性技术。策略严格处于ONLY已验证优势的范围内(在已确立主流币上使用DAILY对称趋势——获晋升的 AbsoluteMomentum 同类策略 Sharpe 为 1.48;日内/4H单 K 线方向性策略和仅做空变体均已被证伪),使用纯主流币的日频OHLCV(数据安全——广泛山寨币/HL组合因数据问题失效),并且与所有已入列的单信号组合均有实质区别(它是多周期ENSEMBLE,而非单一回看窗口/突破/排名)。多空和对称设计改善了87%多头偏斜;每周再平衡使费用极低;几乎没有可调参数的设计能够抵御过拟合,而过拟合一直是策略层面反复出现的致命问题。
迭代 2 仅修复两个 QA 代码缺陷,不做任何其他修改。(1) 日历锚定:每周节奏不再使用相对于进程的 `_rebal_count` 计数器(检查表 #18 反模式)——它现在纯粹是 bar 自身时间戳 `day_index = ts // 86_400_000_000_000` 的函数,在 `day_index % rebalance_days == 0` 且当日尚未再平衡时触发。因此网格在重启、滚动前推窗口、保留样本和纸上重放下完全一致,消除了奇偶性/网格漂移的危害。(2) 严格的单资产上限:`min(raw/total, max_weight)` 之后再归一化可能将已达上限的标的重新推回上限以上;权重现在通过注水法构建(突破上限的标的被钉在 AT 上限,剩余部分在其余标的中按比例重新分配),已验证在每一种可行与不可行的配置下,最大权重恰好为 0.20,总敞口 <= 1.0。edge_concern(回撤/冲击脆弱性)被标记为分析师问题,而非代码缺陷,因此信号、回看扇形、波动率地板、规模公式、订单流和投资范围均保持不变。
方向性组合本身优势为负,又叠加了破坏账户的仓位调整/净额结算爆仓;应果断放弃,不值得花费2小时。权益曲线自相矛盾:CAGR -100%(recovery_factor -1.0,账户归零),同时报告的total_return为+1883%;单日收益还出现物理上不可能的-481.7%(2023-08-17)、-206%(2023-07-13)和-198.9%(2024-10-24),以及return_kurtosis 211——-481%这一天意味着组合账面已深度为负。策略核心的“无杠杆、gross_cap 1.0”不变量遭到违反(exposure_pct 789%,end_unrealized_pct 849%,annualized_volatility 107%):差额调仓/净额结算路径使仓位累积远超上限,而且这是敞口控制修复连续失败的第2次迭代。长时间的停滞区间(2023-08 → 2024-04全为0.0)证实账户已爆仓。即使不考虑该异常结果,底层优势在L45/L52方向性LS趋势组合类别中仍为负(avg_trade_return_pct -3.5%),max_drawdown 63%(从CI到99%),最大连续亏损为31,且压力测试窗口大多为负。净额结算缺陷毁掉的 PnL 无法用于任何优化;即使修复后,它仍会是一个每笔交易期望为负、且所属类别中幸存者为零的组合。失败模式:仓位调整/净额结算崩溃 + no_edge方向性LS趋势组合(L45/L52)。
实现
跨10个已确立的 Binance USD-M主流币(BTC、ETH、SOL、BNB、XRP、DOGE、ADA、LTC、LINK、BCH)构建的多空日频管理期货趋势组合。每个资产的趋势得分是FROZEN个回看窗口(20/40/80/160天)趋势符号的AVERAGE,因此优化器没有可过度集中的单一回看窗口。权重按信念强度加权并实现等风险(|score| / 下限化的已实现波动率),通过水位填充严格将每个资产的权重上限设为20%,并进行归一化,确保总敞口绝不超过权益的1.0x(不使用杠杆,也不使用波动率目标缩放系数)。方向由 sign(score) 决定;在以日历为锚的网格上每周再平衡(自纪元起天数对7取模),通过仅对显著变化调整仓位来降低换手率和费用。
验证结果
验证未通过(第 4 层 — QA 审查)[类别=code_defect]: - [edge_concern] 沙盒 max_drawdown 86.45%(CI 至 96.6%)——即使对于总敞口-1.0、无杠杆的多空组合也极为严重,远超 >50%-DD 的硬性放弃标准。仓位规模确实受总敞口上限 1.0x 约束(权重重新归一化至总和为 1;avg_position_pct 18.9%),因此这是市场状态持续侵蚀,而非杠杆失控——但仍然严重。再加上折入了 impact_cost_pct 14.77%,容量仅约 $4.6M,换手率为 55.6,因此净优势对冲击成本十分脆弱。total_return +55.9%,夏普比率为 0.33(CI 跨越零)。这种抗过拟合的构建原则上是稳健的,但对于分析师而言,全历史数据中的实际问题在于回撤和对冲击成本的脆弱性。 - 每周再平衡频率由相对于进程的柱计数器驱动(self._rebal_count += 1; if (self._rebal_count - 1) % self._rebalance_days == 0: self._rebalance()),_extract_ts 仅用于检测新柱,绝不用于锚定调度——这是以运行时间为锚的反模式(检查清单 #18)。实时重启时,_rebal_count 会重置为 0,并在第一根柱上立即再平衡,使每周时间网格重新锚定到重启时刻,导致再平衡日期偏离任何固定日历网格。后果:回测/模拟/实盘之间的一致性失效(在不同日期启动的运行在任一给定时点持有不同的组合)。目标组合是确定性的,因此重启引发的换仓有限,但网格漂移/一致性损害确实存在。回测是确定性的(有效沙盒),但该调度不适用于实盘,也无法稳定重放。 - 权重封顶先执行 min(raw/total, max_weight),再重新归一化至总和为 1,这可能使某些资产再次超过 max_weight(软上限)。总敞口仍为 1.0x,因此这不是正确性故障,但单项资产上限并未得到严格执行。
回测评审
- 夏普
- 0.48
- 总收益率
- 1883.15%
- 最大回撤
- 63.13%
- 总交易数
- 494
- 胜率
- 36.2%
- 盈利因子
- 1.27
固定回看窗口组的抗过拟合理念原则上合理;处于已验证的日频趋势组合范围内
数据干净(10个完整历史的主流币);以日历为锚的排程修复正确
回测数据已损坏,出现爆仓:CAGR -100%(账户被摧毁),且 recovery_factor -1.0,但 total_return +1883%——无法调和
单日收益在物理上不可能(-481.7%、-206%、-198.9%;峰度 211)——账户账面已深度为负
违反了“无杠杆 gross_cap 1.0”不变量:exposure_pct 789%,end_unrealized_pct 849%,波动率 107%——尽管此前进行了两轮敞口控制迭代,差额调仓/净额结算路径仍使敞口累积远超上限
底层优势为负(avg_trade_return_pct -3.5%);L45/L52方向性LS趋势组合类别;max_drawdown 63%(从CI到99%),最大连续亏损为31
迭代历史
验证失败(第 2 层——合成情景): 使用的参数:['assets', 'gross_cap', 'vol_floor', 'max_weight', 'resize_frac', 'lookback_fan', 'min_notional', 'vol_lookback', 'qty_precision', 'rebalance_days', 'default_qty_precision'] 请检查 __init__ 是否通过 self.parameters.get() 设置了所有属性。 - steady_uptrend: TypeError: MultiLookbackEnsembleTrendLongShortBasketNoLeverage._bar_ts() 需要 1 个位置参数,却传入了 2 个(K 线时间戳:1735699260000) - steady_downtrend: TypeError: MultiLookbackEnsembleTrendLongShortBasketNoLeverage._bar_ts() 需要 1 个位置参数,却传入了 2 个(K 线时间戳:1735699260000) - flat_ranging: TypeError: MultiLookbackEnsembleTrendLongShortBasketNoLeverage._bar_ts() 需要 1 个位置参数,却传入了 2 个(K 线时间戳:1735699260000) - volatility_spike: TypeError: MultiLookbackEnsembleTrendLongShortBasketNoLeverage._bar_ts() 需要 1 个位置参数,却传入了 2 个(K 线时间戳:1735699260000) - zero_volume: TypeError: MultiLookbackEnsembleTrendLongShortBasketNoLeverage._bar_ts() 需要 1 个位置参数,却传入了 2 个(K 线时间戳:1735699260000) - price_gap: TypeError: MultiLookbackEnsembleTrendLongShortBasketNoLeverage._bar_ts() 需要 1 个位置参数,却传入了 2 个(K 线时间戳:1735699260000)
Stratmill 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。