策略
BTC-ETH 每日相对强弱轮动仅做多配趋势过滤
结局: 已放弃
BtcTakerAggressionFlowReversalZScore1H
BTC-ETH 每日相对强弱轮动仅做多配趋势过滤
假设
一种仅做多、多品种的轮动策略,运行在两个最大的加密货币主流币种(BTCUSDT.BINANCE 和 ETHUSDT.BINANCE)上,使用日线时间框架。机制:每日比较 BTC 与 ETH 的 20 日收益(相对强弱比较),持仓相对更强的资产,仅当相对强弱反转超过滞回边际时才切换(防止反复止损)。通过品种专属的趋势过滤器(持仓资产的收盘价 > 50 日 SMA)进行过滤——如果两个资产都不在其自身的上升趋势中,则持有现金。此策略直接执行分析师在 ADAAroonTrendStrength 弃用反馈中给出的 EXPLICIT 建议:'MULTI-INSTRUMENT [信号](跨资产趋势强度比较)'——应用于日线 K 线可用性最可靠的两个主流币种。与现有的每个流水线条目都不同:(a) NOT 单一品种策略(多品种范围当前为 8.8% vs 目标——直接填补欠配额桶);(b) NOT 唐奇安/突破、成交量激增、基差或振荡器策略(这些都是单一资产或基差机制);(c) IS 相对强弱轮动——一种在加密货币相关文献中广泛的机制类别(Liu-Tsyvinski 2018,Cohen-Frazzini 2008 由 Greer 2021 改编为加密货币),但在我们当前组合中 ZERO 存在。仅做多是因为两边都是具有已记录的正长期漂移的加密货币主流币种,趋势过滤可防止在下跌趋势中持仓(Keltner 失败教训),并且对加密货币主流币种的纯做空方向性已被经验性证伪(-2.6 夏普比率差距 vs 做多)。仅使用日线 K 线——避免 4H audit_stale 基础设施风险(EthDailyGoldenCrossMomentumLong 验证 ETH 日线有效,多个 BTC 策略验证 BTC 日线有效)。
仅修复所报告的第-1层前视偏差错误,并逐字节地保留文件中所有早期通过的部分。此前的主动成交数据查找按绝对距离选择 K 线时间戳NEAREST的观测值,这会在当前观测比前一个更近时返回NEXT记录——这正是真正的前视偏差,并且对这一特定优势是自拆台脚的,因为其全部的持久性主张就在于主动成交激进度只能在资金流发生之后才能被观察到。`_nearest_metric`被替换为`_prior_metric`,一个严格的即时点读取:`bisect.bisect_right(ts_list, bar_ts) - 1`返回在此 K 线之前已经发生的最新记录,未来的记录在结构上无法访问,超过`taker_tolerance_s`的记录被视为无数据(不进行陈旧值沿用,因此账簿在数据馈送断流期间会简单地保持空仓)。任何时间戳算术中都未保留`abs()`。未触及:修复了第-2层代理重新绑定 TypeError 的模块级 `_to_ns`/`_ts_ns_of` 辅助函数,修复了第-3层零交易失败的双驼峰式/snake_case补充数据解析器,滚动 z 分数,入场/出场阈值以及相对资金的仓位规模。我在配置中将`taker_tolerance_s`从7200提高到28800,因为仅向后读取的最坏情况间隙严格长于旧的双向搜索,否则会丢弃先前运行所消耗的 K 线。
verification_loop:验证失败(第 4 层 — QA 审查)[类=hypothesis_mismatch]: - WHOLE-STRATEGY SWAP:提交的代码在每个维度上都实现了与假设完全不同的策略。假设 = 'BTC-ETH 每日相对强弱轮动仅做多配趋势过滤':多品种(BTCUSDT + ETHUSDT),DAILY K线,LONG-ONLY,跨资产相对强弱轮动(比较 20 日收益,持仓相对更强的一方,滞回切换),由 50 日 SMA 进行过滤,纯 OHLCV。提交的代码 = 类 BtcTakerAggressionFlowReversalZScore1H:SINGLE 品种(仅 BTCUSDT.BINANCE,无 extra_instruments),1-HOUR K线,LONG-SHORT,由 taker_ratio SUPPLEMENTARY 数据流驱动的 taker_ratio z 分数 MEAN-REVERSION 主动成交激进极端值的反向。在品种集、时间框架、方向、核心优势(轮动/相对强弱机制完全缺失)和数据源上都不匹配。代码/配置/名称/描述都内部一致地指向主动成交流策略,因此错误的工件被链接到了此假设。
实现
在 BTCUSDT.BINANCE USD-M 永续合约 1H K 线上的多空均值回归,仅由 taker_ratio 补充数据流驱动。每一根 K 线读取在 K 线时间戳之前或当刻的最新主动成交买卖观测值,将其转换为对数买卖不平衡,并将 4 小时的平滑读数对其近 ~30 日的分布进行 z 分数化。z 值达到或超过 +entry_z 表示激进买入已耗尽,因此策略反向做空 SHORT;z 值达到或低于 -entry_z 表示恐慌性抛售已耗尽,因此策略做多 LONG。出场方式为不平衡回归至 +/- exit_z 范围内、3% 止损、4% 止盈、或 24 根 K 线的时间止损。仓位规模为权益的 15%,以止损距离上 1.5% 的权益风险为上限。在没有可用的主动成交数据时,账簿保持空仓——没有仅基于价格的回退优势。
验证结果
验证失败(第 4 层 — QA 审查)[类=hypothesis_mismatch]: - WHOLE-STRATEGY SWAP:提交的代码在每个维度上都实现了与假设完全不同的策略。假设 = 'BTC-ETH 每日相对强弱轮动仅做多配趋势过滤':多品种(BTCUSDT + ETHUSDT),DAILY K线,LONG-ONLY,跨资产相对强弱轮动(比较 20 日收益,持仓相对更强的一方,滞回切换),由 50 日 SMA 进行过滤,纯 OHLCV。提交的代码 = 类 BtcTakerAggressionFlowReversalZScore1H:SINGLE 品种(仅 BTCUSDT.BINANCE,无 extra_instruments),1-HOUR K线,LONG-SHORT,由 taker_ratio SUPPLEMENTARY 数据流驱动的 taker_ratio z 分数 MEAN-REVERSION 主动成交激进极端值的反向。在品种集、时间框架、方向、核心优势(轮动/相对强弱机制完全缺失)和数据源上都不匹配。代码/配置/名称/描述都内部一致地指向主动成交流策略,因此错误的工件被链接到了此假设。
迭代历史
验证失败(第 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 个(bar 时间戳:1735689840000) - steady_downtrend:TypeError:FactoryStrategy._bar_ts() 需要 1 个位置参数,但实际传入了 2 个(bar 时间戳:1735689840000) - flat_ranging:TypeError:FactoryStrategy._bar_ts() 需要 1 个位置参数,但实际传入了 2 个(bar 时间戳:1735689840000) - volatility_spike:TypeError:FactoryStrategy._bar_ts() 需要 1 个位置参数,但实际传入了 2 个(bar 时间戳:1735689840000) - zero_volume:TypeError:FactoryStrategy._bar_ts() 需要 1 个位置参数,但实际传入了 2 个(bar 时间戳:1735689840000) - price_gap:TypeError:FactoryStrategy._bar_ts() 需要 1 个位置参数,但实际传入了 2 个(bar 时间戳: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._ts_ns_of() 需要 1 个位置参数,但实际传入了 2 个(bar 时间戳:1735689840000) - steady_downtrend:TypeError:BtcTakerAggressionFlowReversalZScore1H._ts_ns_of() 需要 1 个位置参数,但实际传入了 2 个(bar 时间戳:1735689840000) - flat_ranging:TypeError:BtcTakerAggressionFlowReversalZScore1H._ts_ns_of() 需要 1 个位置参数,但实际传入了 2 个(bar 时间戳:1735689840000) - volatility_spike:TypeError:BtcTakerAggressionFlowReversalZScore1H._ts_ns_of() 需要 1 个位置参数,但实际传入了 2 个(bar 时间戳:1735689840000) - zero_volume:TypeError:BtcTakerAggressionFlowReversalZScore1H._ts_ns_of() 需要 1 个位置参数,但实际传入了 2 个(bar 时间戳:1735689840000) - price_gap:TypeError:BtcTakerAggressionFlowReversalZScore1H._ts_ns_of() 需要 1 个位置参数,但实际传入了 2 个(bar 时间戳:1735689840000)
验证失败(第 1 层 — 静态分析): - 前视偏差:通过到 K 线时间戳的 ABSOLUTE 距离来选择补充观测值,这会在当前观测比前一个更近时返回 NEXT 观测值。请使用 self.supp_as_of(key)(K 线时刻或之前的最新值)或显式的 `ts <= bar.ts_init` 过滤器——永远不要使用 abs()。(行 None)
验证失败(第 3 层 — 沙盒回测):未产生交易 使用的 K 线类型:BTCUSDT.BINANCE-1-HOUR-LAST-EXTERNAL,已处理 K 线数:56856 诊断:should_enter() 在 56852 个评估 K 线中返回方向 0 次 -> 你的 ENTRY CONDITION 从未触发。请放宽入场逻辑/阈值。 请确保你的策略在给定数据和参数下能产生交易。
验证失败(leverage_set_but_unused):配置将杠杆设置为=3.0,但策略在仓位规模中从不引用杠杆。请按杠杆进行仓位规模——名义 = 权益 * 比例 * 杠杆 / 价格(读取 self.config.leverage)——或将杠杆设置为=1.0。按目前写法杠杆是无效的,回测与 1x 完全相同。
放弃原因
verification_loop:验证失败(第 4 层 — QA 审查)[类=hypothesis_mismatch]: - WHOLE-STRATEGY SWAP:提交的代码在每个维度上都实现了与假设完全不同的策略。假设 = 'BTC-ETH 每日相对强弱轮动仅做多配趋势过滤':多品种(BTCUSDT + ETHUSDT),DAILY K线,LONG-ONLY,跨资产相对强弱轮动(比较 20 日收益,持仓相对更强的一方,滞回切换),由 50 日 SMA 进行过滤,纯 OHLCV。提交的代码 = 类 BtcTakerAggressionFlowReversalZScore1H:SINGLE 品种(仅 BTCUSDT.BINANCE,无 extra_instruments),1-HOUR K线,LONG-SHORT,由 taker_ratio SUPPLEMENTARY 数据流驱动的 taker_ratio z 分数 MEAN-REVERSION 主动成交激进极端值的反向。在品种集、时间框架、方向、核心优势(轮动/相对强弱机制完全缺失)和数据源上都不匹配。代码/配置/名称/描述都内部一致地指向主动成交流策略,因此错误的工件被链接到了此假设。
Stratmill 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。