Files
PythagorasGoal/docs/diary/2026-07-01-xs-seasonality.md
T
Adriano Dal Pastro 491411ac77 research(wave-0701): 6 filoni multi-agente — 0 nuovi sleeve, pesi confermati, gate weights_tilt_null
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>
2026-07-01 23:21:59 +00:00

4.1 KiB
Raw Blame History

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.160.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).