Files
PythagorasGoal/docs/diary/2026-07-01-funding-ts-signal.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

7.1 KiB
Raw Blame History

2026-07-01 — Funding rate come segnale TIME-SERIES direzionale su BTC/ETH (R0701): SCARTATO

Contesto

Filone: il funding orario Hyperliquid come proxy di POSIZIONAMENTO/sentiment con valenza direzionale a orizzonte giornaliero su BTC/ETH — NON carry. Angolo diverso dal prior art già chiuso: FC01 (carry cross-sectional delta-neutral 19 alt → LEAD fragile SCARTATO, 2026-06-22-funding-carry-hl.md) e funding price-clock intraday (drift attorno agli stamp → FAIL, onda intraday). Qui l'ipotesi è: funding estremo = affollamento long → fade; funding in espansione = domanda persistente → follow; funding affollato = de-risk del trend (gate). Attrattiva a priori: 2 gambe BTC/ETH perp = eseguibile al capitale reale ~$600 (non STAT-MODE come XS01/opzioni) — se avesse retto sarebbe stato deployabile.

Script: scripts/research/r0701_funding_ts.py.

Dati e causalità (data-first)

  • data/raw/hlfund_{btc,eth}_1h.parquet: 2023-05-12 → 2026-06-22, 1138/1138 giorni validi, 0 gap dopo il 2023-06 (primi ~27 giorni a cadenza 8h — la somma giornaliera degli stamp li gestisce indifferentemente). Funding medio +14.4%/anno BTC, +14.6% ETH; std del funding giornaliero ~5.5 bps.
  • Join causale (il punto delicato): le barre 1d di altlib.get sono open-labeled (datetime = 00:00 UTC del giorno D; il close della barra D è noto alle 00:00 di D+1). Il feature-day D aggrega i SOLI stamp in [D 00:00, D+24h) — l'ultimo alle 23:00 — quindi tutto è noto PRIMA della decisione al close della barra D; eval_weights shifta la posizione al giorno D+1. Prefix-consistency check esplicito: max diff 0.0 (nessun leak).
  • Valutazione su finestra TRONCATA alla copertura funding, non sul frame prezzi 2018+: fuori copertura il target sarebbe zero per costruzione e i giorni-zero (a) gonfiano il T del deflated-Sharpe (anti-conservativo) e (b) diluiscono cand_insample_sharpe (il gate has_insample_edge scatterebbe a vuoto). La logica di study_family_honest è replicata ESATTAMENTE sui frame troncati coi primitivi altlib (selezione IN-SAMPLE-ONLY → gates study_marginal → DSR sull'intera griglia). Cross-check study_marginal non-troncato in coda: stessi verdetti (abs WEAK / marginal NEUTRAL / earns_slot False).
  • ⚠️ STORIA CORTA: ~3.1 anni totali → in-sample pre-HOLDOUT ~1.6a (meno warmup z), hold-out 2025+ ~1.5a. Dichiarato: nessun numero qui ha il peso statistico di TP01 (7 anni).

Metodo

Famiglia a griglia modesta, 1d, 50/50 BTC+ETH, vol-target 20% cap 2x (convenzione TP01), fee 0.10% RT + sweep 0.00-0.30%:

  • FADE: z-score(funding daily, lb) ≥ thr → short; ≤ thr → long (fade dell'affollamento).
  • FOLLOW: z ≥ thr → long; ≤ thr → short (sentiment momentum).
  • GATE: trend long-flat TP01-like (sgn mom 30d+90d) ma FLAT quando z ≥ thr (de-risk crowding).
  • DIVERGE: momentum prezzo 20d seguito se funding NON affollato (z ≤ thr), fatto se z ≥ thr.

Griglia: 4 forme × lb {7,14,30,60}g × thr {0.5,1.0,1.5} = 48 celle. Selezione cella in-sample-only (mai sul hold-out), deflated-Sharpe su tutte le 48, gates marginali (marginal_vs_tp01), boundary-shift della finestra di aggregazione funding (0/3/6/9/12h), eval_weights_smallcap a $600.

Risultati

Best in-sample per forma: fade 0.34, follow 0.81, gate 1.76, diverge 0.34 — il segnale puro-funding è debole ovunque; solo la forma che CONTIENE il trend ha Sharpe.

Cella scelta (in-sample): GATE lb=60 thr=1.5 — IS 1.76, FULL 1.16, HOLD 0.29.

Gate Esito
Deflated-Sharpe (48 celle) 0.215 (null-max atteso 1.59) → FAIL (soglia 0.95)
Assoluto (frame troncati) WEAK (minFull +0.97, ma minHold +0.04 BTC); fee-survive fino a 0.30% RT
Marginale vs TP01 NEUTRAL: corr 0.879 (hold 0.92), beta 0.77; uplift w25 hold +0.001; robust_oos=False (jackknife 0.074); multicut 2026 0.423
earns_slot / earns_slot_honest False / False
Realism prefix-diff 0.0 (causale); boundary-shift sign-stable (uplift spread 0.047); smallcap $600 haircut ~0.00 (eseguibile, irrilevante senza edge)

Controllo decisivo (lezione TP01-DVOL-overlay) — lo stesso trend long-flat SENZA gate funding:

trend NUDO :  IS 1.65   FULL 1.14   HOLD 0.37
trend+GATE :  IS 1.76   FULL 1.16   HOLD 0.29     corr(gated,nudo)=0.928
delta del gate funding: FULL +0.013, HOLD 0.080

tutto lo Sharpe della "vincitrice" è il trend; il contributo del funding è ~zero in-sample e negativo sul hold-out. Il gate è TP01 travestito.

Miglior cella puro-funding (la vera tesi del filone): FOLLOW lb=60 thr=0.5 — IS 0.81 ma FULL 0.28, HOLD 1.69, marginale DILUTES (uplift w25 hold 0.778). L'in-sample 0.81 era "long-il-toro-2023/24" travestito: z-alto di funding = rally già in corso; nel 2025-26 la stessa regola è sistematicamente dalla parte sbagliata. FADE (shortare il crowding) perde sul toro e non recupera abbastanza nel chop; DIVERGE negativa ovunque. NB: esistono celle gate con HOLD migliore (es. gate 7/1.5 HOLD 0.96) — sceglierle sarebbe selection-on-holdout, il gate del 2026-06-29 esiste esattamente per questo.

Perché fallisce (meccanismo)

  1. Su asset MAJOR il funding è quasi sempre positivo e segue il prezzo con lag: lo z-score alto coincide col momentum già espresso → FOLLOW è trend-beta ritardato (muore quando il regime gira), FADE è shortare il toro. Non c'è l'anti-persistenza ("crowding → reversal") che la tesi richiede — a 1d, su BTC/ETH, le liquidazioni-da-crowding sono già nel prezzo prima che lo z-score giornaliero diventi estremo.
  2. L'unico uso "funzionante" (gate di de-risk sul trend) è ridondante: TP01-like è già flat quando serve. Stesso verdetto di macro-regime-gate (corr 0.989) e DVOL-overlay: la famiglia "overlay prudenziale su TSMOM" è esaurita — eredita lo Sharpe del trend e non aggiunge nulla.

Verdetto

SCARTATO. earns_slot=False, earns_slot_honest=False (DSR 0.215). Il funding time-series non ha informazione direzionale propria su BTC/ETH a 1d; l'unica cella con Sharpe è trend travestito con contributo funding OOS negativo. Niente forward-monitor: non c'è una componente funding da monitorare. Con FC01 (carry cross-sectional) e il price-clock intraday, il filone "funding come segnale" su dati certi è ora chiuso su tre lati.

Lascito

  • scripts/research/r0701_funding_ts.py riusabile: (a) loader funding→daily causale per barre open-labeled (finestra [D, D+24h), gestione cadenza mista 8h/1h, flag validità copertura); (b) pattern "truncation-honest" per dataset a copertura parziale — replica di study_family_honest su finestra troncata per non gonfiare il T del DSR né diluire has_insample_edge con anni di zeri (riusabile per ogni serie corta tipo DVOL/HL).
  • I parquet hlfund_* restano certificati. Se mai si tornasse sul funding: gli estremi VERI (squeeze) vivono sugli alt, ma è di nuovo cross-sectional → STAT-MODE a $600, soglia di prova alta (e FC01 ha già mostrato la fragilità d'universo).