Ondata onesta su angoli non coperti: funding-TS (chiude il filone funding su 3 lati), breadth alt (non-ridondante ma DSR 0.43, rivisitabile con storia), XS-residmom (REDUNDANT), pesi+guardia-DD (EW-STR refutato dallo scettico come selezione-sull'hold-out di 2° ordine, firma best-of-15), VRP-refine (filone esaurito), stagionalità-XS (morta allo step statistico). Lezione codificata: weights_tilt_null + combine_outer in src/portfolio (ogni cambio-pesi vs null di tilt casuali cap-respecting + delta in-sample>=0); 5 test nuovi, suite 165/165. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
4.1 KiB
2026-07-01 — Stagionalità CROSS-SECTIONAL sull'universo Hyperliquid → SCARTATO
Ipotesi
Effetti calendario relativi tra i 19 alt major HL (weekday tilt, turn-of-month,
pattern weekend→lunedì nel cross-section), long/short market-neutral. L'angolo è diverso
dal prior art già morto (trackF seasonality BTC/ETH = buy&hold travestito;
crypto_weekend_signal/overnight = look-ahead; open_drive = artefatto calendario ucciso da
day_boundary_robust): essendo il segnale demeaned cross-section, il buy&hold
travestito è strutturalmente escluso… in prima battuta (vedi diagnostica beta sotto).
Metodo (test statistico PRIMA della strategia)
Script scripts/research/r0701_xs_seasonal.py. Dati data/raw/hl_*_1d.parquet, 19 major
XS01 (lista src/portfolio/sleeves.XS_UNIVERSE), 912 giorni (2024-01-02 → 2026-07-01,
~2.5 anni), 0 barre vol=0. Ritorno relativo x[t,a] = r[t,a] − media cross-section del
giorno. Per ogni bucket calendario: tilt bucket-specifico per asset = media di x nel
bucket − tilt incondizionato dell'asset (isola il calendario dal drift relativo generico).
Persistenza split-half: Spearman rank-corr del vettore tilt (19 asset) H1 vs H2, per
bucket. Null: 2000 permutazioni delle etichette entro ciascuna metà → distribuzione del
max-statistic (controlla il multiple-testing sui bucket e il confound "alpha persistente
dell'asset"). Soglia severa p<0.05 sul max. Regola del mandato: senza persistenza →
nessun backtest.
Numeri
| Test | Statistica | Null 95° pctl | p | Esito |
|---|---|---|---|---|
| [A] Weekday (7 bucket) | max rank-corr +0.511 (Wed); Mon +0.38, Sun +0.37, Fri +0.04 | +0.604 | 0.159 | FAIL |
| [B] Weekend vs feriali | +0.268 | +0.428 | 0.178 | FAIL |
| [C] Turn-of-month (±2gg) | +0.221 | +0.451 | 0.226 | FAIL |
| [D] IC weekend→lunedì | FULL −0.053 (t=−1.94); H1 −0.006 (t=−0.17) vs H2 −0.100 (t=−2.4) | — | non persiste | FAIL |
Con ~65 osservazioni per weekday per metà, lo std di una rank-corr su 19 asset è ~0.24 → il max-su-7 sotto puro rumore arriva a ~0.60: il +0.51 reale è dentro il rumore.
Diagnostica: perché tutte le rank-corr weekday sono positive?
Non è tilt idiosincratico, è il canale-beta: il mercato EW ha un pattern weekday di livello che si ripete nelle due metà (Sun −42/−30 bps, Sat +26/+25, Mon +35/+32) e la dispersione di beta (0.53→1.26) lo proietta nel cross-section — rank-corr(tilt, beta): Sun −0.642, Sat +0.325, feriali ~0. Cioè la poca "persistenza" visibile è l'effetto weekday di MERCATO (dominio trackF, già scartato come buy&hold travestito) che rientra dalla finestra via beta. Un eventuale L/S "weekday tilt" sarebbe stato in gran parte un book short-beta-la-domenica — non un edge calendario cross-sectional.
Note sui gate non raggiunti
- day_boundary_robust (obbligatorio per ogni effetto calendario): NON eseguibile sui 19 alt — i dati HL locali sono solo 1d, il confine giorno non è ri-tagliabile. Anche con persistenza, il verdetto massimo sarebbe stato LEAD-forward condizionato a barre orarie HL, mai sleeve. Con lo SCARTATO allo step 1 il punto è moot, ma resta il vincolo per chiunque riapra il filone.
- Fee: mai arrivati al backtest; nota strutturale: un weekday-tilt L/S ribilancia ogni giorno (weekday di domani ≠ oggi) → turnover ~2×gross/die, morte-per-fee quasi certa a 0.10% RT anche con edge lordo.
- DSR: non calcolato (nessuna cella backtestata — il branch strategia esiste nello script ma non si attiva senza persistenza).
Verdetto
SCARTATO allo step statistico, senza backtest. Tre motivi: (1) nessuna persistenza split-half sopra il null permutato (p 0.16–0.23 su tutti i test, IC weekend→lunedì non persiste tra le metà); (2) la sola struttura visibile è il canale-beta di un pattern weekday di mercato — la stessa famiglia già scartata in trackF, non un effetto cross-sectional; (3) ~2.5 anni × effetto calendario × turnover giornaliero = rumore + morte-per-fee anche nello scenario migliore.
File: scripts/research/r0701_xs_seasonal.py (deterministico, seed 20260701, ~2 min).