feat(xsec): dispersion-gate XS01 live (disp_min=0.0313) — Sharpe 3.46, PORT06 OOS 10.07->10.37; FC01 funding-carry scartata

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Adriano Dal Pastro
2026-06-10 21:42:12 +00:00
parent d1180ef25b
commit e25d5db6ad
7 changed files with 533 additions and 2 deletions
+46
View File
@@ -0,0 +1,46 @@
# 2026-06-10 — FC01 funding-carry market-neutral: SCARTATA (il carry non paga le fee)
## Idea
Carry NEUTRALE sul funding Deribit (meccanismo mai esplorato: W12 era lo short
direzionale su funding alto, bocciato): short della gamba col funding alto /
long della gamba bassa (ETH vs BTC, dollar-neutral), incassando il differenziale
di funding con esposizione residua = solo lo spread ETH/BTC.
Dati REALI: `data/regime/{btc,eth}_funding.parquet` — funding orario effettivo
dic 2019 → giu 2026 (56.938 ore), `interest_1h` + index_price.
Harness: `scripts/analysis/funding_carry_research.py` (causale: decisione al
close t, accrual da t+1; fee 0.10% RT per gamba; TRAIN ≤2023-11-01 / OOS dopo).
## Numeri che uccidono l'idea (prima ancora del backtest)
- Funding annualizzato: BTC mean +7.2% / med +0.3%; ETH +5.2% / +0.05% —
la MEDIANA è ~zero: il funding alto è episodico, non strutturale.
- Spread ETHBTC: p10 19% / p90 +12.6% annualizzato, MA autocorr del
24h-smooth a 72h = 0.20 → poca persistenza.
- **Episodi |spread|>10% ann: durata mediana 19h** (p90 60h) → carry
incassabile per episodio ≈ 10%/8760×19h ≈ **0.02-0.05%**, contro **0.20%**
di fee (2 gambe). Strutturalmente morto: il carry è un ordine di grandezza
sotto i costi, e il price-leg dello spread ETH/BTC (vol ben maggiore del
carry) domina il PnL.
## Backtest (conferma)
- FC-A spread-carry, griglia smooth {24,72,168}h × thr {5,10,20}% ann:
TRAIN quasi tutto negativo (Sharpe 0.6…+0.03), OOS negativo ovunque
tranne una cella (s24 thr5: OOS +38% con TRAIN 45% = rumore/sign-flip).
Sweep fee: negativa anche a 0.05% RT/gamba. Annuale: 2021 93%, nessuna
stabilità.
- FC-B direzionale single-asset (confronto onesto): negativa ovunque,
riconferma W12.
## Verdetto
SCARTATA. Su Deribit BTC/ETH il funding non è un carry harvestabile: troppo
piccolo, troppo breve, e l'hedge cross-asset introduce più rischio del carry
che raccoglie. Eventuale rivisita SOLO se: (a) si aggiungono alt ad alto
funding cronico (Hyperliquid, registry già validato) dove i livelli sono
5-10x, o (b) si usa il funding come FEATURE/gate di strategie esistenti
(es. filtro sulle entry PR01) invece che come fonte di PnL.
Script: `scripts/analysis/funding_carry_research.py` (resta come record negativo).
@@ -0,0 +1,51 @@
# 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.