跳至正文
全部策略

策略

SOL 4H 成交量确认突破做多策略,带日线市场状态过滤器

结局: 已放弃

SolFourHourVolumeConfirmedBreakoutLong

机制实现正确(在 6.6 年内进行 169 笔交易,无覆盖范围限制,迭代-4 缓冲区修复有效)

假设

一种仅做多、针对单一标的的突破策略,应用于 SOLUSDT 永续期货,使用 4 小时 K 线和仅含 OHLCV 的数据,并采用日线级别的市场状态过滤器。在架构上 MIRRORS 已验证的 BNB 4H 成交量确认突破策略(夏普比率 2.03,paper_stage),将其应用于 SOL,在机制和时间周期上与策略流水线中现有的 SOL 策略保持正交(SolDailyEmaTrendContinuationLong 使用日线 / 基于 EMA 交叉)。关键在于,本提案承认近期记录的失败模式:“将 BTC/ETH 架构自动复制到其他加密货币主流币,却未进行敏感性验证”(BNB 黄金交叉、ETH 现货回撤均因此失败),并明确通过以下方式加以应对:(a) 要求在优化阶段将 sensitivity_passed 设为晋级前的硬性门槛(所有参数下 cliff_count 必须 0);(b) 选择适合 SOL 的构造,而非不适合 SOL 的构造——4H 成交量确认突破符合 SOL 实证上成交量高、散户 DeFi 交易活跃的特征(按 4H 成交量计,SOL 是排名前 -3 的永续合约,与 BNB 相当);相比之下,均值回归或浅回撤构造在 SOL 上屡次失败(肯特纳通道突破、资金费率反向策略变体)。该构造本质上是在高动量资产上采用 TRENDING 策略,NOT 在走势更平滑的资产上采用均值回归策略(这正是导致 ETH 现货回撤策略失败的维度)。采用单一主导过滤器设计(200 天 SMA 市场状态 + 20 根 K 线 4H 高点 + 成交量确认),明确 NOT 多条件 AND 门槛。针对 4H K 线校准为每年约 30-60 次入场(与 BNB 的实证信号频率相符)——远高于稀疏性失败阈值。

修复 iteration-3 Layer-3 失败(无交易 / 0 根已评估K线)。根本原因:基类将主K线缓冲区限制为 self._max_bars = 500,但 min_bars_required() = regime_bars(1200) + 20 + 5 = 1225。由于 len(self._bars) 永远无法超过 500,_maybe_process_primary 中的 `len(self._bars) < min_bars_required()` 保护条件恒为真,因此 _process_primary 以及 should_enter 从未被调用。最小修复是在 __init__ 中将K线缓冲区扩大至 regime_bars + 60(1260),以便累积完整的 200 天机制历史并达到 min_bars_required,从而允许评估K线并触发突破入场。所有信号逻辑、机制/突破/成交量条件、退出、消耗杠杆的仓位规模以及干净导入(已通过 Layer 1 和 2)均保持不变。这保留了假设中忠实的 200 天(1200 4H K线)机制过滤器,与已验证的 BNB 架构一致,而非缩短机制窗口。

无可优化的稳健优势。基础夏普比率 0.171,自助法 CI [-0.593, 0.983] 横跨零线,profit_factor 1.079(<1.2),以及 information_ratio -1.02 表明该策略没有显著的风险调整后优势,且跑输持有 SOL。6.6 年内的 +17.9%(约 2.9%/年)由离群值驱动(峰度 21.6)并经杠杆放大(avg_position_pct 128%)。市场冲击已消耗毛收益的 39.3%,容量仅 $648K,因此即使是微弱优势也是玩具规模的假象。这属于单标的 OHLCV 定向突破零存活类别(L9/L41/L63);论文阶段的 BNB 4H 兄弟框架无法迁移——在 SOL 上相同机制产生夏普比率 0.17 / PF 1.08,而 L82 可存活的变体是双时间框架动量汇合,而非单标的突破+机制过滤器。在此类上,低于 -1.0 的基础夏普比率即为上限;缩水/样本外检验只会进一步降低,没有参数调优能将其提升至可推广的稳健水平。并非受费用限制(avg_trade 0.266%),但不值得花费 2 小时进行优化。失败模式:no_edge 单标的定向突破。

实现

仅做多的 4H 唐奇安通道成交量确认突破策略,交易 SOLUSDT 永续期货(Binance USD-M,2x 杠杆),由 SMA 市场状态过滤器把关,该过滤器等效于 200 天(1200 根 4H 柱),直接基于主 4H 序列计算。价格高于长期 SMA(牛市状态)、突破前 20 根柱的唐奇安通道高点,且成交量超过其 20 根柱均值的 1.5x 时做多。出现 10 根柱的唐奇安通道低点下破、6% 止损、18% 止盈或 30 根柱的时间止损时退出。纯粹的 OHLCV,单一工具。

验证结果

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

无需处理。

基于 1200 根 4H 柱推导的 200 日市场状态过滤器,而非实际日线柱——这是忠实等效实现,正确。要求缓冲区容纳 >1200 根柱;迭代-4 修复(将 _max_bars 提高到 1260)解决了这一问题,且沙箱确认柱正在被评估。

无需采取行动。

_bars_held 可能因调度顺序在入场K线上递增至 1,使有效时间止损约为 29-30 根K线。可忽略的 off-by-one 误差。

回测评审

夏普
0.17
总收益率
17.95%
最大回撤
23.86%
总交易数
169
胜率
53.8%
盈利因子
1.08

机制实现正确(在 6.6 年内进行 169 笔交易,无覆盖范围限制,迭代-4 缓冲区修复有效)

avg_trade_return_pct 0.266% 高于 Binance USD-M 费用底线 0.15%

max_drawdown 23.9% 已被控制在范围内(尽管 CI 延伸至 76.9%)

基础 Sharpe 为 0.171,自助法置信区间 CI [-0.593, 0.983] 跨越零值——没有显著的风险调整后优势

profit_factor 1.079,低于 1.2 的有意义优势门槛

information_ratio -1.02 — 按风险调整后表现衡量,跑输单纯持有 SOL

impact_cost_pct 39.3%,容量仅 $648K——冲击侵蚀毛收益约 39%,优势为玩具规模

单一标的 OHLCV 方向性突破——零幸存者类别(L9/L41/L63);基础 Sharpe <1.0 是上限

名义 +17.9% 约为 ~2.9%/年,由离群值驱动(峰度 21.6),经 128% 平均仓位放大

迭代历史

验证失败(Layer 2 — 合成情景): 使用的参数:['vol_mult', 'vol_period', 'min_notional', 'position_pct', 'exit_lookback', 'max_hold_bars', 'regime_period', 'stop_loss_pct', 'take_profit_pct', 'breakout_lookback'] 检查 __init__ 是否设置了 self.parameters.get() 中的所有属性。 - steady_downtrend:信号冻结:所有 476 个信号都相同(值=0.0)。calculate_signal() 可能存在错误——信号从未变化。 - volatility_spike:信号冻结:所有 476 个信号都相同(值=0.0)。calculate_signal() 可能存在错误——信号从未变化。 - zero_volume:信号冻结:所有 476 个信号都相同(值=0.0)。calculate_signal() 可能存在错误——信号从未变化。 - price_gap:信号冻结:所有 476 个信号都相同(值=0.0)。calculate_signal() 可能存在错误——信号从未变化。

验证失败(Layer 3 — 沙箱回测):未产生交易 使用的柱类型:SOLUSDT.BINANCE-4-HOUR-LAST-EXTERNAL,处理柱数:12467 诊断:should_enter() 在评估的 12443 根柱中返回方向 0 次 -> 你的 ENTRY CONDITION 从未触发。请放宽入场逻辑 / 阈值。 确保你的策略能使用给定的数据和参数产生交易。

验证失败(Layer 3 — 沙箱回测):未产生交易 使用的柱类型:SOLUSDT.BINANCE-4-HOUR-LAST-EXTERNAL,处理柱数:12665 诊断:should_enter() 在评估的 0 根柱中返回方向 0 次 -> 你的 ENTRY CONDITION 从未触发。请放宽入场逻辑 / 阈值。 确保你的策略能使用给定的数据和参数产生交易。

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

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