跳至正文
全部策略

策略

SOL 4 小时冲击柱延续策略,多空(Binance USD-M,有利于手续费的交易节奏版本:将已晋级的 ETH-4H 冲击表达移植到第二个已验证的冲击资产上,采用钳制后的冲击阈值、紧密的初始止损、移动止损保护盈利,并对资金规模设定离散上限)

结局: 已放弃

SolImpulseBarContinuationTrendLS4H

深厚的多年 SOL 历史数据(13,079 根 K 线,451 笔交易)构成了真实样本

假设

一个 LONG-SHORT、单品种、纯 OHLCV CONTINUATION 策略,运行于 SOLUSDT.BINANCE USD-M 永续合约,使用 4-HOUR 周期 K 线。这是工厂中两个独立 VALIDATED 事实的 CADENCE + ASSET 组合,NOT 投机性新触发器或新品种的抛硬币式尝试:(1) 幅度离群的 IMPULSE-K 线延续触发器是工厂中最强、反复晋级的边际优势(ETH-1H ~1.40 已晋级,ETH-4H 刚以 Sharpe 1.05 晋级,现为 paper_stage);以及(2) SOL 是被证明承载此特定脉冲延续边际优势的 SECOND 资产(SOL-1H 脉冲 ~0.69,论文) —— 即 SOL 处于已验证的 ETH/SOL 「clean-continuation」轴,NOT LINK/XRP/DOGE/AVAX/DOT 「whipsaw」轴。唯一尚未尝试的是 SOL 上的 FEE-FAVORABLE 4-HOUR 节奏 —— 正是那个通过削减费用拖累并交易更大、更干净的每根 K 线脉冲而将 ETH 表达式推至晋级的精确节奏转换。机制:当单根 4 小时 K 线为幅度离群(其真实波幅超过最近 ATR 的夹紧倍数)时,该走势倾向于在 SOL/ETH 上随后的 K 线 CONTINUE 其方向;策略沿脉冲方向建仓,设紧凑的初始止损并跟踪赢家。根据分析师的明确指引("追求不同的已验证资产,例如 SOL-impulse" 以及 "在已 WINNING 资产上的节奏/结构变体"),这是可用的预期生存性最高的表达式。多年的 Binance SOL 深度历史使其可进行 walk-forward/样本外验证(不同于 HL 移植策略和清算策略)。约 4 个夹紧参数以抵抗整批反复出现的过拟合。

第 5 次迭代修复了 ONLY 所报告的 leverage_set_but_unused 门槛。该门槛是一个静态令牌检查:如果配置的杠杆>1,且代码中不包含 config.leverage/.leverage/self.leverage/self._lev,就会拒绝该配置。上一次迭代在仓位规模计算中未引用杠杆,因此被标记,且与 1x 字节完全相同。此版本将杠杆接入 position_size(leverage = float(self.config.leverage); risk_budget = equity * risk_frac * leverage; max_notional = equity * leverage),因此 3x 组合实际会持有约为原先 3x 倍的 1x 仓位(对于典型的 SOL-4H ATR/止损比率,不设上限),并在 __init__ 中缓存 self._leverage。此前所有已通过的逻辑——连续的、有符号的实体长度(以 ATR 为单位)信号、经过限幅的幅度异常值入场门槛,以及紧密止损/移动止损退出——均保持不变,在保留层级 1-2 的同时,使杠杆对回测产生实质影响。

灾难性回撤加上盈亏平衡、不可扩展的边际优势 —— 不可优化。max_drawdown 79.14% (CI 至 98.99%) 远远超过 50% 硬性放弃线 (L19),永远无法跨越晋级回撤下限。profit_factor 是 1.038((低于 1.2 有意义边际优势线)),且 Sharpe 0.50 的自助法 CI [-0.29, 1.23] 跨越零,因此在任何优化选择偏差之前不存在统计上显著的边际优势。+165% 头条数据是人为假象:return_kurtosis 71.9 / 偏度 4.2,仅有数日 +106.7%(2026-08-22)与 +48.5%(2026-02-06)支撑,且 end_unrealized_pct 54.3% 意味着超过一半为未平仓头寸而非已实现。更关键的是,impact_cost_pct 41.6% 配合 capacity_usd 仅 $578K 意味着市场冲击已吞噬毛 PnL 的 42% —— 边际优势仅存在于玩具规模,本身就是晋级阻断项。information_ratio 是 -0.68((风险调整后跑输买入持有)),且年度业绩剧烈波动(2026 -43.4%)。这是单品种 OHLCV 方向性脉冲延续;已晋级的 ETH-4H 兄弟框架无法迁移 —— 在 SOL 上,相同机制产生 79% 回撤与 PF~1.0。参数调优无法修复 80% 回撤或 42% 冲击拖累;优化器将拟合离群盈利者并在 deflated-Sharpe/样本外测试中失败。失败模式:risk_reject/单品种方向性过度拟合,>50% DD。

实现

在 SOLUSDT.BINANCE USD-M 4H K 线上进行单 K 线冲击延续多空交易。当 K 线真实波幅超过近期 ATR 的钳制倍数时,离群幅度门槛触发;策略按该 K 线方向入场(以 ATR 为单位的带符号实体),使用紧密的初始 ATR 止损,并以更宽的 ATR 移动止损保护盈利。在 3x 下采用基于风险、考虑杠杆的仓位规模,并设置考虑杠杆的名义价值上限。

验证结果

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

将仓位规模舍入到 SOLUSDT 数量精度 (3)。非阻断性问题。

position_size 返回 Decimal(str(size)),但没有按 SOL 数量精度 (3) 进行舍入。模板显然会量化(已成交 451 笔交易),但仍应显式舍入,以避免精度校验失败。

考虑采用不随杠杆变化的固定比例风险仓位,让杠杆仅提高名义价值上限;或降低杠杆/risk_frac,使回撤低于晋级底线。由优化器/风险决策决定。

杠杆会放大每笔交易的风险预算(equity * risk_frac * leverage),因此在 3x 时,每笔交易止损对应的风险为权益的 3% — 这是 79% 回撤的直接驱动因素。此设置合理(且满足 leverage_set_but_unused 门槛),但意味着杠杆放大的是 RISK,而不只是可用空间。

回测评审

夏普
0.50
总收益率
165.31%
最大回撤
79.14%
总交易数
451
胜率
38.4%
盈利因子
1.04

深厚的多年 SOL 历史数据(13,079 根 K 线,451 笔交易)构成了真实样本

avg_trade_return_pct 0.51% 超过 Binance USD-M 手续费底线

机制实现清晰(幅度离群冲击门槛,ATR 移动止损)

max_drawdown 79.14%(CI 至 98.99%)— 远超 50% 的硬性放弃线(L19);无法达到晋级回撤底线

profit_factor 1.038 — 低于 1.2 的显著优势门槛;优势基本处于盈亏平衡

Sharpe 0.50 的 bootstrap CI [-0.29, 1.23] 跨越零值 — 统计上不显著

impact_cost_pct 41.6%,但 capacity_usd 仅为 $578K — 市场冲击成本吞噬了毛利的 42%;优势只在玩具规模下真实存在

头条 +165% 收益由异常值驱动(峰度 71.9、偏度 4.2;单日 +106.7% 和 +48.5%),其中 54.3% 是尚未退出的未平仓头寸未实现收益(end_unrealized_pct)

information_ratio -0.68(风险调整后表现逊于买入并持有);年度表现极不稳定(2026 -43.4%)

单一标的 OHLCV 方向延续策略 — 已晋级的 ETH-4H 同类资产框架无法迁移;在 SOL 上,同一机制产生 79% DD 和 PF~1.0

迭代历史

验证失败(Layer 2 — 合成场景): 使用的参数:['risk_frac', 'atr_period', 'min_notional', 'stop_atr_mult', 'trail_atr_mult', 'impulse_atr_mult'] 检查 __init__ 是否通过 self.parameters.get() 设置了所有属性。 - steady_uptrend: TypeError: SolImpulseBarContinuationTrendLS4H._true_range() 接受 2 个位置参数,但实际给出了 3 个(K 线时间戳:1735690560000) - steady_downtrend: TypeError: SolImpulseBarContinuationTrendLS4H._true_range() 接受 2 个位置参数,但实际给出了 3 个(K 线时间戳:1735690560000) - flat_ranging: TypeError: SolImpulseBarContinuationTrendLS4H._true_range() 接受 2 个位置参数,但实际给出了 3 个(K 线时间戳:1735690560000) - volatility_spike: TypeError: SolImpulseBarContinuationTrendLS4H._true_range() 接受 2 个位置参数,但实际给出了 3 个(K 线时间戳:1735690560000) - zero_volume: TypeError: SolImpulseBarContinuationTrendLS4H._true_range() 接受 2 个位置参数,但实际给出了 3 个(K 线时间戳:1735690560000) - price_gap: TypeError: SolImpulseBarContinuationTrendLS4H._true_range() 接受 2 个位置参数,但实际给出了 3 个(K 线时间戳:1735690560000)

验证失败(leverage_set_but_unused):配置设置了 leverage=3.0,但策略在仓位规模计算中从未引用 leverage。请据此计算仓位规模 — 名义价值 = equity * fraction * leverage / price(读取 self.config.leverage)— 或将 leverage 设为 1.0。按当前写法,leverage 未发挥作用,回测结果与 1x 相同。

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

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