跳至正文
全部策略

策略

ETH 与 BTC 相对强弱动量对 — 在 ETH/BTC RATIO 上的美元中性多空:顺势相对强弱趋势的 CONTINUATION(当 ETH 强于 BTC 趋势时做多 LONG ETH / 做空 SHORT BTC,弱于趋势时反向,在中性区间保持空仓),持有数日到数周(多品种,仅 OHLCV,市场中性)

结局: 已放弃

EthBtcRelativeStrengthMomentumPair

交易忠实落实了假设:美元中性配对平衡(389 多头 / 389 空头腿),平均持仓 3天10小时;符合预期,benchmark_meaningful=false,属于市场中性组合。

假设

一个 DOLLAR-NEUTRAL、2-LEG 的 LONG-SHORT 策略,交易 ETH/BTC 价格比的 TIME-SERIES MOMENTUM,直接利用本工厂自身失败日志中一项经实证 CONFIRMED 的发现:beta 对冲的 BTC/ETH 价差被放弃,因为它 CONTINUES(残差呈延续而非反转特征)而非均值回归。若价差延续,则在比率上做相对强弱动量即为方向正确的交易。该策略从两个永续合约的收盘价计算 ETH/BTC 比率,并按比率自身趋势持有市场中性头寸:LONG ETHUSDT.BINANCE + SHORT BTCUSDT.BINANCE(等美元名义),当 ETH 强于 BTC 趋势时;REVERSE(SHORT ETH + LONG BTC),当 ETH 弱于 BTC 趋势时;在中性死区内保持空仓以避免震荡。由于两边为等美元名义,整体加密市场 beta 约为 0,盈亏来自 ETH 相对于 BTC 的相对表现,而非市场方向。它既 NOT 单品种双 TF 动量策略(押注单一资产的绝对方向),也 NOT 9 品种的横截面因子(对一篮子品种排序),而是一个聚焦、最具流动性的相对价值对。使用 ONLY OHLCV bars 覆盖两个最流动的加密永续合约(多年深度历史、零数据脆弱性、无资金费率/tick/爆仓/期权数据)。

ITERATION 3 IS 一份 CONFIG-ONLY FIX。第 1 层因“config.instrument_id 和 config.bar_type 为 REQUIRED(得到 instrument_id=None,bar_type=None)”而拒绝了上一版提交——策略代码从来不是问题(第 2 次迭代已经通过静态分析和合成层并进入沙盒,这正是其 O(1) 滚动统计/缓存组合/计划再对冲性能重写的目的),随附的配置块只是缺少两个必需字段,因此无法实例化。我做了能准确修复此问题的 SMALLEST 更改:下方配置现在包含明确的主交易品种(ETHUSDT.BINANCE)、明确的主 K 线类型(ETHUSDT.BINANCE-4-HOUR-LAST-EXTERNAL),以及作为 SAME 4-HOUR K 线类型上唯一额外腿的 BTCUSDT.BINANCE——因此基础模板的跨腿对齐屏障可确保每次决策时两条腿都处于同期状态,绝不会使用过时的 T-1 对冲;每个可调参数也都有与之镜像的 _param_bounds,和代码应用的限制范围一致,确保优化器不会搜索代码会暗中改写的取值。两个交易品种自 2019-12-31 起都有连续的 4-HOUR 目录历史,因此任一腿都不会 data_unavailable。唯一的代码编辑是文档字符串,它记录了这一原因和修复,并澄清 mom_days/vol_window 是 PRIMARY BARS 的计数(在 4-HOUR K 线上,默认值表示以 10 天的比率波动率为参照测量 5 天趋势,符合假设所述的数天至数周持仓期);没有改动信号、入场、出场、仓位规模或绩效逻辑,因此此前已通过的各层仍然通过。HYPOTHESIS FIDELITY:该机制是在比率上做动量(延续),这是方向正确的交易;工厂自身发现 beta 对冲的 BTC/ETH 价差会延续而非均值回归。每条腿采用相等的 DOLLAR 名义价值(而非相等的基础数量),才能使整体市场 beta 约为 0,因此 PnL 来自 ETH 相对于 BTC 的相对表现,而非市场方向。由于策略确实做空,BINANCE 期货是正确的交易场所。杠杆维持在 1.0,因为总敞口为权益的 0.70(每条腿 0.35),净 delta 约为 0,因此没有使用或声称使用保证金放大。

不值得 2 小时的优化。相对强弱延续性优势仅存在于 2020-2021(贡献了全部 +44.7% 头条数字),在近期充足样本上明显缺失:2022-2026 在约 4.5 年间净收益约为 -1.7%。全样本 Sharpe 为 0.23,bootstrap CI [-0.48, 0.99] 跨越零值,且 PSR 0.69,即与无技能无显著差异;PF 为 1.046(弱信号而非费率问题——佣金仅占毛收益的 4.56%)。该优势也仅存在于单一波动率区间(仅'正常'分位为正;平静与承压区间均为负)。在完整窗口上优化将过拟合至已死的 2020-2021 区间,且近期窗口的 walk-forward OOS 将为负。这不是代码 bug(因此无需迭代),且最具流动性的对已是对该机制的最佳标的(因此无需 revise_hypothesis)。

实现

美元中性的 2 腿多空配对策略,在 4-HOUR Binance USD-M 永续合约上交易 ETH/BTC 比率的 TIME-SERIES MOMENTUM。每根 K 线计算 ratio = close(ETHUSDT)/close(BTCUSDT),随后计算该比率自身趋势的 z 分数:mom = log(ratio_t / ratio_{t-30 bars}) 除以按动量周期缩放的 60 根 K 线逐根对数比率收益的标准差。当 z 分数超过 +entry_z 时,以 EQUAL DOLLAR 名义价值做多 LONG ETH / 做空 SHORT BTC(各占权益的 leg_frac,数量 = 名义价值 / 对应腿自身价格);低于 -entry_z 时采取反向头寸;持仓直到 |z| 低于 entry_z * exit_frac(滞回死区),并在信号穿越零时直接反转。风险控制:对两条腿未实现收益之和(入场后比率的不利变动)设置配对层面的硬止损,并锁定再入场,直到信号回落至死区内;设置裸腿保护,若仅一条腿持仓则平仓;按日历计划重新对冲,将偏离的腿削减至美元中性。仅使用 OHLCV,不使用资金费率、逐笔成交、强平或期权数据源。

验证结果

验证失败(第 1 层——配置):config.instrument_id 和 config.bar_type 为 REQUIRED(得到 instrument_id=None,bar_type=None)。请将二者都设为假设所用的交易品种,例如 instrument_id='BTCUSDT.BINANCE'、bar_type='BTCUSDT.BINANCE-4-HOUR-LAST-EXTERNAL'。

可选:在推入比率前断言 self._btc_ts == ts_ns,以便在策略中明确同期性。

BTC 腿在 on_extra_bar 中进行缓冲,并且只有在基础模板的同一时间框架对齐屏障确认存在同期 BTC K 线后,才与 ETH 收盘价配对。实践中正确;这里只将其记录为数据缺口稳健性考量,而非缺陷。

回测评审

夏普
0.23
总收益率
44.72%
最大回撤
14.54%
总交易数
778
胜率
48.2%
盈利因子
1.05

交易忠实落实了假设:美元中性配对平衡(389 多头 / 389 空头腿),平均持仓 3天10小时;符合预期,benchmark_meaningful=false,属于市场中性组合。

回撤较低(14.5%),费用不是问题(仅 commission_pct_of_gross 4.56%)。

全样本期望收益为正(每笔 +$49.7),且 avg_trade_return_pct 0.286% 在技术上达到 0.15% 底线。

Sharpe 为 0.23,bootstrap CI [-0.48, 0.99] 跨越零值,且 PSR 0.69 (<0.95) — 过去 6.7 年,统计上与零无显著差异。

优势完全集中在前期:2020 +25.7% 和 2021 +12.7% 贡献了全部 44.7% 回报,而 2022-2026(最近约 4.5 年)净收益约为 -1.7%——ETH/BTC 相对动量延续优势已经衰减。

PF 1.046 是非常微薄的毛收益优势;这是信号弱,而非费用拖累。

对状态敏感:只有“正常”波动率三分位为正(夏普比率 +0.98);平静状态(-0.16)和压力状态(-0.03)均为负,only_one_regime=true。

Beta/美元中性的主要永续合约多空(multi_instrument/market_neutral)类别历史上无幸存者。

迭代历史

验证失败 (Layer 2 — 合成场景): 使用的参数: ['entry_z', 'leg_frac', 'mom_days', 'stop_pct', 'exit_frac', 'vol_window', 'min_notional', 'rehedge_band', '_param_bounds', 'default_qty_precision'] 请检查 __init__ 是否通过 self.parameters.get() 设置了所有属性。 - steady_uptrend: TypeError: EthBtcRelativeStrengthMomentumPair._symbol() 需要 1 个位置参数,但传入了 2 个 (bar timestamp: 1735697220000) - steady_downtrend: TypeError: EthBtcRelativeStrengthMomentumPair._symbol() 需要 1 个位置参数,但传入了 2 个 (bar timestamp: 1735697220000) - volatility_spike: TypeError: EthBtcRelativeStrengthMomentumPair._symbol() 需要 1 个位置参数,但传入了 2 个 (bar timestamp: 1735697040000) - zero_volume: TypeError: EthBtcRelativeStrengthMomentumPair._symbol() 需要 1 个位置参数,但传入了 2 个 (bar timestamp: 1735699500000) - price_gap: TypeError: EthBtcRelativeStrengthMomentumPair._symbol() 需要 1 个位置参数,但传入了 2 个 (bar timestamp: 1735697220000)

sandbox_timeout:验证失败(第 3 层——沙盒回测):在约 20000 根 K 线的窗口(ETHUSDT.BINANCE-1-DAY-LAST-EXTERNAL 的 2400 天)上,冒烟测试超过了 300 秒的墙钟时间限制。这通常意味着每根 K 线的工作量随历史长度增长——例如反复扫描完整的资金费率/补充序列,或在每根 K 线上于 calculate_signal()/on_bar() 内重建列表并调用 min()/sorted()。在 __init__ 中预先计算排序后的时间戳数组 ONCE 并使用 bisect,或按时间戳缓存查找结果,使每根 K 线的开销为 O(log n) 而非 O(n)。

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