策略
因子信号 / 贝塔表达拆分:在 BTC 上估算加密市场趋势(最干净的代理指标),并在贝塔约为 1.8 的山寨币永续合约上用 EXPRESS 表达该信号(NEARUSDT.BYBIT,2小时 K 线,始终多空持仓,无过滤门槛,无补充数据源)
结局: 已放弃
BtcFactorSignalNearBetaExpressionLS
结局总结
…(4 句话,包括已标记供工程团队关注的说明:这本单腿组合的日度 MTM 序列出现大幅相互抵消的成对日收益,因此曲线推导出的风险指标不可直接信以为真;本结论依据已实现交易账本。)
假设
第 2 次迭代从根源解决了指定的回测门槛问题(夏普比率 +0.01 与 -31.40% 的权益曲线不一致),而非只做表面修饰。这种符号分歧IS波动率拖累:日度 MTM 收益的算术均值接近零,而复合曲线每天约损失 sigma^2/2,差距随组合已实现波动率的 SQUARE 增大。缺陷出在仓位规模输入,而非信号路径(信号路径通过了第 1-3 层,除波动率状态更新位置外,保持字节级不变):已实现波动率估计采用 EWMA 对平方后的 2-HOUR 对数收益进行计算,并乘以 sqrt(4380) 年化。这种按时间平方根缩放假定收益独立同分布,会系统性低估日度期限上呈趋势且波动率聚集的另类永续合约;而且仓位在入场时固定并持有 5-8 天,因此滞后的估计会在每次波动率扩张前低估仓位规模——结果是组合实际运行水平远高于其声明的 22% 目标,并承受了数倍于预期的拖累。修正方案:(1) 在与年化所用期限AT的尺度上衡量方差(使用重叠的 12 根 K 线,即 24 小时对数收益,并按 EWMA 年化);(2) 同时保留快速(36 根 K 线)和缓慢(144 根 K 线)半衰期,并依据 LARGER 方差确定仓位规模,避免过时的低波动估计令实际风险翻倍;(3) 下调风险预算:target_ann_vol 0.22 -> 0.18,总敞口上限从 0.45 -> 0.35 的权益。其他一切均未改变:相同的 BTC t 统计量信号、相同的滞后带、相同的 ATR 止损、相同的始终持仓且不设门控的结构、相同的单腿组合(BTC 仅为数据,因此不存在多腿日度-MTM 标记问题),杠杆仍为 1.0。HONEST CAVEAT 给分析师的说明:仓位规模调整对夏普比率和每笔交易百分比优势而言具有尺度不变性,因此这会使报告前后一致、如实反映风险,但无法凭空创造优势。该假设可证伪的主张是 beta 表达腿上的每笔交易 NET 优势;如果一致口径的重跑仍显示夏普比率约为 0,且 avg_trade_return_pct 低于 Bybit 往返交易的 0.11%,就说明该机制被证伪,我会放弃它,而不是调试回看期。
实现
基于 NEARUSDT.BYBIT 2 小时永续合约 K 线的始终持仓单腿多空方向策略。加密市场因子的趋势在 BTCUSDT.BYBIT 上通过 ONLY 衡量(仅用于数据、不交易的额外腿):其约 10 天对数漂移的 t 统计量,除以 EWMA 个 2 小时收益波动率;该 BTC t 统计量的符号在 NEAR 上表达为 ONLY,这是一种约 1.8 beta 的大市值 L1 永续合约。滞回机制(仅在超出 +/-0.25 t 时翻转)使持仓约为 5-8 天,历史 4.94 年内约有 200 次往返交易,而不是在原始零点穿越时发生 741 次来回反复翻转。退出条件:BTC 因子越过相反阈值带,或触发宽幅灾难性止损,止损位为入场 ATR 的 8x(此后该方向保持空仓,直到 BTC 符号改变)。仓位规模仅依据 NEAR 进行波动率目标控制,以重叠的 24 小时对数收益衡量(两个 EWMA 半衰期中,取较大的方差来确定交易规模),总名义敞口上限为权益的 35%,杠杆为 1.0。
验证结果
将状态赋值从谓词中移出:让 should_enter() 只返回方向,并在 on_order_filled 中设置 _side/_entry_px/_entry_atr(或在 cache.positions_open 非空后的首根 K 线上设置),同时仅在入场实际成交后才清除 _block_sign。
should_enter() 将仓位状态作为谓词的副作用而变更:它在订单被确认接受 BEFORE 时设置 self._side、self._entry_px、self._entry_atr,并清除 self._block_sign。如果 position_size() 四舍五入为 0(dropped_size_zero),或基础模板的最小名义金额检查拒绝该入场(在 should_enter 返回后 _process_primary 将其丢弃),则策略误以为持有一个并不存在的仓位,其入场价和入场 ATR 被锚定在一根它从未交易的 K 线上。在回测中这是自愈的(下一根 K 线看到仓位为 None 并重新运行 should_enter,覆盖该状态),且沙盒未显示任何被丢弃的入场,因此行为当前不受影响。在实盘/模拟节点中,订单 REJECT 将留下同样的过期状态,而被清除的 _block_sign 意味着止损后的重新入场锁定被一个从未成为交易的信号所解除。
根据基础逻辑已查到的仓位推导方向——例如在 should_exit() 中读取 cache.positions_open(instrument_id=self.instrument_id)[0].side 并使用其符号;若未找到仓位,则回退到信号。
should_exit() 根据市场信号的符号推断丢失的方向('self._side = 1 if signal >= 0 else -1'),而非根据未平仓头寸推断。如果仓位仍然存在时状态丢失(持仓信息持久化前模拟交易节点重启,或平仓未能在事件内完成),推断的方向可能与真实仓位的方向OPPOSITE,从而使灾难性止损比较('不利方向')反转,既可能抑制真实止损,也可能触发虚假止损,随后还会把错误符号写入 _block_sign。回测中不会发生这种情况(基础处理逻辑会在非条件平仓订单处理中时延后执行,而 _submit_exit 是唯一将 _side 清零的位置),因此这只是实盘路径的稳健性问题。
让优化器联合调整 target_ann_vol/max_notional_frac,或延长快速半衰期并基于非重叠日收益重新估算,以缩小实际波动率与目标波动率之间的差距;降低 max_notional_frac 也能直接减少当前已超过佣金的冲击成本。
迭代-2的风险修正只部分实现了其既定目标:将 target_ann_vol 降至 0.18 后,账簿仍实现了年化波动率 22.2% 和最大回撤 50.3%(CI 24.2-71.3%)。原因有两个结构性因素:(a) 当 NEAR 估算的波动率低于年化约 51% 时,0.35 max_notional_frac上限会生效,因此在平静市场状态下,仓位按上限确定,而非按波动率目标确定(avg_position_pct 18.9% 相对于 35% 上限意味着该上限只会间歇性生效,但快速/缓慢估算器的 max() 刻意偏高,推动仓位变化);(b) 在 36 根 K 线(3天)快速半衰期下,24小时重叠收益EWMA的有效独立观测值很少,因此方差估计噪声较大,且仓位会在入场时固定约8天。这不是正确性缺陷——估算器无偏,算术(var_24h x 365)也正确——但分析人员不应把“目标 18%”理解为实际实现的风险水平。
沙盒涵盖接近完整的历史数据(19,993 根 K 线 / 1,667 天),并非截短的冒烟测试窗口;该机制在此期间的 GROSS 捕获为负:名义金额的 avg_trade_return_pct -0.551%,涉及 182 笔交易;加回佣金($4,048 = 约为平均名义金额 ~$19k 的 0.11%/RT)和冲击成本($5,298 = 约 0.15%/RT)后,毛额仍约为每笔 -0.29%,也就是说,在这些默认设置下,BTC-t 统计量的符号在 NEAR 上没有可测得的预测信息(毛 PF ~0.94,净 PF 0.898,夏普比率 -0.236,夏普比率 CI [-1.18, 0.69],PSR 0.32)。该假设自身可证伪的主张是,beta 表达腿的每笔交易 NET 优势应超过 Bybit 往返交易的 0.11%;在默认设置下,结果约在错误一侧 5x,而开发者已预先承诺,如果一致口径的重跑得到这一结果,就放弃该假设而不调整回看期。给分析师的另外三点说明:(1) 模型化的 IMPACT($5,298)现已EXCEEDS佣金($4,048),是单项最大成本——晋级门槛中的“冲击成本 <= 毛收益的 50%”将成为约束,而降低 max_notional_frac 是显而易见的改进方向;(2) 在一个始终持仓、敞口为 89.3%、持仓约 8 天的组合中,资金费被建模为 NOT(funding_events_available 0,funding_folded 为假)——真实的多空永续合约组合会支付/收取可观的资金费,而本报告完全未计入;(3) 市场状态归因反转了趋势前提(压力状态三分位 -31.0%,夏普比率 -1.01;只有正常状态三分位为正,数值为 +24.2%),且 long_win_rate 27.5% 与做空 40.6% 表明,该假设所追求的幅度主要来自特质 NEAR 方差,而非 BTC 因子。以上均不构成阻碍:这是该参数化的首次运行,优化器尚未运行。
回测评审
- 夏普
- -0.10
- 总收益率
- -29.62%
- 最大回撤
- 50.08%
- 总交易数
- 190
- 胜率
- 35.8%
- 盈利因子
- 0.85
可靠样本:1,720 天内 190 笔交易(2021-10 -> 2026-06),20,626 根主 K 线,metrics_reliable=true,end_unrealized 0.005%(结果完全实现,无 MTM 标题数字)。
交易 DO 实现了该假设:95做多 / 95做空,始终持仓(敞口 89.0%),平均持仓 7天22小时,每月约2次往返交易,按波动率缩放仓位(avg_position_pct 19.3%,名义杠杆约0.15-0.5x)。机制匹配,无偏差。
组合按设计为单腿;已计入资金费 IS(4,521 次,funding_folded=true)。
GROSS 信号失效,而非成本问题:190 笔交易的 price_pnl 合计为 -$24,692(已扣除佣金/冲击成本)。加回 100% 的佣金($3,973)和模型冲击成本($5,139)后,毛收益仍约为 -$15,580,约为每笔交易平均名义敞口 ~$19.0k 的 -0.27%。将所有交易成本设为零也无法让该机制盈利。
avg_trade_return_pct -0.687%,而门槛为 +0.15% BYBIT——与该假设预先注册、可证伪的主张(每笔交易的 NET 优势应超过 0.11% 往返交易成本)相比,结果约错在 6x 的一侧。
多空两侧的毛收益均为负:LONG 价格 PnL 为 -$4,908,SHORT 价格 PnL 为 -$19,783。该假设所追求的 beta 放大效应放大了一个在 NEAR 上没有可测得信息含量的信号,因此对称地放大了亏损。
PF 0.852,夏普比率 -0.097(CI [-1.00, +0.78]),PSR 0.42,total_return -29.6%,CAGR -7.3%,max_drawdown 50.1%,其中有一段 829 天的水下期,连续亏损 14 笔。
6 个日历年中有 2 个为正收益(2022 +7.8%,2023 +19.3%;2024 -25.6%,2025 -16.9%,2026 -20.5%,2021 -4.7%)——亏损年份是最近几年。
市场状态归因与趋势前提相反:压力三分位组 -39.2%(夏普比率 -0.66),平静组 -23.9%;只有正常三分位组为正(+26.2%)。在高波动市场状态下亏损最大、却遵循趋势的因子信号,并未捕捉到趋势。
现在计入资金费后,永续合约始终持仓策略确实面临拖累:整个运行期净资金费为 -$4,935(多头支付 -$6,287),约占总亏损的 17%;对于 89% 敞口的组合,这属于结构性拖累。
集中度:前 5 笔交易盈利 +$64,755,而整个组合总计 -$29,627——其余 185 笔亏损约 $94k。
分析
回测门槛: - 指标不可靠:不一致:夏普比率 0.01 与 total_return -31.40% 的符号不一致——夏普比率是根据mtm_equity_curve序列计算的,而收益来自权益曲线。应以权益曲线为准。
结局总结
只有在表达标的上已证明某种机制能在零成本下实现毛利时,beta 表达这一杠杆才有帮助——与 BTC 的相关性在约 10 天的时间尺度上对方差成立,但对方向符号不成立,因此 NEAR 的特异性成分压过了该因子。
回测审查关卡在优化前给出了放弃结论:问题严重,并非成本所致——价格 PnL 合计为 -$24,692,加回佣金($3,973)和冲击成本($5,139)后,毛收益仍约为 -$15,580(约为平均名义敞口 ~$19.0k 的 -0.27%),多头(-$4,908)和空头(-$19,783)在扣费前都亏损。分析师排除了继续迭代和修订假设,因为将负的毛收益捕获乘以 1.8 只会让结果更差。
将加密市场趋势衡量为 BTCUSDT.BYBIT 约 10 天漂移的 t 统计量,并始终以约 1.8 beta 的 NEARUSDT.BYBIT 2 小时永续合约做多空方向表达其符号;其依据是,在百分比费用不变的情况下,更高的 beta 会提高每笔交易的毛收益捕获。
在 1,720 天、20,626 根 K 线的区间内,共执行了 190 笔交易(做多 95 笔 / 做空 95 笔,平均持仓 7 天 22 小时),实现 -29.62% 的总回报、-7.29% 的 CAGR、夏普比率 -0.097(置信区间 CI -1.00 至 +0.78)、盈利因子 0.852、胜率 35.8%,以及 50.08% 的最大回撤,水下持续 829 天。平均每笔交易收益为名义金额的 -0.687%,相对 +0.15% 下限,在 6 个自然年中仅有 2 年取得正收益。
Stratmill 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。