策略
基于成交量时钟(等额成交额 K 线)的时间序列动量,交易 XRPUSDT.BINANCE USD-M — 对行情重新采样,使每根 K 线包含相同的 SAME成交额,然后在该时钟上取过去动量的符号;始终持有多空仓位,绝不空仓,纯 OHLCV,无门槛,无额外数据流
结局: 已放弃
XrpDollarBarClockTimeSeriesMomentumLS
结局总结
该策略唯一新颖的主张在于时钟:将 XRPUSDT 的 15 分钟行情重构为等美元价值 K 线,阈值采用滚动的 30 天自适应值,并以过去 72 根 K 线的收益符号作为始终持仓的多头/空头头寸。实现干净,交易也符合论点(1,368 次往返交易,667 次多头 / 701 次空头,持仓约 1d18h),但结果是账户被清算:总回报 -100%,夏普比率 -0.457,利润因子 0.866,平均每笔交易回报 0.0789%,未达到交易场所底线 0.15%。关键在于亏损是毛亏损——价格 PnL 为 -$94,956,尚未扣除 $45,120 佣金或 -$9,998 资金费用;而且 7 年中有 6 年亏损,多空两侧皆然,因此任何成本调优都救不了它。分析师在回测审查时、优化之前就放弃了该策略,并指出成交量时钟已经退化成带有抖动的约 4H 日历时钟,这意味着假设中唯一新增的变量已被证伪,而非仅仅未经测试。
假设
该假设唯一的创新变量是 CLOCK,因此其余都是普通的 TSMOM 形态:滞后收益的符号、逆波动率仓位、反转即反向。美元K线在 calculate_signal 中增量构建(运行中的日内成交量累计、进行中的 OHLC 累加器、带 maxlen 的有界双端队列),因此每根K线的成本为 O(1) 且独立于回测跨度;唯一非 O(1) 的工作是每次发射时计算 72 个元素的标准差(每天约 6 次)以及每 UTC 天一次的 30 个元素的中位数。V* 仅使用 COMPLETED 个滞后 UTC 天的数据,且从不使用进行中的当日,因此不存在前瞻偏差;发射在 min_history_days=3 个完整日之后开始。年化使用测得的合成K线平均时长,正如假设所规定,而非假定的 4 小时。leverage=1.5 通过 min(lev_max, self.config.leverage) 接入到 position_size,因此保证金上限与策略内的名义值一致。每个仓位的状态(滞后极值、方向、止损标志、再入场阻塞)以普通标量保存,因此模拟重启无法重新锚定它。在真实的 209 天沙盒窗口(20,064 XRPUSDT 15 分钟K线)上试运行:发射了 1,508 根合成K线(每天 7.2 根,对照 6 目标),信号连续,在 [-0.22, +0.31] 区间内有 1,436 个不同值,82 次动量符号翻转 -> 窗口内大约 90-170 次往返交易,挂钟时间 0.9 秒(完整 235 千根K线历史约 11 秒),因此零交易门限与 300 秒超时门限均无风险。一点保留意见,按范围规则陈述但仍按规定实现:在无死区的情况下,原始过零翻转约每 2.5 天一次,即每年约 290 次往返交易,每年约 0.29 的名义值支付吃单费用,因此每笔交易的边际收益必须在约 2.5 天的持仓期内超过 0.10%;若毛信号为正而净信号为负,则在动量符号上设置小滞回带(或采用更长的 L)显然是第一轮迭代最直接的杠杆点。
在可靠的 1,368 笔交易样本上,abandon_class=negative_expectancy,而且明确是 GROSS 信号失效——去掉 100% 的佣金和资金费用后,在 $100k 资金上仍亏损 -$95k;QA 的反转判断在完整历史上得到确认,成交量时钟则退化为带抖动的 4H 日历时钟(每天约 7.2 根合成 K 线),因此唯一的新变量本身已被证伪,而非未经检验。
实现
在 XRPUSDT.BINANCE USD-M 永续合约上,以TRANSACTION时间而非日历时间衡量的始终持仓多空时间序列动量。每根 15 分钟 K 线的美元成交量(成交量 × 收盘价)都会累积到合成“美元 K 线”中;当成交价值达到阈值 V* 时,该 K 线收盘;溢出量结转,合成 K 线的OHLC涵盖所消耗的 15m K 线。V* 严格采用过去数据且自适应:每个 UTC 日的第一根 K 线上,将其重置为(此前 30 个已完成的 UTC日的每日美元成交量中位数)/ bars_per_day_target(6),因此在 XRP 的成交额增长十倍的样本期间,该时钟仍能在 MEDIAN 活跃度下每天生成约 6 根 K 线;价格重估突发时几分钟内即可完成,行情沉寂时则需一天以上。信号是最近 L=72 根合成 K 线的滚动对数收益(按中位数活跃度约为 10-12 天),每根 K 线都原样输出;仓位 = sign(signal),信号为正时做多,为负时做空;策略选择永不空仓。仓位按反波动率调整:最近 72 根合成 K 线对数收益的标准差,以这些 K 线实测的MEASURED平均日历时长年化,名义敞口 = equity * clamp(0.20 / vol_ann, 0.25, 1.5),并进一步设限,使吊灯止损的风险最多为权益的 30%。退出方式是动量方向翻转时反向交易,另设吊灯止损,从有利极值回撤 4 x ATR(20 根合成 K 线),以限制尾部风险;止损后订单簿保持空仓,直到成交量时钟再次跳动。纯 OHLCV,单腿,无辅助数据流,无行情状态过滤。
验证结果
将 target_vol 调高至接近该品种自身的波动率水平(0.35-0.50),或将 lev_min 降至约 0.10,使反波动率项真正发挥作用,并让优化器搜索该参数(_param_bounds 已涵盖两者)。报告钳制条件生效的 K 线比例。
该品种上的反波动率仓位规模大部分时间都被钳制机制抵消。target_vol=0.20,而永续合约实现波动率为 XRP(通常年化为 0.55-1.00),得到 0.20/vol = 0.20-0.36,在样本的大部分时间里不高于 lev_min=0.25,因此“反波动率”机制在其本应降低风险的高波动率阶段退化成近乎恒定的 0.25x 名义敞口。沙盒结果也印证了这一点:策略为 annualized_volatility 23.1% 时,avg_position_pct 42.3%,因此钳制条件在很大一部分时间里生效。假设中写明的 clamp(0.20/vol, 0.25, 1.5) 已忠实实现,所以这是参数现实性方面的说明,并非实现不匹配。
加入动量死区(仅当 |signal| > k * stdev(signal) 时才翻仓,在区间内维持此前头寸)或延长 L。这两种做法成本都低,并且直接针对 14.4% 佣金占毛收益的比例这一数据。开发者已在配置理由中将此列为首个迭代杠杆。
在始终持仓的组合中,动量符号原始零交叉没有滞后机制/死区。开发者自己的干跑测得 209 天内发生 82 次符号翻转(约每 2.5 天翻转一次),沙盒中产生了 84 次往返交易,佣金占毛 PnL 的 14.41%。每次翻转都要支付完整的吃单往返成本(约为名义金额的 0.10%),另加冲击成本(沙盒中模拟为 $4,013,与 $3,196 佣金相当),因此在持仓 2.3 天的情况下,每笔交易的毛收益优势必须超过名义金额的约 0.15-0.20% 才能盈亏平衡。按观察到的波动率,XRP 上的 2.3 天走势约为 1.5-2%,所以从算术上说并非不可能,但成本负担是主导因素。
无需更改代码。记录此项是为了避免回测审查将六项绿色合成测试误读为信号路径已得到检验的证据;全历史回测才是对该时钟的首次真实检验。
第 2 层对信号逻辑的覆盖率为零:六种合成情景中的信号在全部 481 根 K 线上都精确保持冻结在 0.0。这是预期且正确的行为(min_history_days=3 个已完成的 UTC 日后 V* 才存在,而在 _ready 之前还需以每天约 6-7 根的速度生成 73 根合成 K 线,也就是约 1,100-1,400 根 15m K 线的预热期,而提供的数据只有 481),策略在未就绪时也正确地拒绝交易。但这意味着合成测试套件除了验证“不会崩溃”外什么也没验证;时钟、动量、ATR 和止损的唯一功能性证据,来自单次 209 日沙盒运行。
可选:按 (ts_ns - 1) // _NS_PER_DAY 分桶,使带收盘时间戳的 K 线归属到其实际成交的日期。除非完整历史回测显示 V* 在已知 XRPUSDT 停运期间大幅跳变,否则保持现有的缺口处理方式。
每日美元成交额记账会跳过缺口,而不是用零填充:_roll_calendar_day 每次观测到日期转换时最多追加一条记录,并且仅当 _cur_day_dv > 0 时才追加,因此多日数据中断只会在滚动-30中位数窗口中计为一天,而不是经过的天数。此外,由于 K 线时间戳标记在收盘时刻,23:45-00:00 K 线带有 ts == 00:00,属于次日,并会被归入次日。两者都不会引入前视偏差(V* 严格基于此前的 COMPLETED 天构建,且 _refresh_vstar 在加入当前 K 线的 dv 之前运行),并且它们对中位数的影响都很小。
Sandbox 形态属于动量前提失效,据我所验证并非极性 bug,但分析师在投入优化之前应在完整历史数据上进行确认。84 笔往返 / 209 天:PF 0.479,win_rate 29.8%,avg_win $887 对 avg_loss $786(盈亏比 1.13)。一个胜率为 30% 的趋势跟踪策略需要盈亏比远大于 1;在 1.13 时,期望值在结构上为负,而该账本的 MIRROR(胜率 70%,盈亏比 0.88)原本大致会产生约 +$283/笔。这就是 L125 形态。我已核查代码极性,按假设其写法是正确的(当 log(C_t/C_{t-72}) > 0 时做多),且亏损是双向的(多头胜 28.6%,空头胜 31.0%),因此这并非符号翻转缺陷——它在该特定 209 天窗口期内 XRP 上约 12 中位天数的交易时间尺度上,呈现为真实的均值回归。回测复盘时有两点需要核查:(1) 在 $3,196 手续费(14.41% 的毛收入)与 $4,013 的建模冲击之前,GROSS 的价格 PnL 是否为正——仅手续费就约占净亏损的 1.5x,因此换手率可能就是全部原因;(2) 成交量时钟是否在做日历时钟做不到的事——空跑发出了 7.2 条/天的合成 bar,目标为 6 条,即中位跨度约 3.3 小时,因此该时钟唯一的真实作用是在重新定价爆发期压缩 bar。若等价的日历时间 4 小时 TSMOM 具有相同的符号与近似的 PF,则该假设中唯一的新变量毫无贡献,在 L/死区上的迭代只是在重新调优一个死机制。换手率是一阶经济风险:在 ~1.0-1.5x 名义规模上,以 0.10% 的 taker 往返费率进行 ~147 笔往返/年,在任何优势之前费用约为权益的 15-22%/年。
回测评审
- 夏普
- -0.46
- 总收益率
- -100.00%
- 最大回撤
- 100.00%
- 总交易数
- 1368
- 胜率
- 31.1%
- 盈利因子
- 0.87
清晰、确定性的成交量时钟实现(自适应滚动 V*,无前视偏差,使用测得的 K 线持续时间进行年化)
大型且可靠的样本:2,414 天 / 231,903 根 K 线上共有 1,368 次往返交易
交易与假设一致(始终持仓,667 做多 / 701 做空,持仓约 1d18h)——并非机制不匹配
账户 LIQUIDATED:权益 0 来自 2023-07,total_return -100%,max_drawdown 100%
GROSS 失败:合计 price_pnl = -$94,956,BEFORE $45,120 佣金,另有 -$9,998 资金费用;毛收益均值 -0.172%/笔交易,中位数 -0.93%,t = -0.98
夏普比率 -0.457,PF 0.866,每笔交易期望收益 -$77,在收益风险比为 1.92 时 win_rate 0.311
avg_trade_return_pct 0.0789% 相对于 0.15% BINANCE 下限
7 年中有 6 年毛收益为负(仅 2020 年为正);亏损是双向的(SHORT -$86.3k,LONG -$8.7k 毛收益)
仓位规模没有权益下限 — 随着权益崩塌,名义/权益达到 694x,将原本的亏损优势转化为彻底归零
结局总结
一个校准为每天约 6 根K线的自适应等量成交额时钟,再现了约 4 小时的日历时钟,而非改变采样本身,因此未来迭代必须既验证该时钟确实与日历时间不同,又为仓位规模加入权益下限 — 随着权益崩塌,名义/权益达到 694x,将原本的亏损优势转化为彻底清零。
分析师的回测审查结论是在优化前关卡放弃(abandon_class=negative_expectancy),因此优化、优化后的分析师阶段和风险审查都没有运行。决定性依据是可靠的 1,368 笔交易样本呈现负毛收益优势,以及成交量时钟退化为带抖动的约 4H 日历时钟(每天约 7.2 根合成 K 线);这证伪了唯一的新变量,而不是将其留待检验。
将 XRPUSDT.BINANCE 根 USD-M 15m K 线重采样为等美元成交量(交易时间)合成 K 线,采用自适应日阈值;随后基于滚动 72 根 K 线对数收益的方向,运行始终持仓的多空时间序列动量策略,按反波动率调整规模,并设置 4x ATR 吊灯尾部止损。
在 1,281 个数据日和 231,903 根 bar 上,产生了 1,368 笔往返(667 笔多头 / 701 笔空头,平均持仓约 1 天 17 小时),总回报为 -100%(账户被强平 2025-11-10),夏普 -0.457,盈亏比 0.866,胜率 31.1%,期望值 -76.72 美元/笔,在 0.15% BINANCE 下限之上的 avg_trade_return_pct 的 0.0789%。回测复盘发现,该失败属于毛收入层面,而非成本驱动:在 $45,120 手续费与 -$9,998 资金费之前,汇总价格 PnL 为 -$94,956,7 年中有 6 年亏损,且两侧均亏损(空头毛亏 -$86.3 k,多头毛亏 -$8.7 k)。
Stratmill 是研究与模拟交易工具,不提供财务建议,也不是经纪商。回测与模拟结果均为假设性结果。交易存在亏损风险。