Files
PythagorasGoal/docs/diary/2026-06-10-xs01-dispersion-gate.md
T

2.7 KiB
Raw Blame History

2026-06-10 — XS01 dispersion-gate: PROMOSSO e LIVE (entry solo con dispersione da fare rientrare)

Domanda

L'edge di XS01 (reversione cross-sectional 8 asset) era concentrato (2025 domina, 2023 quasi piatto) e cost-sensitive. La reversione cross-sezionale va accesa solo quando c'e' dispersione da far rientrare?

Metodo (anti multiple-testing): scripts/analysis/xs01_dispersion_gate.py

3 feature di regime CAUSALI calcolate dallo stesso panel closes (nessun feed esterno): g_disp = std cross-section del momentum lb (la grandezza che si fada), g_corr = correlazione media pairwise 72h (identita' della varianza dell'indice), g_vol = vol BTC 168h. Diagnostica per quintili (quintili dal TRAIN, 70/30) sul net per-trade dell'engine canonico NON gateato, TRAIN e OOS separati: si procede solo con relazione monotona e concorde nelle due finestre.

Esito diagnostica

  • g_disp: monotona e concorde — Q1 NEGATIVO (10 bps TRAIN / 8 OOS) → Q5 +26/+280. Senza dispersione i trade sono solo fee. PROMOSSA.
  • g_corr e g_vol: non monotone / segno incoerente → BOCCIATE (niente fishing).

Gate (sweep soglie = percentili TRAIN, side dal TRAIN)

Plateau pieno p30-p70, niente picco: TRAIN Sh 1.51 → 2.0-2.3, OOS Sh 5.73 → 6.2-7.5. Scelta p50 (disp_min = 0.0313), ~47% delle ore aperte:

  • Standalone: trade 1427→859 (40% turnover → meta' fee), win 50→53%, Sharpe 2.50→3.46, DD 16.2→15.8%. Ogni anno migliora: 2022 +34→+40, 2023 +6→+28, 2024 +21→+44, 2025 +225→+237, 2026 +85→+108 — risolve la concentrazione, il punto debole della validazione originale.
  • Fee stress 2x (0.20% RT/book): OOS Sh 6.76 — la cost-sensitivity e' mitigata (il gate taglia proprio i trade che pagavano fee senza edge).
  • Gate PORT06 (swap equity sleeve): FULL Sh 7.34→7.41 DD pari, OOS Sh 10.07→10.37 DD 1.48→1.47 → PROMOSSO (criterio standard).

Implementazione (solo path LIVE, come trend/hurst sulle fade)

  • src/live/xsec_worker.py: param opzionale disp_min (None = off), check in _open_book su nanstd(logC[i] logC[ilb]). Default off → la validazione validate_xsec_worker (replay == backtest) resta esatta.
  • src/portfolio/runner.py: pass-through di disp_min (il runner costruiva il dict params esplicitamente e l'avrebbe perso).
  • scripts/portfolios/_defs.py: disp_min: 0.0313 nella spec XS01.
  • Il backtest canonico (build_everything) resta NON filtrato → il live fara' meglio del backtest, coerente con le altre guardie.

Unit check: gate blocca panel piatto / apre panel disperso / default off invariato. 99/99 test. Nota macro della giornata: FC01 funding-carry SCARTATA (diario separato) — il protocollo promuove ~1 idea su molte, come deve.