Rank 213 / large-cap XS momentum × short-leg jump veto

接线状态:connected_runner_live

runner
scripts/run_rank213_largecap_xs_jump_veto_paper_runner.py
runner mode
frozen_admission_timeseries_seed
frozen variant
f64_h12_floor150_mult2p0
最近更新时间
2026-05-06T04:32:21Z
闭合 basket 数
369
平均净收益 / 每笔 3h basket
22.03 bps
累计净收益 / 链式复利
113.4669%
scheduler
momentum-rank213-paper-refresh.service
momentum-rank213-paper-refresh.timer

这页现在锁定的是当前 live 真正在跑的 frozen runtime 定义:它读的是 admission 已冻结的 timeseries seed,用来把 P3 接线显式化;它不是 raw-bar live recomputation。因此本页的“硬定义”以 frozen seed runtime 为准,不拿 rolling research 口径来偷换。

先看证据地图:Rank213 Evidence Map 已把 current runtime、monthly-volume causal history、as-of 修正、live audit、退役证据分层。后续讨论历史有效性时,默认先从这张地图进入。

这两个数字到底怎么算?

一句话:这页里的每一笔,不是单个币、也不是任意时点滚动交易;而是 1 个固定持有 3 小时的 market-neutral basket。当前 frozen live 版每 3 小时 才开一笔新 basket,并持有到 3 小时后 时间退出;这 3 小时里,不做二次换仓、不做持仓内重排
字段当前页面的实际含义当前值
平均净收益 对每笔 closed basket 先算 net_bps = gross_bps - 4.0 × turnover_x,再对全部 closed baskets 做算术平均。所以它表示的是:平均每笔 3h basket 赚多少 bps 22.03 bps / 笔
累计净收益 不是把每笔 bps 直接相加,而是把每笔净收益先转成 net_ret = net_bps / 10000,然后按 ∏(1 + net_ret) - 1链式复利。所以它表示的是:按这批 closed baskets 顺序连续滚下去后的累计净值变化 113.4669%
闭合 basket 数 当前累计纳入统计的 closed baskets 数量;每一笔都对应 1 次 3h 非重叠持有 369
持有时间 固定 HOLD_BARS = 1215m bar,即 3 小时;持有窗内不再二次开新 basket。 3h

为什么每笔只有 22.03 bps,却还能滚到 113.4669%?

核心不是“单笔很大”,而是“单笔期望为正 × 频率很高 × 连续复利”。这页是 369 笔、约 8.00 笔/天、每笔持有 3h 的非重叠 basket,不是一天只做 1 笔。
拆解项当前值它说明什么
每笔平均净收益22.03 bps = 0.2203%单笔看起来不大,但因为频次高,可以被复利放大。
总笔数36946.12 天里大约做了 369 次 3h basket。
如果“每笔都刚好等于均值”125.2563%这只是一个均值复利的直觉参考,不是实际路径。
实际 realized cumulative113.4669%真实路径比“均值机械复利”略低,说明中间有波动拖累(volatility drag)。
单笔收益中位数6.93 bps说明平均值会被一部分大赢单往上拉;典型一笔并没有均值那么高。
单笔离散度std = 172.03 bps分布很宽,不能把均值误读成“每笔都稳定赚 22bps”。
最好 / 最差一笔880.14 / -523.28 bps尾部分布很重;大赢单对最终复利贡献不小。
非正收益占比46.07%接近一半的单子并不赚钱,所以这个结果绝不是“几乎单单都赢”。

样本窗口到底是哪一段?

窗口含义当前值
sample_start_utc原始 frozen panel 的起点;它包含 formation warm-up,不等于第一笔交易时间。2026-02-09T10:15:00Z
sample_end_utc原始 frozen panel 的终点。2026-03-28T07:00:00Z
first_trade_entry_ts第一笔真正纳入统计的 basket 开仓时点。2026-02-10T02:15:00Z
last_trade_exit_ts最后一笔真正纳入统计的 basket 平仓时点。2026-03-28T05:15:00Z
raw_panel_days底层 frozen panel 覆盖天数。46.86
trade_window_days真正有 basket 统计的交易窗口天数。46.12
trades_per_day平均每天多少笔 closed baskets;当前 frozen 版应该接近每 3h 一笔,也就是约 8 笔/天。8.00 笔/天

注意:sample_start_utc 是原始面板起点,不是第一笔交易起点。因为策略先要看 64 × 15m = 16h 的 formation window,所以第一笔 basket 会比 panel 起点晚一个 formation 窗。

持仓 3 小时期间,能不能再交易?

先把口径钉死:这页采用哪一版定义?

结论:本页采用 当前 live frozen spec 作为唯一 runtime 定义:15m bar,formation=64hold=12每 3h 非重叠换仓一次。formal/as-of 页面虽然使用同一套核心公式,但 cadence 是 每 15m rolling,不能在这页伪装成“当前 live runtime 也是 rolling 15m”。
页面 / 运行面核心公式cadence这里能不能说成当前 live runtime
213a_paper_runner.html 同一套 baseline + short-leg jump veto 每 3h 非重叠一次(UTC 02:15 / 05:15 / ... 可以;这是当前 frozen seed live/paper lane
rank213_largecap_xs_jump_veto_shadow_runner 同一套 baseline + short-leg jump veto + formal frozen gate 每 15m raw-bar 审计刷新;当前实现口径是 recompute_recent 不可以;这是 shadow / audit lane,用来暴露最新决策与 gate 状态,不是当前 live execution lane
formal_strategy_review / asof_universe_long_history_review 同一套 baseline + short-leg jump veto 每 15m rolling 重算一次 不可以;这是 research / formal evidence 口径,不是当前 live runtime cadence

标的选择 / Universe 更新:这页现在把口径拆开讲清楚

关键统一:讨论长周期时,不能把“固定某一时刻的 Top30”直接当成“历史滚动 Top30”。当前 rank213 相关文件里,至少有 4 种证据面;其中只有 monthly_volume_universe_rebuild 接近“按时间滚动重选 Top30”。
页面 / 证据面名单会不会更新它到底怎么选池样本覆盖结果摘要你该怎么理解
当前 live/paper runner 不会 固定读取 admission 冻结的 30 币名单;refresh 只更新新 signal / ledger,不按月或按季度重选 Top30。 2026-02-09T10:15:00Z2026-03-28T07:00:00Z 113.4669%369 笔) 这才是当前真正跑着的口径;但它不是历史滚动 Top30 证据。
frozen current-universe historical recompute 不会 还是同一份 frozen 30 币名单;只是把当前名单往历史上硬回放。 2025-10-24T08:30:00Z2026-04-10T23:45:00Z MAX 166.7185%;120D 121.8618% 能回答“当前 frozen 名单最近共同历史怎样”,不能回答“历史上是否该滚动换池”。
asof_universe_long_history_review 不按 Top30 重选 仍是 frozen 30 币种子名单;只是名字会在各自 onboard 之后 才参与排名,所以是“按上线时间可见”,不是“按历史市值滚动换池”。 2020-02-01T00:00:00Z2026-04-10T18:00:00Z;平均可交易 universe 18.45 全周期 veto -89.9796% 它解决的是“后上市名字不能穿越历史提前参赛”;但仍不是你说的“每月/每段时间滚动 Top30”。
formal_strategy_review 不按 Top30 重选 名单逻辑继承 asof_universe:仍是 frozen 30 币 + onboard 可见性;区别只是再叠加 frozen regime gate。 2020-02-01T00:00:00Z2026-04-10T18:00:00Z;gate ON rate 5.04% baseline+veto+gate 全周期 100.7246% 这是当前最强的 formal 证据面,但它也不是历史滚动市值 Top30 回测。
monthly_volume_universe_rebuild 会(月度重建) 按月用 volume-proxy 重建 as-of universe;这是当前文件里最接近“历史滚动 Top30”的证据面。 2020-02-01T00:00:00Z2026-04-10T18:00:00Z;与 frozen30 平均重叠 12.37/30 baseline+veto+gate 全周期 -37.1264% 如果你要问“历史上不固定某一时刻 Top30,滚动换池以后还行不行?”,当前最应该看的就是这一行。

最终裁决卡:这几条证据到底该怎么用

先给最终版人话:如果你问“现在实际跑的是什么”,答案看 当前 live/paper runner;如果你问“历史上滚动换池以后还站不站得住”,当前优先看 monthly_volume_universe_rebuild;如果你问“同一 frozen 名单 最近共同历史怎样”,看 frozen current-universe historical recompute;如果你问“后上市币不要穿越参赛 后会怎样”,看 asof_universe_long_history_review
你真正想回答的问题默认应看哪条证据一句话裁决
当前 live/paper 到底是不是会定期更新 Top30? 当前 live/paper runner 不会。 当前运行口径是 frozen admission 30-symbol universe,不做 monthly/quarterly rebuild。
同一份 frozen30 名单,最近共同历史表现怎样? frozen current-universe historical recompute 近期共同历史是强的,但它只是在回答“当前名单往回推”这一题,不是在回答历史滚动换池。
把未上市币穿越问题修掉以后,这策略还怎样? asof_universe_long_history_review as-of 修正后,全周期 veto 是负的-89.9796%);所以不能再把 as-of 读成“已经证明长期稳定赚钱”。
如果真的按时间滚动换池,而不是固定某一刻 Top30,会怎样? monthly_volume_universe_rebuild 不支持强结论:当前最接近滚动换池的 full-period baseline+veto+gate-37.1264%,远弱于 formal 页那条 100.7246%

如果按“月度重构 universe”口径看,过去 5~6 年曲线长什么样?

先直接回答你的问题:按当前 monthly_volume_universe_rebuildbaseline+veto+gate 口径,样本从 2020-02-01T00:00:00Z2026-04-10T18:00:00Z,约 6.19 年 / 75 个自然月,full-period 累计净收益是 -37.1264%。严格说,这不是“整整 6 年固定历史市值真值回测”,而是 volume-proxy 月度重建 下的最好现有近似证据面。
手续费口径也可以钉死:这里不是 5/10000 单边。当前代码/产物的净收益口径等价于 net = gross - 4.0bps × turnover_x。也就是说:当 turnover_x = 1.0 时,按的是 4.0 bps round-trip,等价于大约 2.0 bps / 10000 每边;不是 5 bps/10000。如果某笔因为 veto refill 导致 turnover_x > 1,成本会按这个 turnover 比例继续放大。
这条曲线非常不“顺滑上行”:按月末口径看,3 个盈利月、8 个亏损月、64 个持平月。也就是说,这 5~6 年不是“每个月都赚”,而是 绝大多数月份 gate 根本没开、月收益为 0,收益主要集中在少数开启月份里。注意:full-period 里的月内路径最大回撤仍有 -48.6289%,所以月末曲线会比真实 3h-basket 路径更平。
月度重构口径:month-end equity curve(上) + calendar-month return bars(下) -43.2%-29.2%-15.2%-1.3%12.7% 0% -37.13% 2020-022021-012022-012023-012024-012025-012026-012026-04 累计净收益(month-end chain) 月度盈利 月度亏损 月度持平 / gate off
月度重构口径的关键问题当前答案
过去 5~6 年 total return 到底是多少?不是 11.7%。 当前 full-period baseline+veto+gate-37.1264%
是不是每个月都盈利?不是。 当前月末口径下是 3 个盈利月、8 个亏损月、64 个持平月。
最好 / 最差月分别是哪一个?最好月是 2023-11,月度链式收益 8.5761%;最差月是 2025-04,收益 -13.7769%
为什么月度曲线看起来这么平?因为这条线的 gate_on_rate 只有 3.5440%;绝大部分 3h rebalance 都被 gate 关掉了,所以月末大多是 0 变化。

按年拆开看(月度重构 × baseline+veto+gate)

年份全年累计收益盈利月数亏损月数持平月数gate-on baskets
20200.0000%00110
20210.0000%00120
20220.0000%00120
20238.5761%101167
20240.2665%11107
2025-37.3832%057469
2026-7.7667%12198

策略逻辑解释卡片:它到底怎么选币?

下面这张卡片只讲 当前 frozen live spec。不说“高/低”,直接说计算过程:

  1. 固定 universe:当前 frozen 版直接读取 admission summary 里的固定 30 币名单;refresh 时不按月/按季度重选 Top30。所以这页讲的是“当前运行口径”,不是“历史滚动 Top30”口径。
  2. bar 粒度:用 15m K 线。
  3. formation window:往前看 6415m bar,也就是 16h
  4. baseline score:对每个币取 formation window 的首尾 close,按 cumret = close[-1] / close[0] - 1 算过去 16h 累计收益。
  5. 横截面排序:把 universe 里所有币按 cumret 从低到高排序;top-3 做多bottom-3 先作为 plain short 候选
  6. short-leg jump veto:只检查 plain short 候选。对每个 short 候选,在同一个 formation window 里算它的 max 15m up-bar;再算同一时点全市场的 median(max-up-bar)。阈值固定为 max(1.5%, 2.0 × median(max-up-bar))
  7. 如果某个 plain short 候选的 max-up-bar 超过该阈值,就 veto;然后从后续 loser rank 里往下补,直到 short leg 补满 3 个名字。
  8. 最终执行:long = plain_longsshort = veto_shorts;持有 1215m bar,也就是 3h 后时间退出。

成本口径也锁死:net_bps = gross_bps - 4.0 × turnover_x。这页上的 live/paper 指标都是按这个 frozen 成本口径记,不额外夹带别的 fee 假设。

假数据示例:plain short 怎样被 veto,short 名额怎样 refill?

下面用一组假数据,把代码里的实际流程一步一步画出来。注意这里只是为了解释机制,不是当前真实持仓。

formation = 64 × 15m = 16h;按首尾 close 算 cumret 阈值 = max(1.5%, 2.0 × 全市场 median(max-up-bar)) = max(1.5%, 2.0 × 1.6%) = 3.2% ALPHA +12.4% BETA +9.1% GAMMA +5.6% top-3 → long top-3 → long top-3 → long DELTA -4.2% refill 候选 EPSILON -7.8% bottom-3;1.4% ≤ 3.2% → 保留 OMEGA -11.2% bottom-3;1.1% ≤ 3.2% → 保留 PHI -9.5% bottom-3;3.9% > 3.2% → veto 最终执行篮子 long = ALPHA,BETA,GAMMA short = OMEGA,EPSILON,DELTA
symbol过去 16h cumretformation 窗内 max 15m up-bar在这一步的角色为什么
ALPHA+12.4%1.0%long过去 16h 最强,进 top-3 long
BETA+9.1%1.4%long过去 16h 第二强,进 top-3 long
GAMMA+5.6%1.8%long过去 16h 第三强,进 top-3 long
DELTA-4.2%1.3%refill short原本不是 bottom-3,但因为 veto refill 被补进 short
EPSILON-7.8%1.4%plain shortbottom-3 loser,且 max-up-bar 未超阈值
PHI-9.5%3.9%vetoedbottom-3 loser,但 16h 内出现异常 15m 上冲,被 veto
OMEGA-11.2%1.1%plain short最弱 loser,进入 short

更长周期:我们现在到底有什么数据?

先把边界说清楚:当前 frozen current-universe 的同口径检查里,公共共同历史最多只到 168.64 天(2025-10-24T08:30:00Z2026-04-10T23:45:00Z)。所以 120D 可以算;但 180D / 360D 不能在同一 frozen current-universe 口径下硬算
窗口是否可用覆盖区间rebalancesmean net bpscum return备注
MAX AVAILABLE yes 2025-10-24T08:30:00Z2026-04-10T23:45:00Z 1343 8.96 166.7185% 这是当前 frozen current-universe 同 spec 的最大可用共同历史
120Dyes2025-12-11T21:30:00Z2026-04-10T21:30:00Z9609.96121.8618%同口径 frozen current-universe historical recompute
180Dnocommon-history shorter than requested window under frozen universe(可用共同历史约 167.88 天)
360Dnocommon-history shorter than requested window under frozen universe(可用共同历史约 167.88 天)

把公式和代码一一对上

概念这页的硬定义对应代码实现
formation 窗过去 6415m bar(16hclose_window = panel[eligible].iloc[i - FORMATION_BARS:i + 1]
baseline scorecumret = close[-1] / close[0] - 1cumret = close_window.iloc[-1] / close_window.iloc[0] - 1.0
做多名单cumret 排名的 top-3longs = rank.index[-TOP_N:].tolist()[::-1]
plain short 候选cumret 排名的 bottom-3plain_shorts = rank.index[:BOTTOM_N].tolist()
jump veto 统计量formation 窗内 max 15m up-barshort_info = [(sym, float(hist[sym].max())) ...]
veto 阈值max(1.5%, 2.0 × median(max-up-bar))veto_threshold = max(VETO_FLOOR, VETO_MULT * universe_med)
refill被 veto 后,从后续 loser rank 继续往下补refill = [sym for sym in rank.index if sym not in longs and sym not in plain_shorts]
最终执行 shortveto_shortsshorts = veto_shorts / frozen seed 对应 variant_timeseries.csv.veto_shorts
退出持有 1215m bar = 3hexit_ts = timestamp + 12 × 15m
成本4.0 bps × turnover_xnet_bps = gross_bps - 4.0 × turnover_x

regime 快照(来自 regime_review)

gate 到底是不是同一套?什么时候会开?

先给结论:当前网页、formal 5~6 年回测、monthly rebuild、以及最新 shadow decision 用的,都是同一套 frozen regime_gate_v1;并且现在统一成 causal / live-aligned 口径:最近 30 天滚动窗口,按 3 条规则投票;只要 votes >= ceil(valid_rules × 0.67)ON,否则 OFF。OFF 时不是反手,而是 flat
gate 变量阈值它在看什么
veto_active_rate≥ 0.3401最近30天里,有 short-leg jump veto 触发的 rebalance 占比;越高说明 loser 端更常出现‘先猛冲再转弱’的异常挤兑/离散环境。
xs_dispersion_bps≥ 379.5133最近30天横截面离散度(universe dispersion);越高说明强弱分化更明显,cross-sectional long-short 更有施展空间。
ls_divergence_bps≥ 5.0783最近30天 long leg 与 veto-short leg 的平均表现差;越高说明多空两边确实在拉开,而不是只有单边噪声。

当前这两层“ON”要分开看

观察面窗口 / bar当前状态你该怎么读
formal current gate snapshot 2026-03-11T18:00:00Z2026-04-10T18:00:00Z ON3/3,阈值 3 这是和长期 formal 回测同定义的一层,并且明确按 causal/live-aligned 方式计算。
latest raw-bar shadow decision 2026-05-06T04:15:00Z OFF2/3,阈值 3 这是最新实时 decision bar;现在 preview 行也会带上过去 30 天已实现样本,不再因为“当前这笔未走完”而丢第三条规则。

formal 当前窗口,三条规则具体过没过?

变量当前值阈值是否通过是否有效
veto_active_rate0.81740.3401passyes
xs_dispersion_bps811.5763379.5133passyes
ls_divergence_bps20.46275.0783passyes
人话版:当前不只是“运气好,刚好碰到 gate 开着”。从 formal 当前窗口看,三条指标都明显高过阈值:更像是横截面分化、veto 活跃度、多空分化同时处于强区间,所以 gate 打开。
这次把 shadow / formal / monthly rebuild 的 gate 口径统一成 causal 版了。
计算模式:causal_live_aligned
规则口径:veto/xs features use decision-time-observable data; ls_divergence only uses rows whose exit_ts was already realized by that decision time.
再把 shadow 运行态说人话:当前 raw-bar shadow 审计 lane 的 source_moderecompute_recent(frame=recompute_recent);当前 tail 关注窗 14 天。这表示它现在会优先沿用已有 recent ledger,只重刷尾部 overlap + 最新 live row,而不是每次都把整段最近窗口从零重算。
但也要诚实:这还不是最极致的“单 bar append/drop、全程 O(1) ledger 更新”;更准确的叫法是 incremental tail refresh。当前页面把它当作 shadow / audit lane,不是 live execution lane。

相关审计页

evidence_map(推荐先看) · honesty_audit(seed causality) · ffill_impact_audit · readiness_note · funding-adjusted long-history · asof_universe_long_history_review · regime_review · formal_strategy_review · fee_sensitivity_review · monthly_volume_universe_rebuild · monthly_volume_percentile_gate_review · universe_selection_audit · family_operating_board

最新一笔信号快照

{
  "entry_ts": "2026-03-28T02:15:00Z",
  "exit_ts": "2026-03-28T05:15:00Z",
  "gross_bps": 886.804320820116,
  "net_bps": 880.1376541534494,
  "turnover_x": 1.6666666666666663,
  "veto_count": 2,
  "longs": [
    "ONUSDT",
    "SIRENUSDT",
    "PIPPINUSDT"
  ],
  "shorts": [
    "STGUSDT",
    "KNCUSDT",
    "WLDUSDT"
  ]
}