跳至正文
全部策略

策略

LINK 现货趋势参与——多头/空仓、无杠杆:在慢速 DAILY 趋势状态为 UP 时持有现货资产,趋势破坏时换为 CASH——持续参与市场状态(NOT 罕见的深度回撤抄底),捕捉山寨币上涨趋势,同时避开熊市回撤(LINKUSDT.BINANCE_SPOT,日线,3 参数)

结局: 已放弃

LinkSpotTrendParticipation

avg_trade_return_pct 6.12% 轻松超过现货手续费底线(并非手续费导致的失败)

假设

一个LONG-ONLY、无杠杆、单一品种的SPOT趋势参与策略,在其慢速日线趋势状态为UP时持有LINK,并在趋势破位时轮动至CASH。它被刻意路由到BINANCE_SPOT — 这是唯一代表性最为不足的高存活场所(11.1%对比≥15%的配额),也是根据工厂路由规则、适合仅做多无杠杆策略的场所适配归属 — 并且它是我们流水线中方向性期货策略的SPOT、多头/空仓对应版本(那些均为带杠杆的多SHORT)。关键在于,它NOT那个失效的Binance现货深度回撤累积篮子:该策略仅在RARE深度回撤时触发,并在2023之后产生ZERO笔交易(空白的前推检验/保留期)。该策略为CONTINUOUS状态参与 — 在所有年份中,每次上升趋势期间持有多头,每次下降趋势期间保持空仓,因此它在每个状态周期中均会交易,不会在后续窗口中失效。经济目标是相对于买入持有的风险调整后改善:捕捉大型山寨币的上升趋势(其规模使0.20%现货往返成本相形见绌),同时规避破坏买入持有夏普比率的深度熊市回撤。LINK是一只流动性强的大盘币,具备多年稳健的日线SPOT历史,因此前推检验窗口和15天保留期可有效填充。3参数:入场趋势SMA长度,出场SMA长度,以及ATR跟踪倍数。

ITERATION 2 —— 针对 Layer-2 故障的单一、精准修复。六种合成场景全都因“TypeError: _roll() takes 3 positional arguments but 4 were given”而失败:验证代理会重新绑定策略的类函数,从而去掉 @staticmethod 包装器,所以在第一根 bar 上,共享滚动求和辅助函数就把 `self` 当作第一个参数收到了。该辅助函数纯粹是为了方便,因此我将其彻底移除,而不是把它改成实例方法——没有辅助函数,就不会重现同一种故障。它的四行代码现已内联到三个调用点(_push_true_range 中的真实波幅 deque、calculate_signal 中的入场-SMA 和出场-SMA deque),这也符合代码库其余部分的写法。NOTHING ELSE CHANGED:导入项相同、信号相同、入场/出场/仓位规模逻辑相同、配置和参数边界相同,因此 Layer-1 静态检查仍通过。我重新对编辑后的类进行了完整重放,使用真实的 2761-bar LINKUSDT.BINANCE_SPOT 日线历史数据(每笔成交0.10%,按次日开盘价执行),结果与第 1 次迭代中的策略逐字节相同:109 笔交易,往返交易平均+4.73%,盈利因子 2.20,总计+786%,夏普比率 0.44,最大回撤 88.2%;最近 545 天每笔交易+0.09%(总计-2.8%),而买入并持有为-55.6%;最近 365 天有18笔交易。我还将 200 根完全平盘 bar(形状与 flat_ranging 和 zero_volume 场景相同)输入 calculate_signal/should_enter/should_exit/position_size:没有异常,ATR 的结果为 0,信号返回 0.0,因此退化场景路径正常。第 -1 次迭代的注意事项仍然不变,仍应由分析师决定如何处理:Layer-3 沙箱涵盖最近 365 天,这期间 LINK 下跌了55.7%,因此仅做多的策略大约会录得-19%(约为该资产跌幅的三分之一),尽管完整回测结果大幅为正;而夏普比率为 0.44 且回撤超过 60%,无法达到晋升门槛(夏普比率 1.5、回撤 10%),因此应在回测审查时将这一假设与买入并持有(夏普比率 0.21、回撤 90%)进行比较,或予以放弃。

因回撤而硬性放弃:max_drawdown 94.09%(从 CI 到 100%)远超 50% 限值(L19),永远无法达到晋级回撤底线。+1901% 的表面指标反映的是加密资产 beta(beta 0.73、benchmark_correlation 0.80),并非主动优势——information_ratio 为负(-0.17),因此风险调整后表现不及买入并持有;且 profit_factor 1.18 低于 1.2 的有意义优势标准。夏普比率是少数异常上涨日(峰度 184.9、偏度 11.3)以及跟随权益曲线的仓位规模(avg_position_pct 131%)造成的假象。假设本身承认,该策略会一路承受 2022 熊市下跌(2022 -78.4%),并自我报告回撤为 88%;优化 3 参数无法修复一种结构上会在深度熊市中持续持仓的机制。这是仅做多、现货承载 beta 并承受回撤的模式(L49)——不值得投入 2 小时优化。

实现

在 LINKUSDT.BINANCE_SPOT 的日线柱上进行多头/空仓、无杠杆的现货趋势参与。信号是连续趋势评分:(close - SMA(entry_sma)) / ATR(14) ——价格高于/低于趋势基线的距离,以日波动率为单位,每根柱都计算。只要该评分转为正值(close 高于 SMA(entry_sma)),策略就用现金余额的 98% 买入该资产;当收盘价跌破 SMA(exit_sma),或价格从入场以来的最高点回撤 atr_trail_mult x ATR 时(吊灯式移动止损),就换回 100% CASH。在样本的每一年中,约有一半交易日处于持仓状态——这是持续的市场状态参与,而非罕见事件中的抄底——并且从不做空、从不借款,只持有该资产或现金,因此被路由至 BINANCE_SPOT(CASH 账户,杠杆 1.0)。信号在日线收盘时产生,并于次日开盘成交。三个可调参数:entry_sma、exit_sma、atr_trail_mult。

验证结果

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

不修改代码;验证权益和持仓价值的分母是否同时被快照记录。

在无法借入资产的 CASH 现货账户上运行沙箱 avg_position_pct 108.8%,但 position_size() 的上限为 equity*invest_frac(<=0.99)——代码从未请求杠杆,因此这是按市值计价指标产生的假象,并非过度承诺。已标记,待分析师确认。

只有在仓位规模非零后才设置 _in_trade,或者每根 bar 都从 cache.positions_open() 对账。

should_enter() 在订单确认成交前就将 _in_trade 设为 True;如果 position_size() 返回 0,该标志会保持设置状态。基类根据实际缓存仓位决定入场/离场,因此只有吊灯止损的峰值跟踪会受影响,而且会自行恢复。非致命问题。

回测评审

夏普
1.29
总收益率
1901.23%
最大回撤
94.09%
总交易数
120
胜率
27.5%
盈利因子
1.18

avg_trade_return_pct 6.12% 轻松超过现货手续费底线(并非手续费导致的失败)

120 在所有年份都有交易(机制按设计持续触发,没有失活窗口)

alpha (0.085) 和 Sortino 为正,入场诊断正常(120 次发出信号,120 次提交,无丢弃)

max_drawdown 94.09%,其中 CI [99.68%, 100.0%] ——属于应硬性放弃的范围(L19),无法达到晋级回撤底线

profit_factor 1.18 低于 1.2 的有意义优势阈值

information_ratio -0.17:相对于买入并持有的风险调整后主动收益为负;beta 0.73 / 相关性 0.80 表明 +1901% 是加密资产 beta,而非策略能力(L49)

夏普比率由离群值驱动——峰度 184.9、偏度 11.3,有少数极端的单日收益 >100%/日,且 avg_position_pct 131% 表明仓位规模跟随权益曲线,而非源于稳健优势

2022 -78.4%,2025 -13.5% ——该策略因重新入场失败而一路承受熊市下跌,恰如假设所承认的那样(88% 自我报告 DD)

迭代历史

验证失败(Layer 2 — 合成场景): 使用的参数:['exit_sma', 'entry_sma', 'atr_period', 'invest_frac', 'min_notional', '_param_bounds', 'atr_trail_mult'] 请检查 __init__ 是否设置了 self.parameters.get() 中的所有属性。 - steady_uptrend: TypeError: LinkSpotTrendParticipation._roll() 需要 3 个位置参数,但实际给出了 4 个(柱时间戳:1735692060000) - steady_downtrend: TypeError: LinkSpotTrendParticipation._roll() 需要 3 个位置参数,但实际给出了 4 个(柱时间戳:1735692060000) - flat_ranging: TypeError: LinkSpotTrendParticipation._roll() 需要 3 个位置参数,但实际给出了 4 个(柱时间戳:1735692060000) - volatility_spike: TypeError: LinkSpotTrendParticipation._roll() 需要 3 个位置参数,但实际给出了 4 个(柱时间戳:1735692060000) - zero_volume: TypeError: LinkSpotTrendParticipation._roll() 需要 3 个位置参数,但实际给出了 4 个(柱时间戳:1735692060000) - price_gap: TypeError: LinkSpotTrendParticipation._roll() 需要 3 个位置参数,但实际给出了 4 个(柱时间戳:1735692060000)

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