# PythagorasGoal — Istruzioni per agenti ## Stato del progetto — v2.0.0 RESET (2026-06-19) **LEGGERE PRIMA DI TUTTO.** Il progetto è stato resettato dopo aver scoperto che l'intera libreria di strategie "validata OOS" (FADE, PAIRS, DIP01, TR01, ROT02, TSM01, XS01, SH01) era **artefatto di uno storico contaminato** — print fantasma del feed Cerbero **testnet** + storico **Binance/USDT**. Ri-testate sul feed reale, tutte perdono ogni anno (vedi `docs/diary/2026-06-19-deribit-history.md`, il documento di fondazione). Cosa è cambiato: - Lo storico è stato **ricostruito da Deribit mainnet** e **certificato**. Universo affidabile = **solo BTC/ETH** (tutti i TF). Gli alt sono esclusi (illiquidi/divergenti/non certificabili). - Tutto il codice vecchio (strategie, stack live, ~100 script di ricerca/gate, dati non certificati, 60+ diari) è **archiviato in `Old/`** (preservato in git, non cancellato). - ~~L'esecuzione è DISABILITATA, il conto mainnet è flat. Non c'è trading live attivo.~~ **AGGIORNATO 2026-06-20: l'esecuzione di TP01 è ARMATA e LIVE su Deribit mainnet** — `config/live.json` `execution_enabled=true` + cron giornaliero `live_execute.py --execute` (cablato in `scripts/cron_daily.sh`). Guardrail: cap **$300 notional/asset**, min order $5, **disaster-SL on-book −30%**, alert Telegram su esecuzione/errori. **Capitale reale ≈ $600** (NON i €2000 nominali del paper trader). Stato corrente: **flat** (target TSMOM risk-off → BTC/ETH 0.0x, nessun ordine). Solo TP01 è eseguito; XS01/VRP01 restano paper/STAT-MODE. - Si riparte dalla ricerca di strategie NUOVE, su dati certi, con la metodologia qui sotto. ### Ricerca post-reset (2026-06-19) — esito Prima ondata di ricerca onesta su BTC/ETH certificati (5 track, harness condiviso `src/backtest/harness.py`). Sintesi in `docs/diary/2026-06-19-research-synthesis.md`. - **TP01 Trend Portfolio — strategia DIFENSIVA robusta (non alpha)** — `src/strategies/trend_portfolio.py`. TSMOM multi-orizzonte (1-3-6 mesi) vol-targeted, long-flat, 50/50 BTC+ETH. Config canonica **PORT LF1d** (**>=12h, 1d raccomandato**, vol-target 20%, leva cap 2x): **FULL Sharpe ~1.30, maxDD ~14%; HOLD-OUT 2025-26 Sharpe ~0.31 / +3.5%** mentre il buy&hold 50/50 faceva −39%/DD60%. Verificata indipendentemente col gauntlet onesto (hold-out + cross-asset + plateau + deflated-Sharpe 0.999): **regge**. **Valore = taglio del drawdown ~6× vs buy&hold**, NON generazione di ritorno (CAGR ~16% vs ~48% del buy&hold sul toro). ⚠️ **LOOK-AHEAD (2026-06-19):** un ffill MIXED-TIMEFRAME su barre open-labeled gonfiava il 4h (~1.60 → reale ~1.1). Il calcolo per-singolo-TF è leak-free, ma **NON scendere sotto le 12h**: costi+overfitting dominano senza vantaggio (FULL Sh piatto ~1.3 da 12h a 4h; hold-out migliore a 1d). Deploy/paper a **1d**. Diari `2026-06-19-tp01-verification.md` / `-tp01-lookahead-fix-lf.md`. Paper/forward: `scripts/live/paper_portfolio.py` (TP01+XS01, 1d). Test: `tests/test_trend_portfolio.py`. (Il vecchio `paper_trend.py` standalone TP01 è RITIRATO in `Old/scripts/live/` 2026-07-17 — inerte dal 2026-06-19, non in cron, sostituito da `paper_portfolio`.) Ri-verifica: `scripts/analysis/{verify_tp01,stress_tp01,tp01_lowfreq}.py`. ⚠️ **ANCHOR TIMING-LUCK (2026-07-02, confermato da scettico):** l'hold-out ~0.31 è calcolato sull'ancora daily 00:00 UTC, che è la **migliore delle 24 possibili** (mediana ancore 0.04, banda [−0.13,+0.30]; P~0.86 che una qualsiasi ancora mostri uno spike così per puro caso) → l'hold-out 2025-26 NON risolve l'edge di ritorno di TP01; ciò che regge a OGNI ancora è il **taglio del DD** (7-10% vs ~60% B&H). FULL/plateau/deflated-Sharpe/gate INVARIATI (h=0 al 31° pctl su FULL). Regola: i futuri numeri hold-out di strategie a ribilanciamento ancorato si citano con la banda d'ancora. Diario `2026-07-02-timing-crt-wave.md`; script `scripts/research/r0702_tp01_offset.py` + `r0702_skeptic_offset.py`. - **XS01 Cross-Sectional Momentum (Hyperliquid) — DIVERSIFICATORE che migliora il portafoglio** — `src/portfolio/sleeves.py:_xsec_returns`. Market-neutral su **19 alt liquidi major** Hyperliquid (1d, dal 2024): ogni 10g long i 5 più forti / short i 5 più deboli, vol-target 20%. **Scorrelato a TP01 (~−0.12).** Affinato (2026-06-19): **(a) blend di lookback [30,90]** (z-score cross-sectional mediato, come il multi-orizzonte di TP01); **(b) gate di dispersione p30** (entra solo se la dispersione cross-section del momentum supera il percentile espandente causale, altrimenti flat — XS è rumore in regime compatto). Standalone FULL Sh **1.50** / HOLD 1.71 / DD 11%, plateau robusto (lookback, gate p15-35). **Caveat:** storia ~2.5 anni; STAT-MODE (book a 19 gambe non eseguibile a 2k, serve ~20k) → monitor forward. NB il gate concentra XS nei regimi dispersi (2025-26 = hold-out alta-dispersione). ⚠️ **PHASE TIMING-LUCK (2026-07-02):** i numeri headline sono sulla fase 0 del ciclo H=10, che è al **15° pctl di DD** (10.8% vs ~15.5% fase tipica, 29% peggiore) e 85° di FULL fra le 10 fasi (HOLD solo 65°, non estremo); P(spike per caso)≈0.91-0.94. Lens onesta = **ensemble di fase: FULL 1.25 / HOLD 1.31 / DD 10.9%**; a fase mediana FULL 1.08/HOLD 1.10/DD 21%. La decisione di ammissione @15% regge (0 fasi negative, 8/10 FULL≥1.0), i numeri 1.50/1.71/11% no → citarli con banda di fase. Ora-del-giorno NON testabile (solo 1d HL). Script `scripts/research/r0702_anchor_xs01.py`; diario `2026-07-02-anchor-audit-xs01-skh01.md`. Ricerca `scripts/portfolio/{xsec_research,xsec_blend,xsec_dispgate}.py`. Diari `2026-06-19-hyperliquid-xsec` / `-xsec-blend` / `-xsec-dispgate` / `-xsec-universe-expansion` / `-trend-multiasset`. - **PORTAFOGLIO ATTIVO = TP01 (33%) + XS01 (15%) + VRP01 (12%) + SKH01 (20%) + GTAA01 (20%)** (`src/portfolio/sleeves.active_sleeves`): TP01+XS01 combinato **FULL Sharpe 1.55, HOLD-OUT 1.55, DD 4.4%**. Aggiunto **VRP01** (options short-vol, sotto): TP01+VRP01 da solo fa FULL Sh 1.30→1.44 / HOLD 0.31→0.40 a peso 20%. **Aggiunto SKH01-V2-DD @25% effettivo (2026-06-23, sotto)**: 4-sleeve **FULL Sharpe 1.68→2.13, HOLD-OUT 1.63→2.30, DD full 14.3%→7.8%** (Skyhook quasi-ortogonale, corr ~0.09). **Aggiunto GTAA01 @20% effettivo (2026-07-01, i 4 preesistenti scalati ×0.80):** trend difensivo equity 6-ETF su IB (`src/portfolio/gtaa.py`, ~30 anni storia, validato 2026-06-22 su OOS equity 2015+ INDIPENDENTE dall'hold-out crypto, corr al book ~+0.10) → 5-sleeve **FULL Sharpe 2.12→2.24, HOLD-OUT 2.21→2.46, DD full 7.8%→6.2%** (costo dichiarato: CAGR full 23.3→18.8%; 2022 unico anno con dSh−). Uplift positivo in-sample E su tutte le finestre disgiunte (vs EW-STR refutato lo stesso giorno). Convenzioni: weekend/festivi equity = 0.0 (capitale IB fermo, non riciclato); attivazione nel book all'era crypto 2019-03; **il book live Deribit (`deribit_book_sleeves` TP01+SKH01 75/25) NON lo include** (GTAA in paper_combo dal 2026-06-23). Test `tests/test_gtaa_sleeve.py`; diario `2026-07-01-strategy-wave-6threads.md` (addendum GTAA). Report `scripts/portfolio/run_portfolio.py`. Sleeve a date d'inizio diverse → outer-join con pesi rinormalizzati (TP01/SKH01/GTAA dal 2019*, VRP dal 2021, XS dal 2024; *GTAA troncato all'era book). ⚠️ **ANCHOR-LUCK del book — MISURATO 2026-07-26 (la stima del 02/07 era ottimista su 3/3).** I numeri canonici sono calcolati con TUTTI e cinque gli sleeve alla loro ancora canonica. Il 02/07 la correzione fu **stimata a occhio** sommando le fortune marginali (HOLD ~1.9-2.1, FULL ~2.0-2.2, "DD ~6% invariato"); il 26/07 è stata **misurata sullo spazio congiunto** (24×10×7×23×5 = 193.200 configurazioni, 2000 estrazioni uniformi indipendenti, `r0726_loo_deluck.py`): | | canonico | pctl | **stima onesta = mediana** | banda p10-p90 | |---|---|---|---|---| | Sharpe FULL | +2.222 | 97.0° | **+1.95** | [1.81, 2.12] | | Sharpe HOLD-OUT | +2.364 | **99.6°** | **+1.54** | [1.11, 1.91] | | maxDD FULL | 6.07% | 12.0° | **6.85%** | [5.99, 7.94] | **Solo 9 estrazioni su 2000 battono l'hold-out canonico.** Il book resta positivo e diversificato a ogni ancora, ma **i numeri da citare sono 1.95 / 1.54 / 6.85%**, non i canonici. ⚠️ **Lezione: la somma delle fortune marginali NON è la mediana congiunta** — sbagliava di +0.82 di Sharpe hold-out, più di quasi tutti gli uplift per cui in questo progetto si è discusso se ammettere uno sleeve. Quando serve la banda di un AGGREGATO si campiona lo spazio congiunto; gli audit uno-sleeve-alla-volta (02/07, 03/07) restano validi per giudicare *quello* sleeve. Diari `2026-07-02-anchor-audit-xs01-skh01.md` (originale) e `2026-07-26-loo-deluck.md` (misura). - **SKH01-V2-DD "Skyhook" — DIVERSIFICATORE quasi-ortogonale (research)** — `src/strategies/skyhook.SKH01_V2_DD`, sleeve `src/portfolio/sleeves._skyhook_returns`. Sistema dual-TF (segnale 690m / exec 230m) regime (BuzVola/BuzVolume tipo-Chande) AND pattern (Donchian breakout), NON trend-follower, L/S. Vincitrice di 2 onde multi-agente (la 2ª = DD-reduction): exit a **percentuale fissa ASIMMETRICA** (long sl4%/tp10%, short sl2%/tp8% più stretto) → standalone **maxDD BTC 21% / ETH 27% (<30%)**, minFull +0.99, minHold +1.26, causale (0/400), fee-surviving 0.40%RT. Marginal vs TP01 **ADDS** (corr 0.09, has_insample_edge, robust_oos multicut 7/7, is_hedge=False); blend 0.75·TP01+0.25·SKH **hold-out 0.31→1.17**. Verificato leak-free + 2 scettici. **CAVEAT:** equity daily-step (Sharpe lens), ETH DD margine sottile, book 230m (costi ribilanciamento da verificare a deploy) → research win, forward-monitor. Diario `2026-06-23-skyhook.md`. ⚠️ **GRID TIMING-LUCK (2026-07-02, più forte di TP01):** i numeri headline sono sull'offset 0 della griglia 230m/690m, al **93-98° pctl dei 23 offset a priori** — minHold +1.26, blend 1.17 e book HOLD 2.44 sono il MASSIMO dei 23 (mediane: minHold +0.39, blend 0.72, book 1.96); spike, non plateau (±30m crolla); P(spike)≈0.70. **Il gate DD<30% (criterio di selezione di V2-DD) fallisce in 15/23 offset** (mediana ETH 29.2%). Regge de-luckato: uplift blend positivo a TUTTE le 23 fasi (min +0.18, med +0.42) + corr 0.05-0.11 → ADDS sopravvive ridimensionato. **LIVE (SKH=25% del book Deribit):** path reale cron orario + exit software → book 50/50 FULL 1.46→1.19 / HOLD 1.64→1.15 / DD 18→25%; nei crash gap-through-stop reale (sl2% modellato → −11/−23% realizzato). Pesi/book INVARIATI (ogni cambio passa weights_tilt_null). **Follow-up CHIUSO 2026-07-24** (`scripts/research/r0724_skh_live_weight.py`): sul path live (lente hourly, 23 offset) il peso ottimale de-luckato È 0.25 (argmax mediana-IS di banda, plateau 0.20-0.30; w=0.30 passa il gate solo a off0 = ancora fortunata, fallisce a offset mediano) e la cadenza 230m vale ~+0.01/+0.02 Sh mediano (rumore: il degrado live è il fill-al-livello, ~+0.35 Sh, che nessun cron recupera) → **book 75/25 e cron orario CONFERMATI**; diario `2026-07-24-skh-live-weight.md`. Script `scripts/research/r0702_anchor_skh01.py`; diario `2026-07-02-anchor-audit-xs01-skh01.md`. - **VRP01 Options Short-Vol — DIVERSIFICATORE da FinanceOld/OptionsAgent** — `src/portfolio/sleeves._vrp_combo_returns`. Put credit spread settimanale (vendi put -0.28, compra put -0.10) gated su IV-rank. Idee portate da `../FinanceOld/OptionsAgent` (Bear Call Spread + gate d'ingresso). Migliora il lead VRP nudo (options_vrp_lab): **(a) defined-risk** taglia la coda (worst-week -16.6%→-7.4%, DD 33%→14%); **(b) gate IV-rank>0.30** = vendi vol solo ricca → ribalta HOLD-OUT da -0.25 a +0.28 (l'alpha è il filtro di regime). Standalone **FULL Sh 1.10, HOLD 0.60, DD 12%**, positivo/piatto ogni anno (2022 crash incluso). Scorrelato a TP01 (~+0.01-0.07). **CAVEAT:** premio MODELLATO su DVOL ATM (skew non esplicito), book a 1d, f di stress reale non catturato → LEAD robusto, non deploy pieno. Ricerca `scripts/research/options_vrp_v2.py` (vs baseline `options_vrp_lab.py`). Test `tests/test_vrp_sleeve.py`. ⚠️ **ANCHOR-AUDIT CHIUSO + ondata "migliora e proteggi" (2026-07-03, 7 filoni + 2 lenti + scettico): VRP01 NON è migliorabile e la protezione DD si compra SOLO con la size.** (a) **Anchor-luck (ciclo settimanale, 7 fasi): PRIMO sleeve SENZA firma di luck** — la fase canonica è la PEGGIORE delle 7 su FULL (1.09 = 7° pctl) e su DD (11.8% = 93° pctl), mediana su HOLD (0.59); spike bootstrap NEGATIVO → i numeri di ammissione FULL 1.10/HOLD 0.60/DD 12% sono CONSERVATIVI, non gonfiati. Da ora si citano con banda: ShFULL [1.09,1.83], ShHOLD [−0.03,1.11], DD [5.7,11.8%]; edge OOS f-dipendente (f=0.8 → HOLD~0). **Con questo l'audit anchor è completo su 4/4 sleeve ancorati.** (b) Griglia 288 strutture: nessuna batte VRP01 (DSR 0.000; metà griglia = 3ª occorrenza "0-perdite/Sharpe implausibile" dopo CC01/ALB-A → gate `implausible_sharpe` alzato di priorità). (c) 4 overlay DD (exit-spike/SL-MTM/ ala-coda/cooldown): 4/4 REFUTED dal null de-levering — la protezione crash vive già nel gate d'ingresso IV-rank. (d) Gate nuovi: 4° fallimento su 4 (l'alpha è il binario IV-rank>0.30). (e) Sizing: 12% deploy ≈ 0.27 Kelly onesto (anti-rovina); ⚠️ NON confondere col 12% di PESO del book (~0.014 Kelly, fattore 19x). (f) Gate term-structure VIX/VXV su SPX (ΔSh +0.90, DSR 0.992) = **confound di modello al 100%** (la var del gate coincide con l'errore BS-flat vs term-structure) → nuova regola: riprezzare term-structure-consistent prima di credere a un gate vol su strutture BS-flat. Book/pesi INVARIATI. Diario `2026-07-03-vrp-improve-dd.md`; script `scripts/research/r0703_vrpimp_*.py` (7 file). Diario `2026-06-20-financeold-analysis-vrp-v2.md`. - **Universo Hyperliquid: ESPANDERLO NON aiuta XS01** (provato): 52-asset / top-liquidità dinamico / trend-multi-asset → tutti peggiori (small-cap/memecoin diluiscono il momentum relativo; il trend multi-asset è ridondante con TP01, corr 0.74). I margini su XS sono nella STRUTTURA DEL SEGNALE (blend + gate), non nel numero di asset. I **51** parquet certificati restano per ricerca futura. ⚠️ Il test "52-asset = negativo" era in parte inquinato dal backfill sintetico (AXS 83%, ALGO/SAND 37% di barre vol=0) poi rimosso — vedi correzione estrazione 2026-06-20 sotto; resta comunque vero che il long-tail diluisce XS01, ma il numero netto post-fix è 51. - **Lead OPZIONI VRP (income short-vol) — quantificato, NON deploy** — `scripts/research/options_vrp_*.py`. Vendita put settimanali che incassa il volatility risk premium (IV>RV), scorrelato al trend (~0.07). Premio prezzato BS su DVOL reale (`fetch_dvol.py`) + calibrato su quote REALI cerbero-bite mainnet (`options_vrp_calibrate.py`): **f reale ≈ 1.0** (non 1.29) → Sharpe ~0.71, DD 33%, coda severa (settimane −15..−26% su LUNA/FTX). Diversificatore DEBOLE a premio reale, e short-vol da modello. **Regola: niente short-vol da modello in deploy.** Rivalutare quando cerbero-bite cattura un crash (per il f di stress reale). Diari `2026-06-19-options-vrp-lab` / `-eval-crypto-backtest-options`. - **Edge deboli/scartati:** ML walk-forward BTC (Sh ~0.57), trend 1h L/S (~1.0), RV ETH/BTC (Sh 0.27, regime-luck), calendar/seasonality (buy&hold travestito), volume/vol e momentum-reversal (negativi). - **MORTO/confermato artefatto:** mean-reversion / fade (negativo anche a fee zero — la vecchia libreria +201%/+1238% era contaminazione); trend 5m/15m (fee). - **GAMMA SCALPING (long-vol) "scalping BTC/ETH con copertura in opzioni" — SCARTATO (2026-06-26)** — `scripts/research/options_gamma_scalp.py`, test `tests/test_gamma_scalp.py`. È lo **specchio esatto del VRP01** (long straddle ATM + delta-hedge: incassa **RV−IV**, dove VRP01 incassa IV−RV). Perde **ogni anno, ogni variante, ogni frequenza** (Sharpe −3 a −6; nudo/cheap-gated/rich-skip; rehedge 1d e 1h). Diagnostica strutturale: a 1d IV≈o>RV (BTC +4.9pp) → paghi il VRP; a 1h RV>IV gross ma (a) gonfiata da microstruttura, (b) il rehedge orario paga **24× la fee di hedge** → variante *peggiore* (−6). Marginale vs TP01 = **DILUTES**, non è nemmeno hedge (perde sia TP01-up sia TP01-down). Muro eseguibilità: opzione BTC min $5.968 ≫ $600. Schiacciato tra due muri: rehedge lento = premio, veloce = fee → **nessuna frequenza vince.** Regola gemella del VRP: *niente long-vol scalp da modello in deploy*. Il VRP01 (lato short, gated) resta l'unico edge opzioni — funziona perché sta sul lato *giusto* dello stesso premio. Diario `2026-06-26-gamma-scalp-options.md`. - **CASH-AND-CARRY (basis trade) "CC01" — premio REALE, Sharpe ARTEFATTO, NON deployabile (2026-06-26)** — `scripts/research/cash_carry_hl.py`, test `tests/test_cash_carry.py`. Diverso da FC01 (funding cross-sectional, già scartato): qui delta-neutral long-spot/short-perp sullo *stesso* asset → ritorno ≈ **+funding** (zero esposizione prezzo). Il premio di funding è **reale** (~+8-14%/anno aggregato, positivo ogni anno in-sample, ortogonale a TP01 corr ~0.05). MA lo **Sharpe modellato 11-13 (DD 0.3%) è un ARTEFATTO**: il modello cattura solo il cashflow liscio del funding e i rischi di coda sono **strutturalmente fuori dal dataset** — (1) storico funding dal 2023-05 → **manca il 2022** (deleveraging, funding −, basis blow-out); (2) **procyclico** (carry +23% toro 2024 → +1.7% bear 2026, si comprime quando servirebbe); (3) liquidazione short/slippage non modellati. Il mark-to-market della base (`premium` col → r=funding−Δpremium) sgonfia lo Sharpe solo 13→11 → il basis-from-data NON è il rischio vero. Sharpe reale di un basis-trade ~1-3 con code brusche. **NON eseguibile a $600** (spot+perp = 4-38 gambe, funding HL non Deribit) → STAT-MODE. **LEAD da rivedere a scala (~20k+ e venue con funding eseguibile), non uno sleeve.** Sottoprodotto: CC01 passa OGNI gate del marginal scorer → **punto cieco** (manca un gate "Sharpe implausibile → rischio nascosto"; prossima indurita raccomandata). Diario `2026-06-26-cash-carry-hl.md`. - **TP01 × DVOL vol-targeting — NON migliora (2026-06-26)** — `scripts/research/tp01_dvol_overlay.py`, test `tests/test_tp01_dvol_overlay.py`. Angolo ESEGUIBILE (tocca il book live, non STAT-MODE): usare il DVOL (vol implicita forward-looking) come denominatore del vol-target di TP01 invece della vol realizzata. Su finestra comune 2021-2026: le varianti DVOL abbassano il DD (12.3%→9.2%) ma anche Sharpe FULL (0.75→0.70) e CAGR (8%→6%). **Controllo decisivo:** il realized a target_vol RIDOTTO (15%) eguaglia quel DD (9.4%) a Sharpe **più alto** (0.75) → il taglio di DD del DVOL è solo **de-levering**, replicabile meglio con un semplice target_vol più basso. L'unico residuo (hold-out +0.06) è single-window (storia DVOL <5 anni) → sotto la soglia multi-cut. Il gate DVOL-spike de-risk è **ridondante col trend** (TP01 già flat nei crash, Δ 0.00). **Lezione: per meno DD sul live la leva è `target_vol`, non un overlay DVOL** (20% resta canonico). Diario `2026-06-26-tp01-dvol-overlay.md`. - **Filoni 2026-06-29 (1ª ondata) — tutti scartati/forward.** (A) **DVOL-DIREZIONALE** standalone BTC/ETH (buy-the-fear / IV-RV come segnale di livello): l'unico edge è un **HEDGE** (is_hedge=True, paga solo quando TP01 è debole), non alpha → earns_slot=False, forward-monitor come DD-dampener (diario `2026-06-29-dvol-directional.md`). (B) **INTRADAY ERM** (efficiency-ratio regime momentum sub-daily): **falso positivo da selezione-sull'hold-out** → SCARTATO (vedi gate SELECTION-ON-HOLDOUT; `2026-06-29-intraday-regime.md`). (C) **XSEC-V2 NON-MOMENTUM** su HL (reversal/idio-reversal/low-vol/BAB): solo LOWVOL 19-major regge standalone (FULL/HOLD 1.07) ma deflated-Sharpe 0.13 + storia 2.5a → **DEBOLE/ forward STAT-MODE** (`2026-06-29-xsec-v2-nonmom.md`). (D) **MACRO regime-gate** (equity/credito/oro/tassi → de-risk crypto): **RIDONDANTE col trend** (corr→TP01 0.989; il gate lavora solo nel 2-3% dei giorni, TP01 già flat nei crash) → SCARTATO (`2026-06-29-macro-regime-gate.md`). - **Sweep strategie a 5 thread (2026-06-29) — 0 nuovi sleeve, 1 LEAD che rompe 2 muri su 3.** Ricerca parallela onesta su aree inesplorate (harness `altlib`+`xsec_v2_nonmom`, tutti i gate incl. il nuovo `study_family_honest`): (1) low-risk cross-sectional, (2) momentum-structure vs XS01, (3) meta-allocazione dinamica, (4) segnali ortogonali ETH/BTC, (5) 1-gamba a segnale. Esito: soffitto ~1.3 riconfermato; ogni candidato ucciso dal gate giusto (deflated-Sharpe, is_hedge, selection-on-holdout, sostituzione-XS01, multi-cut). Niente batte/diversifica XS01 (varianti = REDUNDANT); meta-allocazione < pesi fissi (i 4 sleeve già quasi-risk-parity); 1-gamba a segnale = TP01 travestito (trend) o hedge a DSR<0.95. **LEAD forward-monitor:** **STATARB-RESID** (relative-MOMENTUM del residuo ETH−β·BTC, β OLS rolling, 2 gambe, cella vincente **sgn=+1**: le dislocazioni ETH-vs-BTC CONTINUANO a 1d, la MR pura sgn=−1 perde) — primo stream **insieme ortogonale (corr→book 0.027, β-mkt 0.013) ED eseguibile a $600** (haircut ~0, NON STAT-MODE come XS01/opzioni): marginal ADDS, robust_oos, fee-survive 0.30%/gamba; resta sotto soglia solo sull'**edge** (Sharpe 0.84, DSR 0.929 same-sign <0.95). **CABLATO in forward-monitor PAPER:** `scripts/live/paper_statarb.py` (W=45/sgn=+1 congelati, doppio libro MODELED/REAL-$600), nel cron giornaliero accanto a `paper_prevday`; test `tests/test_paper_statarb.py`. Se la finestra forward conferma l'edge è *deployabile* (2 gambe BTC/ETH perp). Altri LEAD: IVOL (idio-vol XS, STAT-MODE), DVOLSPREAD (storia DVOL corta). Diario `2026-06-29-strategy-search-5threads.md`. Script `scripts/research/{xsec_v3_lowrisk,xsec_v3_momstruct,meta_allocation,orthogonal_signals,signal_inout_1leg}.py`. - **Ondata 2026-07-01 (6 filoni multi-agente + scettico) — 0 edge nuovi dai filoni, 1 gate nuovo, e 1 sleeve promosso DALL'ARCHIVIO (GTAA01, sotto nel bullet portafoglio).** Filoni su angoli non coperti dalle ondate precedenti: (1) **funding time-series** BTC/ETH (posizionamento) = SCARTATO — FOLLOW è trend-beta ritardato, FADE shorta il toro, il gate è TP01 travestito (DSR 0.215); **il filone funding è chiuso su 3 lati** (FC01 carry, price-clock, TS). (2) **breadth/internals alt** (51 HL) = SCARTATO ma unico NON-ridondante col trend (corr→TP01 0.40); muore su jackknife (uplift su 1 mese) + DSR 0.433 con ~8 mesi IS → **rivisitabile tra 1-2 anni di storia HL nativa**. (3) **residual momentum XS** (β-hedged, 19 major) = REDUNDANT — cross-section la residualizzazione è un no-op (lo z-score di XS01 rimuove già il mercato); l'edge resta solo nella coppia ETH/BTC (STATARB-RESID). (4) **ri-ottimizzazione pesi + guardia-DD**: il candidato EW-STR (TP30/XS25/VRP15/SKH30, HOLD 2.21→2.35) **refutato dallo scettico come selezione-sull'hold-out di 2° ORDINE** — SKH01/XS01 furono ammessi/affinati *perché* forti su quell'hold-out; pre-2025 ΔSh −0.05, finestre disgiunte −0.12/+0.06/+0.14, percentile 94-100° fra 500 tilt casuali ≈ firma best-of-15. Guardia-DD 5%/0.5: inerte OOS (la diversificazione fa già il lavoro; solo circuit-breaker d'emergenza). (5) **affinamento VRP01** = NON MIGLIORA (l'alpha è tutto nel gate binario IV-rank; gate TP01 = trappola in-sample; **3° fallimento → filone "VRP dentro il modello" esaurito** fino a f di stress reale). (6) **stagionalità cross-sectional HL** = morta allo step statistico (null permutato). **GATE nuovo codificato: `weights_tilt_null`** in `src/portfolio/portfolio.py` (+ `combine_outer` riusabile): ogni proposta di CAMBIO PESI si giudica vs il null dei tilt casuali cap-respecting — gate_pass solo se delta_insample≥0 E percentile < firma best-of-k (necessario, non sufficiente); test `tests/test_weights_tilt_null.py`. ⚠️ Lezione tecnica: `DatetimeIndex.view("int64")` su indici tz-aware non-ns (pandas 2.x) → scala sbagliata → `merge_asof` broadcasta = **look-ahead che `causality_ok` non vede**; usare epoca esplicita in ms (altlib verificato pulito). Diario di sintesi `2026-07-01-strategy-wave-6threads.md` + 6 diari di filone; script `scripts/research/r0701_*.py`. - **Ondata 2026-07-02 (TIMING + CRT, 8 filoni multi-agente + scettico) — 0 nuovi sleeve, 1 finding strutturale (anchor timing-luck di TP01, vedi ⚠️ nel bullet TP01).** Goal: "strategie con timing differenti". (1) **Event-clock bars** (volume/vol/range da 5m, TSMOM/Donchian/EWMA in tempo-informazione): batte il wall-clock a pari segnale/frequenza solo in 4/45 coppie; cella best IS 1.45 → HOLD −0.46, NEUTRAL (corr 0.74 = trend travestito) → SCARTATO: il clock non è dove vive l'edge. (2) **Calendario scadenze Deribit** (expiry weekly/monthly/quarterly ven 08:00 UTC): 0/24 celle a Bonferroni; il drift post-expiry monthly fallisce placebo-weekday e permutation e si INVERTE sul quarterly (dove l'OI massimo dovrebbe amplificarlo); unico pattern robusto = gio→ven negativo, ma è day-of-week (SEA morta) a Sharpe netto ~0 → SCARTATO. (3) **Anchor timing-luck TP01 + tranching**: finding confermato (dettagli nel bullet TP01); tranching K=2/4 = sola riduzione della varianza della STIMA (ΔSharpe n.s., ΔDD ~0.5pt), NO deploy a $600 (il min-order lo degenera in K=1; serve feed intraday fuori path certificato) — rivalutare a ≥5-10k. **Audit d'ancora ESEGUITO su XS01 e SKH01 (stesso giorno): il finding si replica su 3/3 sleeve ancorati** — vedi ⚠️ nei rispettivi bullet e la stima de-luckata del book nel bullet portafoglio; diario `2026-07-02-anchor-audit-xs01-skh01.md`. (4) **Clock lenti (2-7g) + bande isteresi**: fee drag di TP01 = ~0.4%/anno = tetto di ogni risparmio; il lag costa più del risparmio (HOLD ensemble 0.34→0.11 da N=2 a 7); a $600 **il min-order $5 è GIÀ la banda ottimale** (ordini −74% a costo ~0) → nessun cambio al book. (5) **Velocità trend regime-condizionata** (pesi tra orizzonti 30/90/180g vs percentile vol RV/DVOL): pctl 0.71 vs null pesi-statici-casuali = tilt-30d statico travestito (trappola EW-STR); pesi canonici 1/3 confermati → SCARTATO. (6-8) **CRT "Candle Range Theory"** (sweep-and-reclaim 3 candele, mai coperto da MRV/MIC): base 864 trial DSR 0.000 + anchor-flip + short "smart-money" negativo perfino in-sample; multi-TF (4h→15m, 1h→5m, ~10k trade) expectancy negativa ovunque anche a fee zero, e **il ritest è informazione negativa** (pattern con-ritest −40bps vs senza +52bps: aspettarlo seleziona i peggiori); contesto (FVG/equal-highs/sessioni, 22 trial) non salva il fade, cella "Asia" = artefatto anchor-flip → SCARTATO 3/3. Sottoprodotto: sugli stessi livelli prior-day **FOLLOW > FADE ogni anno 2019-26** (conferma indipendente del lead prevday in forward-monitor). Lezione: il timing-luck d'ancora è multiple-testing che il deflated-Sharpe NON conta (candidato gate futuro `anchor_luck_band`). Diario `2026-07-02-timing-crt-wave.md`; script `scripts/research/r0702_*.py` (9 file). - **Ondata 2026-07-02-bis ("video claims": Elliott 3 filoni + Albimarini 2 + capital scaling) — 0 nuovi sleeve, 0 forward-monitor, 1 azione config pendente sul deposito.** Meccanizzazione onesta di claim da video didattici: (1) **Elliott range-cycle** (onda1 compressa→onda3 ampia): rumore, 0/24 celle a Bonferroni, nessuna cella weekly regge a tutte le 7 ancore → SCARTATO. (2) **Confluenza Fibonacci**: vs null ingenui sembra buona (pctl 0.82-1.00), vs null **location-matched** (Fib±jitter: "0.618 vs 0.58?") crolla a 0.39-0.68 = l'apparente edge è la POSIZIONE dei livelli, non i numeri; confluenza FAIL 4/4 → SCARTATO (il null location-matched è IL test per ogni claim su livelli "speciali"). (3) **Tecnica del canale Elliott**: Donchian travestito — non batte il Donchian a pari geometria (corr 0.43-0.53), DSR 0.685, cella in-sample collassa in hold-out (1.40→−0.87), target 1.618 = caso (5/6 celle), anchor-luck di nuovo (4h banda hold [0.35,1.54], 00:00 la migliore) → SCARTATO. (4) **Albimarini double-diagonal** (short T + long T+1, deep OTM, via motore DVOL di VRP01): il condor stessa-scadenza la batte a ogni f (la long T+1 = assicurazione di coda +12/33bps nel tail, ~1bps costo medio, non dominanza); senza gate IV-rank TUTTE le strutture perdono (3ª conferma: l'alpha del VRP è il gate); su Deribit fee-negativa a QUALSIASI size (fee 8 gambe = 194-221% del theta); celle deep-OTM 0-perdite/142 trade = 2° caso "Sharpe implausibile" dopo CC01 → gate `implausible_sharpe` raccomandato con più forza. VRP01 resta superiore su tutta la banda skew → nessun LEAD. (5) **Audit claims** (28 trade, 82% win, PF 5.16, "420%/anno"): consistente con ZERO skill (P=20-45%; il 78.6% delle finestre 6-mesi 1996-2026 lo produce); replay con code reali = rovina 1998/2002/2020 col sizing dichiarato; la diagonale lascia passare il 12-40% della perdita naked. (6) **Capital scaling 600→2-5k** (`r0702_capital_scaling.py`): l'unico vincolo binding è `max_notional_per_asset_usd=300` (a 5k il book live girerebbe al 49% del target) → **al deposito alzare il cap a equity/2** ($1000/$1750/$2500 a 2k/3.5k/5k); min_order $5 da LASCIARE; tranching K=2 non cablare (blocco feed intraday); opzioni ETH eseguibili da ~2.6k ma la regola no-short-vol- da-modello non decade col capitale; XS01 ~20k confermata, CC01 fuori per struttura. Aspettativa onesta col CAGR de-luckato (10-15%): 2k ≈ €0.6-0.8/g, 5k ≈ €1.4-2/g (€50/g resta ≈130k). ⚠️ Lezione pandas: `resample("7D", origin=...)` IGNORA origin (pandas 2.x, solo RuntimeWarning) → bande d'ancora weekly finte; usare `"168h"`. Diario `2026-07-02-elliott-albimarini-capital.md`; script `scripts/research/r0702_{ell_*,alb_*,capital_scaling}.py` (6 file). - **Video-claim "CRT top-down multi-TF, 74% win rate" — SCARTATO (2026-07-07): il 74% è un KNOB, non un edge.** `scripts/research/r0707_crt_topdown.py`. Metodo ICT/SMC top-down (H1 setup CRT → M15 struttura/FVG → M5 conferma → M1 entry) con uscita parziale-70/80%-a-1.5R + break-even + runner verso prev-daily high/low. Il setup H1 CRT è **già triplo-refutato** (onda 2026-07-02: base DSR 0.000, MTF expectancy neg. ovunque "il ritest è informazione negativa", contesto/FVG peggiora, fadeFADE riconfermato (3ª volta); a $600 l'esecuzione non è il vincolo. (4) **WK-OVERLAY** (lato eseguibile): **il weekend porta il 38% del gross di TP01 nel 31% del tempo** (positivo ogni anno) → TP01-weekend-flat è **attivamente dannoso** (ΔSh −0.46, P(danno)=1.000 bootstrap, banda 6/6 negativa, non-fee); half = de-levering pagato con fee (k=0.755 lo domina); boost ×1.5 n.s. → **regola: non de-esporre il weekend del book; ogni futura proposta "risk-off weekend" parte REFUTED** salvo null de-levering superato. Chiusura di famiglia: SEA + expiry + event-clock + 375 trial weekend ⇒ su BTC/ETH nessun edge di calendario/finestra oraria; riaprire solo con meccanismo non-calendario. Book/pesi INVARIATI. Diario `2026-07-17-weekend-window.md`; script `scripts/research/r0717_wk_{drift,cond,intra,overlay}.py`. - **Ondata 2026-07-25 (MAT01 + generalizzazione STATARB) — 0 sleeve nuovi, 1 DIFETTO DI DATO sul libro live trovato e riparato.** Diario `2026-07-25-mat01-statarb-generalization.md`. (1) **MAT01** (`r0725_mat01_multiasset_trend.py`, `r0725_mat01b_regime.py`): allargare il trend difensivo da 6 a **18 ETF multi-asset-class** (i 12 su disco dal 22/06, mai usati per un trend) a meccanismo GTAA CONGELATO = **SCARTATO**. MAT18 perde 3/4 finestre disgiunte; **a PARI VOL il suo minor DD si inverte** (−20.6% vs −15.4%) → era solo de-levering (**3ª occorrenza del null de-levering** dopo VRP-DD e TP01×DVOL: e' il primo test da fare su ogni claim "meno drawdown"); corr→crypto invariata (0.110 vs 0.116) → zero guadagno di diversificazione; book 2.22→2.19. **Risultato positivo da conservare:** la curva d'ampiezza e' monotona (mediana OOS 0.44 a k=1 → **0.80 a k=18**, DD −16.0%→−6.9%, satura a k≈10-12) — l'ampiezza E' un meccanismo reale, ma **GTAA6 sta gia' al 95° pctl dei 6-subset casuali** (e non e' cherry-picked: contiene TLT, il peggiore dei 18) → **niente piu' ampiezza da raccogliere su questo sleeve**. (2) **STATARB-MULTI** (`r0725_statarb_multi.py`): meccanismo congelato (W=45, sgn=+1) su tutte le **50 coppie alt/BTC** HL, out-of-pair-sample. REGGE: 82% Sharpe>0 (media 0.38), **0/50 degeneri** (mono 53% → non e' la statica short-alt travestita), perm p<0.05 nel 18% (atteso 5%), paniere Sharpe 0.82 / DD −6.0% / corr XS01 0.207. **E ETH/BTC e' al rango 22/50 (58° pctl): la coppia scopritrice NON e' un outlier** → per il gate 27/09 l'ipotesi "fortuna di una coppia" e' refutata. NON e' uno sleeve: ampiezza **effettiva ~4.5** (corr media 0.204, gamba BTC condivisa), paniere **IC95% [−0.12,1.72], t 1.31** (non distinguibile da zero a 2.6 anni), uplift −0.11 vs il null a priori "sempre short alt vs BTC", 51 gambe = STAT-MODE. ⚠ Errore di metodo corretto in-sessione: il primo null statico usava `sign(mean(segnale))` sull'intero campione = **look-ahead**; rifatto causale (media espandente) + a priori. (3) **STATARB-EQ** (`r0725_statarb_eq.py`): stesso meccanismo su **12 coppie ETF a priori, 28.5 anni, ampiezza effettiva 9.9** = **SCARTATO**. Paniere Sharpe **−1.00** (IC95% [−1.36,−0.64], t −5.33), negativo in **4/4 decadi**, 0% coppie a perm p<0.05. **Ma la lettura sta nel LORDO (−0.17, non −1.00): due terzi sono drag di turnover (0.40/g)** → **non esiste strategia specchio** (sgn=−1 sarebbe lorda +0.17, netta −0.16). Il segno lordo dice che **sulle azioni il residuo REVERTE debolmente mentre sul crypto CONTINUA** → il meccanismo e' plausibilmente crypto-specifico. Inferenza onesta: non prova che il crypto sia falso, ma il gate 27/09 **non puo' appoggiarsi** all'argomento "fenomeno universale". (4) **Addendum PRE-REGISTRATO al gate STATARB** (registrato a forward-day 26/90, 64g prima della decisione): `r0724_statarb_deploy_gate.py` riporta ora anche lo Sharpe della **statica sempre-short a pari vol-target sulla stessa finestra**. **Soglie del 24/07 NON toccate** (diagnostica non binding; renderla binding e' decisione dell'operatore). Lettura odierna (26 barre): STATARB +5.70 vs benchmark **−4.98**, e la posizione corrente e' LONG lo spread = opposta alla statica → la finestra forward non e' spiegata dal beta di regime. - ✅ **XSR01 "Cross-Sectional Residual" — CANDIDATO NUOVO in forward-monitor (2026-07-25).** `scripts/live/paper_xsr.py`; scoperta `r0725_statarb_basket_gate.py`, scettico `r0725_statarb_demean_skeptic.py`, gate `r0725_xsr_deploy_gate.py`, test `tests/test_paper_xsr.py`. **Cos'e':** il meccanismo congelato di STATARB-RESID (W=45, sgn=+1, residuo OLS causale su BTC, z-score, tanh, vol-target 20%) applicato ai **50 alt HL**, con posizioni **DEMEANATE cross-sezionalmente** ogni giorno. Il demeaning annulla ALGEBRICAMENTE la gamba BTC comune (`sum(p_i−p̄)(r_i−r_btc) = sum(p_i−p̄)r_i`) → non e' un paniere di coppie ma una **strategia cross-sectional dollar-neutral**, e l'ampiezza effettiva passa da **4.5 a 37.4**. **Numeri (2.6 anni):** Sharpe netta **1.82** (lorda 2.70), maxDD **−2.6%**, vol 2.3%, ret 4.2%/a. **Gate superati:** marginale **ADDS** (robust_oos + beats_noise_null + non-hedge + has_insample_edge); **deflated-Sharpe 0.985 PASS**; **corr ~0 a TUTTI e 5 gli sleeve** (TP01 0.060, XS01 −0.019, VRP01 −0.001, SKH01 0.001, GTAA01 0.071); book a w=15% HOLD 2.36→**2.51**, DD invariato. **Scettico superato:** 3 null **a fee-neutrale** (permutazione cross-sezionale / casuale / temporale a blocchi) centrati a ~0.01, candidato lordo 2.70 **sopra il massimo di 300 estrazioni** (p<0.004); **lag 1.82/1.19/0.81/0.51** a +0/1/2/3g = decadimento dolce di segnale lento, NON firma di look-ahead; non ridondante con XS-momentum semplice (corr 0.17-0.29). **NON nel book, 3 motivi dichiarati:** (a) storia 2.6a monoregime e **crescente** (Sh 2024 1.03 / 2025 1.98 / 2026 3.11) → l'edge e' recente; (b) **`weights_tilt_null` FALLITO** (gate_pass=False a 10% e 15%, delta_insample −0.004/−0.007: effetto della storia corta, ma un gate fallito resta fallito); (c) **margine di costo sottile** — 1.82 a 0.05%/gamba, **0.93 a 0.10%, NEGATIVA a 0.20%**, con turnover 38.5% del lordo/g su 50 alt anche illiquidi e **slippage NON modellato** (rischio #1). **Eseguibilita':** ticket/gamba $1.73 a $600 (**sotto min-order $5 → STAT-MODE oggi**), $5.76 a $2000, **$14.41 a $5000** → diventa reale a **~$5k**, non ai ~$20k di XS01. **Gate pre-registrato 2026-10-23** (forward-day 0): deploy solo se Sharpe≥1.0 **E** haircut di eseguibilita' a $5000 ≤40% (se l'haircut sfonda → **RITIRO a prescindere dallo Sharpe**), poi weights_tilt_null e capitale ≥$5k. Monitor in `cron_daily.sh`, 3 libri (MODELED $2000 / REAL $600 / REAL $5000). ⚠ Lezione: XSR01 **non e' nato da un'idea nuova ma dalla DIAGNOSI di un fallimento** (ampiezza effettiva 4.5 → c'e' un fattore comune da togliere); e i suoi null vanno confrontati **a fee zero**, perche' permutare un segnale ne fa esplodere il turnover e il null perderebbe per costo invece che per assenza di informazione (p-value trionfale e falso). - ⚠ **SPLIT NON AGGIUSTATI nel feed equity — difetto sul LIBRO LIVE, riparato (2026-07-25).** `data/raw/eq_iwm_1d.parquet` ed `eq_efa_1d.parquet` avevano uno split non aggiustato il **2005-06-09** (IWM 2:1 = −49.5%; EFA 3:1 = −66.5%); IB `ADJUSTED_LAST` non li aveva aggiustati. **La certificazione non li vedeva per un punto cieco strutturale:** l'unica guardia era `maxret > 50% → SPIKE?` e uno split 2:1 fa **esattamente −50%** → IWM passava a 49.5% con status OK. **IWM e' una delle 6 gambe di GTAA01 in produzione.** Impatto: GTAA6 FULL Sh 0.61→**0.64**, IS 0.49→**0.54**, OOS 2015+ e maxDD **INVARIATI** (artefatto nel 2005, fuori hold-out) → il difetto SOTTOSTIMAVA lo sleeve, **nessuna decisione presa va rivista**. Discriminante split-vs-crollo (riusabile): **non il rapporto** (SLV 2026-01-30 ha rapporto 1.3994, a 4bps da 1.4, ma e' un crollo vero: GLD −10.3% lo stesso giorno) ma il **RANGE INTRADAY** — lo split apre gia' al nuovo livello con range normale (IWM: open 47.00, range 1.7%), il crollo si muove DENTRO la barra (SLV: range 33%). Modulo `src/data/eq_splits.py` (`detect_unadjusted_splits` a 3 condizioni congiunte + `repair_splits` componibile), riparazione **in lettura** in `src/portfolio/gtaa.py::_close` e `scripts/research/eqlib.py::load_eq`, status **`SPLIT-NON-AGG`** in `fetch_ib_equities.certify()`, test `tests/test_eq_splits.py` (8 casi). **Regola nuova: ogni soglia di certificazione tarata su un valore tondo va controllata contro il difetto che genera esattamente quel valore** (una soglia a 50% non puo' sorvegliare gli split 2:1). - ⚠ **RENDITA / CURVA CAPITALE (2026-07-25, 2° filone del giorno) — il muro del 24/07 era ottimista 2-4x, e 1 DIFETTO DI ESEGUIBILITA' su GTAA01.** Script `r0725_capcurve.py` + `r0725_prop_config.py`, test `tests/test_capcurve.py` (10 casi); diario `2026-07-25-rendita-capcurve-prop.md`. Book/pesi/cron **INVARIATI**. (1) **GTAA01 non e' eseguibile come codificato.** `gtaa.py` modella 2bps proporzionali e lo sleeve e' documentato "switch mensile/basso turnover": FALSO — il vol-target e' **continuo giornaliero su 6 gambe**, e IB ha un **pavimento FISSO** `min(max($0.35, $0.0035/az), 1% valore)` per ordine = ~$530/anno indipendenti dal capitale. A $600: **CAGR −3.5% / Sh −0.55**; negativo fino a ~$3k; a $50k 0.59. **La banda lo salva**: plateau robusto **weekly x banda $25-100** → Sh 0.45-0.64 a ogni capitale (a $600: Sh 0.52 / CAGR 3.0%). ⚠ **Correzione a un errore MIO:** la prima stesura citava il modello vecchio a "0.77/5.5%" — era un **artefatto di annualizzazione** (metricavo la serie GTAA grezza a ~252 barre/anno con `metrics()` che annualizza a 365 → Sharpe ×1.20, CAGR ×1.45). Valore vero del modello vecchio: **0.64/3.8%**. **Quindi il difetto NON e' "sovrastimava di 0.13": alla taglia grande il modello vecchio era GIUSTO (0.64 vs 0.59-0.66 reali). Il difetto e' che era CIECO AL CAPITALE** — dava 0.64 sia a $50k sia a $600, dove la realta' e' −0.55. **Lezione: una serie su giorni di borsa (~252/anno) non si passa a `metrics()` (che annualizza a 365) senza `to_daily()` — il Sharpe esce ×1.20 e il CAGR ×1.45.** ✅ **FIX CABLATO** (stessa sessione, `src/portfolio/gtaa.py`): costo IB reale (`ib_commission`), esecuzione a **banda+cadenza** (settimanale, $50/gamba), `gtaa_returns(capital=...)` capital-aware, soglia `GTAA_MIN_CAPITAL=$3.000` + `gtaa_is_deployable`, e **`gtaa_rebalance_plan(held, capital)`** per l'esecutore (salta le gambe sotto banda). `sleeves.py` dichiara il capitale assunto (`GTAA_DEFAULT_CAPITAL=$10.000` ≈ book $50k al peso 20%). **Impatto book misurato: FULL 2.22→2.22, HOLD 2.36→2.38, DD 6.2→6.0%** = trascurabile alla taglia assunta; il fix conta per il **DEPLOY** (a $600-2k: da −3.5%/anno a +3.0%/anno). Pesi INVARIATI. Test `tests/test_gtaa_sleeve.py` (+4). **REGOLA NUOVA: il costo di un venue va modellato nella sua FORMA (fisso vs proporzionale), non solo nel livello** — due venue a pari "costo medio" danno esiti OPPOSTI al variare del capitale (il pavimento fisso e' una tassa regressiva). Controprova: su Deribit (proporzionale, senza pavimento) lo Sharpe realistico di TP01 = modellato da ~$500 in su → conferma indipendente di "a $600 il min-order $5 e' gia' la banda ottimale". (2) **La rendita NON e' `capitale x CAGR`.** Il 24/07 calcolava capitale = target/CAGR (€122k a CAGR 15%), ignorando il rischio di sequenza. Bootstrap a blocchi sui ritorni REALI (SKH01 su **path live**): rendita **perpetua** (= prelievo con P(cap a 20a >= cap iniziale) >= 90%) del book de-luckato ×0.6 = **5.98% → $497k**; SWR-20a 7.31% → $406k; lente modellata 13.57% → $219k. ~~Il muro vero e' una BANDA $232k-$497k, stima centrale ~$300-400k.~~ ⚠️ **AGGIORNATO 2026-07-26 — il ×0.6 era MISURATO troppo severo del 31-34% → il muro scende del ~45%.** Il fattore d'ancora onesto sul drift e' **×0.89** per il book live (misurato, non a occhio) e ogni componente del path live e' non-negativa (bullet in fondo). Ricalcolo con la STESSA macchineria (`r0726_capwall_refresh.py`): **perpetua 6.00% → 10.91%, muro $494.758 → $272.061** a leva 1.0 (a leva 1.5: $366k → $200k). Il ×0.89 e' un **limite inferiore** del fattore, quindi il muro vero sta fra la riga ×0.89 e la riga ×1.00 ($233k). **La conclusione STRUTTURALE non cambia:** $272k restano **~453× il conto di oggi** → i €600 come CAPITALE restano refutati, come BIGLIETTO (prop) no. Rendita a $600: €0.12/g → **€0.18/g** (centesimi: il fattore conta per il MURO e le soglie prop, non per il conto attuale). Cio' che NON dipende dalla lente: **la rendita perpetua vale ~45-55% del CAGR**, quindi ogni muro calcolato come `target/CAGR` sbaglia di un fattore ~2. **TRAIETTORIA da $600, ricalcolata col fattore corretto (26/07).** Il fattore agisce **due volte**: alza il drift (si accumula prima) E abbassa il bersaglio (serve meno capitale), e i due effetti pesano quasi uguale. Mediana degli anni per toccare il capitale-rendita: | dep./mese | ×0.60 muro $495k (25/07) | ×0.89 muro $495k (solo drift) | ×0.89 muro $272k (26/07) | |---|---|---|---| | €0 | mai | mai | **mai** | | €250 | 22.4a (8% entro 20a) | 19.6a (53%) | **16.2a (91%)** | | €500 | 19.6a (48%) | 15.7a (94%) | **12.4a (100%)** | | €1000 | 14.8a (95%) | 12.0a (100%) | **9.0a (100%)** | | €2000 | 10.0a (100%) | 8.5a (100%) | **6.0a (100%)** | ✅ La colonna ×0.60 **riproduce esattamente** i numeri del 25/07 (19.6a / 14.8a) = validazione indipendente della replica. ⚠️ **Cio' che NON cambia col fattore: senza depositi il capitale-rendita non si raggiunge mai** (0% dei path a 20 anni a OGNI fattore) — l'accumulo viene dai versamenti, non dal rendimento; e la mediana e' una MEDIANA (meta' dei path arriva dopo, una quota non arriva affatto). **QUANTO VERSARE PER UN ORIZZONTE DATO** (bersaglio $272k, ×0.89; "arrivarci in N anni" non e' un numero: dipende dalla confidenza): | orizzonte | P=50% | P=75% | P=90% | P=95% | totale versato @P=90% | |---|---|---|---|---|---| | **10 anni** | €806/m | €995/m | **€1.178/m** | €1.299/m | **$155.923** | | 15 anni | €313/m | €408/m | €509/m | €583/m | $101.643 | | 20 anni | €129/m | €180/m | €237/m | €280/m | $63.406 | ⚠️ **Comprimere l'orizzonte da 20 a 10 anni costa 2.5× al mese E 2.5× in totale**: a 10 anni versi $155k per arrivare a $272k (il rendimento fa il 43%), a 20 anni ne versi $63k (il rendimento fa il **77%**). **A orizzonti corti non fai lavorare la strategia, COMPRI il capitale coi bonifici** — il confronto onesto e' sempre `totale versato` vs bersaglio. Drill-down €250/m (5000 path): traguardo p10 13.4a / **mediana 16.2a** / p90 19.7a; P(entro 15a) **31%** → P(entro 20a) **92%** (la curva non da' segnali per un decennio e poi si muove tutta insieme: chi giudica al 5° anno giudica nel punto peggiore); al traguardo hai versato ~$54k su $272k → **80% viene dal rendimento**. ⚠️ Bug catturato in sessione: il contatore `paid` si congelava al traguardo mentre `cap` continuava a ricevere i depositi → rapporto capitale/versato gonfiato (46× invece di 25× a 30 anni); test di regressione cablato. (3) **Diversificare NON crea reddito a pari nozionale — libera BUDGET DI RISCHIO.** Per tier: iso-nozionale 2 sleeve 5.98% → 4 sleeve 6.35% (nulla, il diversificatore a basso CAGR toglie vol e ritorno insieme); a **ISO-RISCHIO** (vol 15%) 7.51%/$395k → **9.25%/$321k (−19% di muro)**. **REGOLA: un diversificatore a basso CAGR si giudica a ISO-RISCHIO, mai a iso-nozionale** (e' il null de-levering al contrario). L'ipotesi "piu' capitale → piu' sleeve → CAGR super-lineare" e' **REFUTATA nella forma forte**: la curva Sharpe del book eseguibile e' PIATTA da $600 a $200k. (4) ✅ **ASIMMETRIA CAPITALE-PROPRIO vs FUNDED (risultato strategico).** Il 24/07 valuto' il fronte prop **solo col book a 2 sleeve**; ma su un conto funded il capitale e' $100k → **gli sleeve STAT-MODE per taglia (XS01, ~$20k) diventano eseguibili**, e le regole prop passano sul **DRAWDOWN, non sul CAGR**. Finestra comune 2024+, de-luck, crypto-only: P(pass) HYRO 1.0x **44.4%→54.7%**, FTMO 1.5x **51.9%→70.0%**; **funded HYRO 1.0x P(vivo 1a) 18.9%→57.6% (3x)**, FTMO 1.0x 58.8%→**92.0%**, E[payout] $8.7k→$9.3k (~€15.7/g atteso). **Si RIBALTA la raccomandazione "funded a 0.75x"**: col book diversificato 1.0x e' sostenibile. **In una riga: sul capitale proprio diversificare non aumenta il reddito; su un conto funded si', perche' li' il vincolo binding e' la regola di DD, non il capitale → gli sleeve "inutili a $600" sono gli asset di maggior valore sull'unico canale che scala.** ⚠ CAVEAT: MC **close-only** (C-bis 24/07: i wick tagliano 6-37pp) → livelli assoluti = TETTO, il DELTA e' la misura onesta ed e' conservativo (B ha vol minore); la finestra comune 2024+ e' quella in cui XS01 e' stato scoperto/affinato → la TAGLIA del guadagno e' ottimista (finestra piena: 56.9%→58.5%), il MECCANISMO (corr bassa → meno DD → piu' sopravvivenza sotto vincolo di DD) e' robusto. (5) ✅ **LA VIA: i 600 euro come BIGLIETTO, e il problema della correlazione fra conti** (`r0725_prop_ladder.py`). I €600 come capitale sono refutati; come **biglietto** no: si compra un'eval, il funded moltiplica il NOZIONALE senza possedere capitale, i payout comprano altri biglietti. Il 24/07 si fermava a UN conto (cap $200k/firm → ~€15-30/g); **50 EUR/g richiede piu' conti**, e li' il problema mai studiato: **N conti sullo STESSO book bustano INSIEME** (corr 1.0) → la diversificazione fra conti e' illusoria salvo **sleeve diversi su conti diversi**. E' un problema di portafoglio sotto **barriera di rovina PER-CONTO**. Sim 36 mesi, €600, max 6 conti, 2 firm, regole vere, payout mensile prelevato subito, fisco 33%, **morte-firm 10%/anno**, bootstrap CONGIUNTO (corr reali). **Vince il MISTO, non gli estremi** (close-only, leva 1.0x): MISTO mediana €10.70/g, P(≥50/g) 20.7%, P(zero) 33.4% > CONC-DIV 5.70/17.8%/33.4% > SPARSO 0.00/16.8%/**66.0%** > **CONC-2SL (= il book live attuale) 0.00/13.1%/55.6% = la PEGGIORE**. Logica: ogni conto serve Sharpe per sopravvivere alla PROPRIA barriera (uccide SPARSO), ma i conti servono decorrelati fra loro (penalizza CONC). **Con lente INTRADAY (wick)** tutto crolla: P(≥50/g) 1.6-2.5%, P(zero) 78-90%. ⚠ Il mio wick e' un **PAVIMENTO**: gap estratto INDIPENDENTE dal rendimento del giorno → breach spuri → **follow-up dichiarato, poi CHIUSO lo stesso giorno (bullet successivo): la stima onesta e' P(≥50/g) ~6%, P(zero) 52-65%.** Il confronto fra POLITICHE e' robusto (stessa lente per tutte) — **verificato a posteriori sulla lente accoppiata: l'ordine MISTO ≥ CONC-DIV > CONC-2SL ≈ SPARSO regge a tutte e 3 le lenti** → **se si apre il fronte prop, NON mandarci il book live attuale**. (6) **ADDENDUM "e se metto 10K su IB?"** (`r0725_ib10k.py`): allocazione fra venue, non domanda su GTAA01. Deribit = **motore** (CAGR ~11% de-luck), IB/GTAA01 = **diversificatore** (CAGR ~3.9%). A $11.5k totali: 0% su IB → **€2.16/g**; 50% → €1.54/g (Sharpe migliore 1.13, DD 15.3→11.2%); **94% (= i 10k su IB) → €0.93/g = REDDITO PIU' CHE DIMEZZATO**. La via d'uscita (levare per convertire lo Sharpe in reddito) e' **chiusa dai costi**: su ETF a IB con €10k c'e' Reg-T **2x max** (portfolio margin da ~$110k) e il margine costa **~5.5%/anno** → contando il finanziamento vince **tutto-Deribit a 1.33x** (rendita €1.33/g vs €0.92/g a 50/50). **REGOLA: l'argomento iso-rischio (punto 3) vale solo se la leva e' (a) disponibile e (b) a costo < uplift — su un retail da €10k su ETF non lo e'.** Confronto che ridimensiona GTAA01: €10k nello sleeve = €0.93/g con maxDD 10.5%, gli stessi €10k FERMI a ~2% = €0.54/g con maxDD ~0% → **premio ~€0.50/g pagato con un DD del 10%**. Raccomandazione: i depositi vanno su **Deribit**; al massimo **25% su IB** (costa ~€0.08/g di rendita, taglia il maxDD 15.3→12.0%, unico split che regge coi costi). ⚠ Il confronto FAVORISCE il crypto per costruzione (7 anni con 2 bull vs 30 anni di GTAA); tassi e aliquote (26%/33%) sono assunzioni dichiarate, da confermare col commercialista (non un parere fiscale). (7) **HYROTRADER nello specifico** (`r0725_hyro.py`): la firm meglio classificata per questo book (API reale da funded, nessun limite di tempo, **weekend consentito** — e il weekend porta il 38% del gross di TP01). **Ipotesi REFUTATA: la regola di consistency 40% NON morde** (costo ≈0pp a ogni leva/lente) perche' il book accumula il 10% in 130-300 giorni → nessun giorno si avvicina al 40% del cumulato; ⚠ prima di dichiararlo ho dovuto **provare che il controllo funziona** (un "costo 0" puo' essere un bug): su un book con profitto concentrato in 1-2 giorni la regola porta P(pass) da >90% a <5% (test cablato). **Il vincolo vero e' il maxDD 6% STATICO**: config A (book live) ha maxDD 9.5% > 6% = strutturalmente incompatibile a leva piena — intraday a 1.0x sopravvive l'**1.4%**; config B (+XS01) ha maxDD 6.2%, Sharpe 1.13. ~~**Funded consigliato: config B a 0.50x**~~ → **CORRETTO a 0.75x dalla lente accoppiata (bullet successivo)**: il 0.50x era scelto perche' il wick indipendente dava a 0.75x P(vivo) 55%; la lente onesta da' **76%**, e 0.75x **massimizza il payout atteso su 3 anni** ($2.674 vs $1.230 a 0.50x e $1.992 a 1.00x). L'argomento "la sopravvivenza COMPONE su piu' anni" resta valido: si sposta il punto in cui morde. EV del biglietto $100k **positivo in entrambe le lenti** (+$6.789 close-only, +$1.166 intraday), ma ~69% di perdere la fee nella lente pessimista. Cap $200k/trader ⇒ ~€15-30/g max → per €50/g servono piu' firm (punto 5). ✅ Discrepanza col 24/07 (P(vivo) A@0.75x 58% vs 10% mio) **RISOLTA: non era la finestra, era la lente** — sulla stessa finestra piena la lente accoppiata da' **63.2%** vs il 58% del 24/07 (accordo entro 5pp, implementazioni separate). ⚠ Bug catturato in sessione: base di prelievo funded aggiornata giornalmente come HWM mobile → guadagno al checkpoint ≈ 0 → **payout $230/anno invece di ~$7.000**; regole vere = max-loss STATICO dal saldo iniziale + base ripristinata dopo il prelievo. Test di regressione cablato. - ✅ **LENTE WICK ACCOPPIATA (2026-07-25, follow-up del bullet precedente — CHIUSO).** Script `r0725_prop_coupled.py`, test `tests/test_prop_coupled.py` (13 casi), diario `2026-07-25-prop-wick-accoppiato.md`. Book/pesi/cron **INVARIATI**. Generalizza il recon MTM di `r0724_goal50_intraday_mc.py`: (a) sleeve TP01/SKH01 **separati** a risoluzione oraria → il minimo intraday si compone ESATTO per QUALSIASI vettore di pesi (prima erano cablati 75/25); (b) **XS01 accoppiato** dagli OHLC giornalieri HL (4 checkpoint, ordine condiviso avverso; recon = sleeve ufficiale a `max|Δ|=0.0`). ⚠️ **IL FINDING: la CALIBRAZIONE del wick era giusta, l'errore era l'INDIPENDENZA.** Le marginali coincidono quasi (p50 −0.17pp **identico**, p90 −1.03 vs −0.90, p99 −2.70 vs −3.50) — sbagliava **su quali giorni** cadono i tuffi. E la dipendenza va nel **verso inatteso**: il gap e' ~**3× piu' profondo nei giorni che finiscono BENE** (−1.58pp nel decile migliore vs −0.48pp nel peggiore), perche' un giorno brutto scende tutto il giorno e **chiude sul minimo** (`m==R` nel **26%** dei giorni). Il breach si valuta sul minimo → l'estrazione indipendente carica i giorni brutti con la coda dei giorni buoni e **raddoppia i breach da daily-loss (2.0-2.9×, misurato sui giorni storici)**. **`close-only` non e' conservativa, e' CIECA**: 0.00% di breach da daily-loss su OGNI configurazione (la regola non scatta mai sulle chiusure) → usarla come controllo, mai come stima. **Verifiche (un "nessuna differenza" va provato):** (1) **1h vs 5m** sulla gamba TP01 = identici (p99 −3.06 vs −3.14pp) → **il caveat di risoluzione portato avanti dal 24/07 e' quantificato e trascurabile**, l'ora cattura gia' il minimo del giorno; (2) riconciliazione col 24/07 (sopra); (3) **bound severo su XS01** (ogni gamba al proprio peggio insieme): config B resta sopra config A (P(vivo) 57.6% vs 39.4%) → la conclusione non dipende dalla convenzione. **Decisioni:** funded **0.75x** (non 0.50x, vedi sopra); scala di conti **P(≥50/g) ~5.6-6.5%** in 3 anni (non 1.6-2.5% ne' 20.7%) con **P(zero) 52% a 0.75x / 65% a 1.00x**, e **P(≥10/g) massima a 0.75x (29.7%)** = stesso ottimo di leva del conto singolo. **Ordine fra politiche INVARIATO a tutte e 3 le lenti.** Verdetto ristretto: **€600→€50/g ≈ 6% in 3 anni, P(perdere i €600) ≈ 52-65%** — resta coda destra, ma con probabilita' conoscibile invece di una banda di un ordine di grandezza. **REGOLA NUOVA: un modello di rischio intraday NON si valida sulla marginale del wick ma sul suo ACCOPPIAMENTO al rendimento del giorno** — qui un test "i percentili coincidono" sarebbe PASSATO con la stima sbagliata di 2-3×. Ogni regola valutata sul minimo (daily-loss, trailing DD, stop di conto) va misurata su **tuple accoppiate**, mai su un wick estratto a parte. - **Ondata 2026-07-26-bis (TP01 su barra parziale + i 2 gate mai costruiti) — 0 sleeve nuovi, 1 audit sul libro live, 2 gate codificati, 1 falso positivo MIO su uno sleeve in produzione.** Script `r0726_tp01_partial_day.py` + `r0726_gates_retro.py`, test `tests/test_gates_implausible_anchor.py` (13), diario `2026-07-26-wave-tp01-partial-gates.md`. **Book/pesi/cron/config INVARIATI.** (1) **T1 — anche TP01 legge una barra giornaliera PARZIALE nel live, ma non conta.** Stesso fatto strutturale di SKH01: `resample_tf` non scarta il giorno in corso e `current_target` prende `[-1]`; il feed si ricostruisce alle 00:30 UTC → tutto il giorno il book vede oggi come **1 barra oraria su 24** (verificato `barre1h=1/24`). Docstring "ultima barra CHIUSA" **falso**, corretto (3ª volta in 2 giorni che un docstring di produzione dichiara una causalita' che il codice non ha). Tre path a un grado di liberta' per volta, 24 ancore, **differenze appaiate**: *barra parziale* ΔFULL **−0.031** (pos. 7/24) / ΔHOLD **+0.118** (pos. 19/24); *ritardo d'esecuzione 1h* **−0.004** (11/24 = moneta); leva gonfiata **+0.4%**. → **trascurabile, nessun cambio al live.** ⚠️ All'ancora canonica sembra peggio del vero: a offset 0 la parziale costa **−0.230** di hold-out = **il minimo dell'intera banda** (mediana +0.118) → guardando solo l'ancora canonica avrei concluso "il live degrada TP01": speculare alla lezione del 26/07 (li' l'ancora canonica *nascondeva* un vantaggio, qui *inventa* un danno). **REGOLA NUOVA (il risultato trasferibile):** la parzialita' dell'ultima barra conta **in proporzione a quanto il segnale pesa la barra piu' recente**. SKH01 = Donchian breakout su 230m, la barra corrente E' il segnale → **+0.38**; TP01 = TSMOM 30/90/180g, l'ora mancante e' 1/24 di UNA osservazione su 30-180 → **±0.03**. **La conclusione non si trasferisce fra sleeve.** (2) **T2 — `implausible_sharpe` e `anchor_luck_band` CODIFICATI in `altlib.py`** (debito raccomandato 3 volte — 26/06 CC01, 02/07 Albimarini "con piu' forza" — e mai scritto). `implausible_sharpe`: Sharpe>3, perdite/attive<2%, Calmar>20 o maxDD~0, **regola del tre** (0 perdite su N → tasso vero fino a 3/N: e' perche' "0/142" non si legge "senza rischio"). `anchor_luck_band`: la griglia d'ancore NON e' una griglia di parametri → **il deflated-Sharpe non la conta**; riporta stima onesta = **mediana della banda** e fortuna = canonica − mediana. `anchor_luck_delta`: **mediana delle differenze appaiate** (codifica l'errore del 26/07). ⚠️ **Il gate ha segnalato VRP01 e il difetto era MIO:** perdite contate su TUTTE le barre, ma VRP01 e' settimanale su griglia giornaliera = **94.2% di zeri** → "0.96%, coda assente" su uno sleeve **in produzione**; sulle barre **ATTIVE** e' **16.5%**, la forma giusta di un credit spread a rischio definito. **E la lezione era gia' cablata il giorno prima** nel monitor DVOLSPREAD ("barre attive, non giorni di calendario") — imparata in un contesto, non applicata nell'altro. Zeri per sleeve: VRP01 94.2 / SKH01 87.6 / XS01 39.6 / GTAA01 31.9 / TP01 30.7%. **Applicazione retroattiva 7/7 — tutti ok:** TP01 1.29, XS01 1.36, VRP01 1.08, SKH01 1.45, GTAA01 1.01, **XSR01 1.79 (DD 2.5% ma 47.8% di barre attive in perdita → il DD basso e' vol bassa + dollar-neutrality, NON una coda mancante: per il gate del 23/10 il rischio #1 resta lo slippage)**, DVOLSPREAD 0.68. Controlli positivi obbligatori superati (firme CC01 e deep-OTM segnalate, rumore Sh 0.62 no) — *un gate che non segnala nulla puo' essere semplicemente rotto*. ✅ **Replica indipendente del finding d'ancora del 02/07:** il gate applicato alla cieca a TP01 ritrova canonica **+0.237 = 92° pctl** delle 24, **mediana onesta +0.056**, banda [−0.087,+0.247], fortuna +0.182 — contro mediana 0.04 / banda [−0.13,+0.30] misurate il 02/07 con implementazione SEPARATA. **L'hold-out onesto di TP01 e' ~+0.05, non 0.31** (il valore del sleeve resta il taglio del DD ~6× vs buy&hold, che non e' ancorato). (3) ~~**NON fatto e perche':** il book sul path live e' bloccato da una **incompatibilita' di lenti** — il simulatore SKH01 compone per-trade a nozionale unitario, lo sleeve e' vol-targeted. Follow-up dichiarato: serve la versione vol-targeted del path live di SKH01.~~ ✅ **CHIUSO 2026-07-26 — E IL BLOCCO NON ESISTEVA: la premessa era FALSA.** Lo sleeve SKH01 **non e' vol-targeted** (`backtest_signals(..., leverage=1.0, position_size=1.0)`, nessun `target_vol` nel sorgente, e `sim_equity(canonical)` riproduce `backtest_signals` a **max|diff| = 0.0**): le due lenti erano gia' la stessa cosa. Il 20.7% di vol realizzata dello sleeve — probabilmente cio' che aveva suggerito "vol-target 20%" — e' un **prodotto** della strategia (uscite % asimmetriche + poco tempo a mercato), non un parametro; **SKH01 e' l'unica delle 5 a NON essere vol-targeted**, il contrario di quanto si credeva. Vedi bullet dedicato in fondo e diario `2026-07-26-skh-live-book-deluck.md`. **REGOLA: un blocco dichiarato e' un'ipotesi, non un fatto — si ri-verifica prima di costruirci sopra o di rimandare** (qui: tre sessioni di follow-up rimandato contro due minuti di verifica). - **Ondata 2026-07-26 (3 filoni: esecuzione SKH01 / DVOLSPREAD / XSR01 fuori dal crypto) — 0 sleeve nuovi, 1 raccomandazione operativa aperta, 1 lead promosso, 1 falsificazione.** Script `r0726_{skh_onbook,dvolspread_gate,xsr_equity}.py`, test `tests/test_wave_0726.py` (11 casi), diario `2026-07-26-wave-esecuzione-dvolspread-xsr-equity.md`. **Book/pesi/cron INVARIATI.** (1) ⚠️ **T1 — IL DEGRADO D'ESECUZIONE DI SKH01 ERA ANCH'ESSO FORTUNA D'ANCORA.** Testato l'unico meccanismo che non e' un cron (ordini **resting on-book**: TP = limit al livello per costruzione + fee maker; SL = stop-market). A **offset 0** l'on-book recupera il **94%** del degrado — ma l'audit 02/07 aveva de-luckato i numeri headline di SKH01 e **NON il degrado**, misurato solo a off0. Sulla banda appaiata dei 23 offset il degrado massimo recuperabile e' **+0.054 Sh di book**, non −0.35 di sleeve. ⚠️ Errore di metodo mio, corretto in sessione: **mediana(A)−mediana(B) fra offset e' sbagliato** (confronta offset diversi) → serve la **mediana delle DIFFERENZE appaiate**; con quella il verdetto si RIBALTA. Esito: **solo TP a limite = +0.054 FULL / +0.061 HOLD, positivo in 19/23 (FULL) e 21/23 (HOLD) offset**; **lo SL on-book PEGGIORA** (contributo mediano −0.010, positivo in **11/23 = moneta**) perche' cristallizza la perdita al livello mentre l'exit software ritardata incassa il rimbalzo — e sopra **0.50% di slippage** l'on-book e' peggio del live. Meccanismo misurato: sulle uscite TP il fill orario **batte** il livello nel 42% dei casi (vantaggio medio −0.035%) → il limit TP converte una lotteria in certezza piu' che aggiungere ritorno; solo l'**1% degli SL gappa** davvero a 5m. **RACCOMANDAZIONE NON ESEGUITA (decisione dell'operatore): TP come limit resting reduce-only, SL strategico NON on-book.** E' un cambio di esecuzione (non passa `weights_tilt_null`) ma piccolo, da pesare contro ordini orfani/doppio fill. Il disaster-SL −30% on-book resta com'e'. ❌ **T1 NON IMPLEMENTATO — e il perche' e' una CORREZIONE DI MODELLO** (2026-07-26, diario `2026-07-26-t1-esecuzione-skh-live.md`). Leggendo il codice di produzione: TP01 e SKH01 tradano lo **stesso strumento** con **una sola posizione netta** Deribit → un ordine on-book al livello di SKH chiuderebbe anche quota TP01. Misurati i 2 ostacoli: (A) segno compatibile nel **97%** dei trade che escono in TP (long 100%, short 94%) = risolvibile; (B) divergenza modello/live che sembrava bloccante (ritardo mediano 115 min, **70%** dei TP con ≥1 cron dentro la finestra). ⚠️ **MA (B) NON ESISTE: `resample_5m` NON scarta il bin 230m in corso** (verificato: 21 barre 5m su 46 nell'ultimo bin) **e `_skyhook_positions` ci itera dentro** → il live rileva gia' SL/TP **intra-barra**, entro ~1h dal tocco. I docstring che dicevano "usa solo barre chiuse" / "latenza fino alla chiusura della barra 230m" erano **FALSI** e hanno guidato 3 analisi (02/07, 24/07, T1) — **corretti sul posto**. Conseguenza: la lente `hourly` **sottostima il path live di +0.081 Sharpe FULL di book (23/23 offset, banda appaiata)**, il live vero sta **sopra il canonical** sul FULL, e **il fix richiesto sarebbe un DECLASSAMENTO** (+0.054 vs +0.081) in cambio di ordini parziali sul netto in un percorso con soldi veri. → non fatto, per misura, non per difficolta'. ✅ **CABLATO INVECE il problema vero trovato per strada:** `fresh_5m` **fallisce in SILENZIO** (fallback al feed certificato, rigenerato 1x/giorno) → la latenza d'uscita di SKH01 passa da ~1h a **~1 giorno** senza che nulla lo segnali (conto online, posizione leggibile, e il gate di staleness guarda il feed di TP01: **nessun controllo esistente scatta**). Stesso schema del feed-freeze del 14/07, su un altro feed. Aggiunti: `livefeed.feed_age_minutes` (pura, eta' dalla CHIUSURA della barra, `None`=non misurata, clamp sugli skew), `book_report.skh_feed_age_min` (max fra gli asset), allerta Telegram in `book_execute` sopra `skh_feed_max_age_min`=**30 min**. **Scelta dichiarata: ALLERTA, NON blocca** — bloccare fermerebbe anche TP01 (nettato sullo stesso strumento) per un guasto di rete, e forzare SKH flat chiuderebbe posizioni buone su un glitch. Test `tests/test_skh_feed_freshness.py` (11 casi). Strategia/pesi/cadenza INVARIATI. ✅ **FOLLOW-UP CHIUSO 2026-07-26 — la misura dedicata sugli INGRESSI e' fatta: NON e' un difetto, il verso e' LASCIARLO.** `scripts/research/r0726_skh_partial_entry.py`, test `tests/test_skh_partial_entry.py` (10), diario `2026-07-26-skh-partial-entry.md`. Confronto di due path identici in tutto (livelli, uscite intra-barra, cap, fee) tranne **quando si valuta l'ingresso**: LIVE = a ogni confine orario dentro il bin 230m (cio' che il cron fa oggi), BACKTEST = solo a chiusura di bin. **ΔSharpe su 3 offset x 2 asset: −0.01/+0.04/+0.44/+0.32/+0.59/ +0.98 → 6/6 non negativi, mediana +0.38.** All'offset 0 (l'ancora fortunata del backtest, 93-98° pctl) l'effetto e' ~0 sul FULL ma l'hold-out BTC fa **1.12 live vs 0.71 backtest**. I falsi ingressi (segnale che evapora) sono **~5/anno/asset**, e cannibalizzano il cap `max_per_day` solo 2-3 volte in 7 anni (0.6-0.9% degli ingressi veri). **Meccanismo:** SKH01 e' un Donchian breakout — aspettare fino a 230 min la chiusura del bin fa *pagare il movimento gia' avvenuto* (ingresso **0.25-0.26% peggiore** in media); e siccome i livelli sono percentuali sull'ingresso (long sl4%/tp10%, short sl2%/tp8%), lo stesso 0.26% vale il **6-13% della distanza dallo SL** contro il 2.6-3.3% di quella dal TP → vantaggio **asimmetrico a favore della sopravvivenza del trade** (win rate +8pp ETH/+2pp BTC). **Due attacchi superati:** (a) il divario NON e' concentrato — togliendo i 5 giorni migliori si ALLARGA (ETH@460 35.6x vs 3.0x); e' il *backtest* il path concentrato (~39% del log-equity in 5 giorni contro 17-22% del live); (b) **nessun look-ahead intra-bin** — troncando i 5m alle sole barre gia' chiuse la risposta e' identica in **289/289** osservazioni intra-bin e il prezzo d'ingresso e' sempre l'ultimo close 5m disponibile (test permanente `test_nessun_lookahead_intra_bin`; serviva perche' il self-check valida solo a **chiusura** di bin → un leak solo-intra-bin gli sarebbe invisibile per costruzione). ⚠️ **La lettura che conta e' la seconda: live e backtest girano due strategie DIVERSE e la differenza non e' neutra.** Ogni numero di SKH01 nel progetto (Sharpe standalone, peso 25%, audit d'ancora 02/07, conferma peso/cadenza 24/07) e' calcolato sul path a chiusura di bin, che non e' quello che gira. Sommato alla misura del 26/07 sulle uscite (+0.081 Sharpe FULL di book sottostimato), **il path live di SKH01 e' stato modellato in modo sistematicamente pessimistico su ENTRAMBI i lati.** Cio' che NON si conclude: che l'ingresso intra-bin sia un miglioramento *validato* — e' stato misurato sugli stessi 7 anni su cui SKH01 e' stato selezionato, non e' passato per `study_family_honest` ne' per un deflated-Sharpe, e la taglia varia molto fra ancore. Ma non serve promuoverlo: **e' gia' cio' che il live fa**; l'azione e' smettere di trattare il numero del backtest come l'aspettativa del live, NON "riparare" il live verso un backtest peggiore. **Book, pesi, cron, config INVARIATI.** ⚠️ **Regole nuove (due errori catturati in sessione, entrambi del tipo che passa i test pigri):** (i) **un self-check su eventi rari si campiona sugli EVENTI, non sulla popolazione** — la prima stesura stampava "BTC 80/80 OK" mentre la ricostruzione era rotta da un off-by-one di confine (`obs//MS_LTF` a chiusura cade nel bin successivo, vuoto → segnale 0): con gli ingressi al ~2% dei bin confrontava **zeri con zeri**, potenza zero, e le 2 sole divergenze ETH erano gli unici 2 bin con segnale vero. (ii) **un conteggio di eventi su segnale GREZZO non e' un conteggio di trade** — la prima scansione dava 1361 falsi ingressi e un costo inventato di −3%/anno di sleeve perche' ignorava cap+non-overlap del live (**sovrastima ~20x**); la spia era 305 *giorni* con un falso ingresso a fronte di 663 "eventi", impossibile con cap 1/giorno. (2) ✅ **T2 — DVOLSPREAD ESCE DAL LIMBO** (era fermo dal 21/06, unico sopravvissuto del marginal scorer indurito, mai ripreso: non nel book, non in monitor, non rifiutato). Passato ai due gate che nel giugno NON esistevano. ⚠️ La griglia dichiarata dall'agente ("72 celle") ne contiene **729** (6 assi x 3) → valutate tutte, scelta conservativa (piu' trial = DSR piu' basso). Plateau REALE e larghissimo: **729/729 celle con hold-out positivo**, FULL [0.60,0.71]. Selection-on-holdout **confermata ma mite**: la cella pubblicata e' **83ª/729 sull'hold-out ma 471ª/729 in-sample**. Scegliendo onestamente in-sample: **FULL 0.68 / HOLD 0.69** (non il **0.93** pubblicato — **citare 0.69**) e **DSR 0.953 PASS**, mentre la cella pubblicata **FALLISCE (0.947)**. Marginale ADDS + robust_oos + multicut + non-hedge + insample_edge + beats_noise; corr +0.11, alpha +7.4%/a, dSharpe book **+0.08 FULL / +0.17 HOLD** a w=15%. **PROMOSSO a forward-monitor con i parametri ONESTI** (zwin=180 k=2.0 lw=0.6 zw=1.1 tgt=0.17 svw=60), **NON nel book**: campione **ATTIVO 1949/2691 g** (prima del 2021-03 non c'e' DVOL, book flat) con **hold-out attivo 1.6 anni**, margine DSR sul filo, e `weights_tilt_null` mai affrontato. ✅ **MONITOR CABLATO** (stessa sessione): `scripts/live/paper_dvolspread.py` in `cron_daily.sh` dopo `fetch_dvol.py`, stato `data/paper_dvolspread/` (gitignored), test `tests/test_paper_dvolspread.py` (10 casi). Inception **2026-07-25**, apertura +0.184 = **$111/gamba** (cap $300), 2 libri MODELED $2000 / REAL $600. ⚠️ **Strumentazione specifica:** il book va **flat quando manca il DVOL** → un feed rotto produrrebbe zeri che, contati come evidenza, direbbero "nessuna perdita" invece di "nessuna misura". Contabilita' a **3 stati** (ATTIVE / flat-da-segnale / **flat-senza-dato**) e finestra misurata in **barre attive**, non giorni di calendario; guardia sulla config che **esce 1** se `FROZEN` diverge dallo stato salvato. **GATE PRE-REGISTRATO:** kill **2026-10-24** se Sharpe forward < −0.50; decisione **2027-01-24** solo se TUTTE — (a) Sharpe>0 [debole di proposito: con ~180 barre SE(Sharpe)≈1.4, una soglia alta sarebbe finta precisione] (b) marginale ancora ADDS+robust_oos+insample_edge (c) **deflated-Sharpe ricalcolato ≥0.95** [e' qui il peso: se lo 0.953 gia' sul filo NON migliora con piu' dati, l'edge non c'e'] (d) `weights_tilt_null`; **veto d'integrita'** se barre attive <80% → si ESTENDE, non si decide su dati mancanti. (3) ❌ **T3 — XSR01 NON GENERALIZZA fuori dal crypto** (meccanismo CONGELATO W=45/sgn=+1 su **9 settoriali SPDR 1998+ / 28 ETF 30 anni**, residuo vs SPY, demean giornaliero, split IWM/EFA riparati, **annualizzazione √252**). Diverso dal test del 25/07: quello era a **coppie**, questo e' la versione **DEMEANATA** (quella vera di XSR01). Lordo **+0.24 (SECT9, p=0.193)** e **−0.14 (ALL28, p=0.747)** vs null di permutazione **a fee zero**; netto −1.6/−1.8 ovunque; per decennio stesso profilo nei 2 universi (neg. 1998-2005, debolmente pos. poi) = piu' cambio di regime che edge. **Il risultato che conta non e' lo Sharpe ma l'AMPIEZZA:** il demeaning porta l'ampiezza effettiva **4.5→37.4 (8x) sul crypto** ma solo **5.3→6.2 / 8.4→11.3 (1.2-1.35x) sulle azioni**. Spiegazione strutturale (e migliore descrizione di XSR01 di quella della sua scoperta): il residuo OLS rimuove gia' il beta al fattore comune; sul crypto alle gambe **RESTA** un enorme fattore comune (ampiezza 4.5 su 50 gambe) ed e' quello che il demean toglie — sulle azioni il residuo-vs-SPY e' **gia'** quasi indipendente, quindi non c'e' niente da togliere. **Per il gate del 23/10:** conferma e CHIUDE la scappatoia lasciata aperta dal test a coppie; XSR01 e' **crypto-specifico**. NON prova che sia falso. **Soglie del gate NON toccate**: resta appoggiato interamente su finestra forward + haircut di eseguibilita' a $5.000, come pre-registrato. **LEZIONI:** (a) **se si de-lucka una strategia va de-luckato anche il suo DEGRADO** — ogni Δ fra due varianti misurato su griglia ancorata eredita la fortuna dell'ancora; (b) su offset appaiati la statistica e' la **mediana delle differenze**, non la differenza delle mediane; (c) **un lead "in forward-monitor" senza monitor e senza scadenza e' un lead perso** (DVOLSPREAD: 35 giorni di limbo) → applicare ai lead la stessa disciplina dei candidati (config congelata + gate pre-registrato + cron); (d) il claim di multiple-testing di un agente va **ricontato**, non creduto (72 dichiarate, 729 reali); (e) quando un meccanismo non generalizza, **chiedersi PERCHE' vale piu' del fatto che non generalizzi**. - ⚠️ **LEAVE-ONE-OUT DEL BOOK DE-LUCKATO (2026-07-26, 3° filone del giorno) — la classifica dei contributi si RIBALTA su 2 metriche su 3, e la stima de-luckata del book era ottimista.** Domanda: *"quale sleeve terrei?"*. Script `scripts/research/r0726_loo_deluck.py`, test `tests/test_loo_deluck.py` (9), diario `2026-07-26-loo-deluck.md`. **Book/pesi/cron/config INVARIATI** (non è un gate sui pesi: quello resta `weights_tilt_null`). (1) **Il metodo:** un leave-one-out **è un Δ**, quindi eredita la fortuna d'ancora come ogni Δ (lezione 26/07). Con 4 sleeve su 5 ancorati il problema è congiunto → 2000 estrazioni uniformi indipendenti sullo spazio 24×10×7×23×5, book completo + 5 LOO **alla stessa configurazione**, statistica = **mediana delle differenze appaiate**. Sanity bit-exact 5/5 (`max|dif| = 0.0`) sulle repliche ancorate — quattro riusate dagli audit 02/07-03/07, solo la fase di GTAA01 è nuova. (2) **Contributi de-luckati** (mediana, e **frazione di estrazioni positive** — che conta più della mediana): **TP01 +0.390 FULL (100%)** = quasi 3× il secondo, e il canonico lo **SOTTOSTIMAVA** (+0.280 al 5.8° pctl); SKH01 +0.142 (91%), XS01 +0.125 (99.9%), VRP01 +0.122 (100%), GTAA01 +0.115 (100%). (3) **Due giudizi ribaltati rispetto alla lente canonica.** **SKH01 non è il motore del book**: l'ancora regala **2/3 del FULL** (+0.43→+0.14), **70% dell'hold-out** (+0.65→+0.19), **80% della protezione DD** (+1.64pp→+0.32pp) → de-luckato è **il meno affidabile dei cinque**. **GTAA01 è l'unico positivo nel 100% delle estrazioni su TUTTE E TRE le metriche** e il miglior protettore di DD (+2.0pp, doppio del secondo), senza fortuna da restituire (canonico *sotto* la mediana su FULL e DD). ⚠️ Ma **attribuzione ≠ eseguibilità**: sotto `GTAA_MIN_CAPITAL` $3k resta non deployabile, e la nota del 25/07 (€0.50/g sopra il risk-free con maxDD 10% a $10k) è intatta. (4) **TP01: hold-out negativo −0.200, e NON è artefatto d'ancora** (negativo nel **99.1%** delle configurazioni) — mentre sul FULL è il maggior contributore. È la firma dell'assicurazione, misurata: paga premio negli anni senza incendio, riprende tutto sul campione che contiene il 2022. **Regola: uno sleeve difensivo si giudica sul sinistro, non sul premio** — l'hold-out negativo non è un argomento per ridurlo. **XS01: protezione DD ESATTAMENTE ZERO** (mediana 0.000, positiva nel 43% = moneta) → è un diversificatore di **rendimento, non di rischio**; conta perché sul canale funded il vincolo binding è il DD (25/07 §4). **VRP01: 2ª conferma di zero fortuna** (canonico al 1.8° pctl sul FULL = numeri di ammissione *conservativi*). (5) **Contrappeso dovuto a SKH01:** il de-luck lo penalizza sul path **backtest**, ma il path **live** è misurato migliore su entrambi i lati (ingressi +0.38, uscite +0.081) → **vale meno dei suoi numeri di ammissione e più di questa tabella**; quantificarlo resta il follow-up bloccato (serve la versione vol-targeted del path live). ⚠️ **Errore di stampa catturato:** il primo output dava `pctl 100%` per l'hold-out del book — arrotondamento di 99.55% con `%.0f`. **Un percentile stampato a 0 decimali mente esattamente agli estremi, che sono l'unico posto dove lo si legge.** Verificato a mano (9 estrazioni su 2000 battono la canonica), formato portato a 1 decimale. - ✅ **FOLLOW-UP SKH01 "vol-targeted" CHIUSO (2026-07-26, 4° filone) — il blocco non esisteva, e il fattore de-luck ×0.6 era troppo severo del 31-34%.** Script `r0726_skh_sigcache.py` (cache), `r0726_skh_live_book.py` (misura), `r0726_deluck_factor.py` (decomposizione), `r0726_capwall_refresh.py` (muri); test `tests/test_skh_live_book.py` (8); diario `2026-07-26-skh-live-book-deluck.md`. **Book/pesi/cron/config INVARIATI.** (1) **La premessa era falsa** — vedi il bullet dell'ondata 26/07-bis: SKH01 **non e' vol-targeted**, le due lenti erano gia' identiche (`sim_equity(canonical)` == `backtest_signals` a max|diff| = 0.0). Test permanente `test_lente_sleeve_uguale_a_quella_del_simulatore`: se qualcuno aggiunge un vol-target allo sleeve, la premessa torna vera e **il test deve rompersi** invece di far passare numeri non piu' validi. (2) **Ingressi live vs backtest, de-luckato a 8 offset** (sottocampione uniforme a priori: la griglia piena a 23 costa ~9 min per asset×offset, fuori portata su 2 core col cron live). Sanity **120/120** bin con ingresso ricostruiti. **Il numero del 26/07 era ~4× troppo grande:** like-with-like (mediana PER-ASSET) **+0.38 su 3 offset → +0.097 su 8**, e "6/6 non negativi" → **13/16**. A livello di sleeve 50/50 la mediana appaiata e' **+0.112, positiva 8/8**. ⚠️ Le due grandezze (per-asset e sleeve 50/50) **non sono la stessa cosa** — nel book entra la seconda, dove la diversificazione BTC/ETH cambia il denominatore. (3) **A livello di BOOK: Sharpe ≈ monetina, drift certo.** dSh FULL +0.048 (>0 nel 79.3%), dSh HOLD +0.051 (51.2%), **d drift +0.73pp (>0 nel 100.0%)**. Meccanismo: l'ingresso intra-bin prende un prezzo migliore ma i falsi ingressi aggiungono churn (530-605 trade live vs 411-484) → vol e ritorno salgono insieme. **REGOLA: chiedersi QUALE grandezza entra nella decisione prima di misurare** — qui il ×0.6 e' sul drift, quindi lo Sharpe non era la metrica. (4) **Il ×0.6 decomposto e misurato.** (a) fortuna d'ancora **sul drift**: **×0.874** (5-sleeve) / **×0.890** (book live) — e la **vol e' invariata** fra le ancore (7.80→7.76%), la fortuna sta tutta nel drift; (b) path live: **non-negativo ovunque** (uscite +0.081 Sh, ingressi +0.73pp, TP01 trascurabile). Il ×0.6 implicava un residuo **×0.687** attribuito al live oltre l'ancora, che nessuna misura sostiene → **FATTORE ONESTO ×0.87-0.91 (5-sleeve), ≥×0.89 (book live)**. Il sospetto registrato il 25/07 ("conta due volte la degradazione SKH01") e' **confermato quantitativamente**. **REGOLA: un fattore correttivo scelto a occhio va DECOMPOSTO prima di accettarlo o rifiutarlo** — il ×0.6 non era sbagliato, era due fattori moltiplicati insieme di cui uno contato due volte. (5) ❌ **Ipotesi MIA nata e refutata nella stessa sessione:** che la grid timing-luck di SKH01 (audit 02/07) fosse un artefatto della lente a chiusura-di-bin, perche' il live valuta ogni ora e non e' ancorato al confine del bin. Dispersione fra gli 8 offset: **LIVE/CANONICO = 1.59×**, cioe' il live e' **piu'** disperso, non meno → **l'audit del 02/07 resta valido com'e'**. L'ipotesi nasceva da **2** offset, si e' incrinata a 4 (1.24×), chiusa a 8. **REGOLA: due punti non fanno una tendenza nemmeno quando la meccanica sembra spiegarla.** (6) ⚠️ **Trovato per strada:** `simulate()` in `r0726_skh_partial_entry.py` **non e' mai chiamata da `main()`** — i numeri headline del diario del 26/07 vennero da una corsa ad hoc mai committata. Ora il driver e' committato (`r0726_skh_live_book.py`). *Un numero pubblicato in un diario deve avere uno script committato che lo riproduce.* - ⚠️ **RISCHIO DI VENUE — mai prezzato in 2 mesi, e non e' diversificabile dagli sleeve (2026-07-26).** Script `r0726_venue_risk.py`, test `tests/test_venue_risk.py` (13), diario `2026-07-26-venue-risk.md`. **Book/pesi/cron INVARIATI.** (0) **Il buco:** il progetto ha prezzato fee, slippage, min-order, pavimento IB, haircut small-cap, fortuna d'ancora, degrado d'esecuzione, look-ahead, backfill, split — **mai la probabilita' che l'exchange sparisca col saldo dentro**. E TP01+SKH01+VRP01 stanno **tutti sullo stesso conto Deribit**: tre sleeve quasi-ortogonali sui ritorni, **perfettamente correlati sul fallimento del venue** — cosa che la matrice di correlazione del book non vede per costruzione. (0-bis) ⚠️ **Limite dei muri del 25-26/07:** `book_series` gira a **`alloc=$600` col book a 2 sleeve** → portarlo fino a $272k assume (a) che a $272k si giri ancora il book da $600 e (b) **"tutto su Deribit" per 10-20 anni, senza dirlo**. ✅ **(a) MISURATO e REFUTATO il 26/07** — vedi bullet "MURO COME PUNTO FISSO": il muro **non** scende, $273.900 vs $272.061 (**+1%**). (1) **La misura** (accumulo da $600, €250/m, 20a, bersaglio $272k, ×0.89, jump di venue a probabilita' annua `p`; CONC = 100% Deribit vs SPLIT = Deribit 65 / HL 15 / IB 20; **bersaglio identico → conservativo CONTRO lo split**): | p annua | P(arrivare) CONC | SPLIT | **P(perso TUTTO) CONC** | **SPLIT** | |---|---|---|---|---| | 0.5% | 87% | 90% | **10%** | **0%** | | 1.0% | 81% | 83% | **18%** | **0%** | | 2.0% | 69% | 71% | **34%** | **4%** | | 5.0% | 42% | 45% | **64%** | **27%** | Capitale mediano CONC a 20a: $544k (p=0) → **$0 (p=5%)**. (2) **La colonna che conta non e' la prima.** Sulla probabilita' di ARRIVARE la concentrazione costa 1-3pp; sulla **ROVINA** costa fino a 64pp. Motivo strutturale: **con un conto solo "almeno un fallimento" COINCIDE con "perso tutto"**. ⚠️ Lo SPLIT viene colpito **2.5× piu' spesso** (26% vs 10%) ed e' molto piu' sicuro → **"quante volte vieni colpito" NON e' una misura di rischio**. (3) **Onesta' obbligatorie:** `p` **non e' stimato** (sensibilita', non previsione — la sceglie l'operatore e va dichiarata); i fallimenti sono assunti **indipendenti**, ottimistico per Deribit-HL (crisi sistemica) → **la parte solida dello split e' IB**, altra classe di rischio; **a $600 lo split e' impossibile**, la concentrazione e' forzata. (4) **RISPOSTA: no, ma la domanda ha una DATA.** Oggi concentrazione forzata; **~$3k = prima riduzione vera** (GTAA01 su IB, 20-25% fuori dal rischio-exchange); ~$20k (XS01/HL) aggiunge poco perche' e' ancora crypto. ✅ **Convergenza che rafforza il 25/07:** `r0725_ib10k` disse "max 25% su IB, **costa** ~€0.08/g" su basi di solo RENDIMENTO; sull'asse della ROVINA quello stesso 25% e' la mossa principale → **€0.08/g non e' il prezzo di un peggioramento, e' il premio di un'assicurazione contro il modo piu' probabile di perdere tutto.** ⚖️ **(5) DECISIONE DELL'OPERATORE 2026-07-26: TUTTO SU DERIBIT FINO A $20k.** Presa DOPO aver visto la tabella della rovina, e con la controparte esplicitata. **Cosa e' stato accettato:** P(perso TUTTO) resta 10/18/34/64% a p=0.5/1/2/5% invece di 0/0/4/27%; in cambio si evita il costo (~€0.08/g di rendita, commissione fissa IB, un secondo venue da gestire) di proteggere **$750** alla soglia dei $3k. **L'argomento a favore, che regge:** sull'asse su cui l'operatore ottimizza — P(ARRIVARE al capitale-rendita) — lo split vale solo **+1-3pp** (81%→83% a p=1%), ed e' un fatto misurato, non una concessione. **L'argomento contro, che resta vero:** zero e' **assorbente** (andare a zero all'anno 10 di un piano da 16 anni significa non arrivarci piu', perche' si riparte da €0 + versamenti), quindi il valore del non-andare-a-zero NON e' proporzionale alla frazione salvata. **Cosa NON si ri-discute:** la soglia $3k. **Cosa si ri-apre a $20k:** lo split, che a quella taglia protegge ~$5k e ha senso anche solo per eseguibilita' (XS01/HL, GTAA01/IB). ⚠️ **Nota per il futuro-me:** questa e' una decisione presa con l'informazione completa, non una svista da correggere — se a $3k qualcuno propone lo split "come da CLAUDE.md", la risposta e' che la data e' $20k. Se cambia il piano (orizzonte, importo dei versamenti) o `p` diventa stimabile invece che assunto, si riapre PRIMA. **REGOLE:** (a) un rischio non-diversificabile dagli sleeve va prezzato a parte; (b) P(successo) puo' nascondere P(rovina) — per una rendita la metrica e' la seconda; (c) una raccomandazione presa su un asse solo va ricontrollata sugli altri prima di considerarla stabile; (d) quando una raccomandazione viene respinta con motivo, si registra **cosa e' stato accettato in cambio** — altrimenti la stessa analisi la ripropone fra tre mesi come se fosse nuova. - ✅ **VENUE WATCH — tripwire di fallimento exchange, CABLATO LIVE (2026-07-26).** Risposta alla domanda *"trova un sistema di protezione da fallimento exchange"* **sotto il vincolo** della decisione appena presa (100% Deribit fino a $20k): se non si puo' ridurre l'ESPOSIZIONE, l'unica leva e' il **TEMPO**. Script `r0726_venue_tripwire.py` (segnale) + `r0726_venue_response.py` (costo della risposta); produzione `src/live/venue_watch.py` + `scripts/live/venue_watch.py` in `cron_book.sh`; test `tests/test_venue_watch.py` (23); diario `2026-07-26-venue-tripwire.md`. **Book, pesi, config INVARIATI.** (1) **Il segnale:** un venue che gata i prelievi **rompe l'arbitraggio** → il suo prezzo si stacca dal consenso e ci RESTA. Il segnale e' **|scarto|, non il segno** (Mt.Gox andava a *premio*, un venue in fuga a *sconto*: dicono la stessa cosa). Consenso = venue **USD indipendenti** (Coinbase, Bitstamp); mai USDT (depeg 2022 → falsi allarmi giganti). Deribit sta a **3 bps** dal consenso in mediana su 8 anni (65.043 ore BTC + 64.541 ETH) — fondo di rumore bassissimo, ed e' cio' che rende possibile una soglia con margine. (2) **Taratura CONGELATA = 100 bps persistenti 4h a segno costante.** Criterio **dichiarato prima**, perche' i due ovvi sbagliano in versi opposti (provati entrambi): *minimi bps* → 25bps/24h consuma 24 delle ~72h che diede FTX; *minime ore* → 500bps/2h **manca FTX** (margine 0.6x). Regola adottata: (a) zero falsi allarmi su entrambi gli asset in 8 anni; (b) margine ≥3x sul caso storico **piu' debole** (FTX ~300bps) → soglia ≤100bps; (c) a quei vincoli, minima latenza. Margine finale **3x FTX / 5x QuadrigaCX / 10-20x Mt.Gox**, con **zero falsi allarmi** inclusi crash COVID 2020-03, maggio 2021, LUNA e novembre 2022. (3) ✅ **CONTROLLO POSITIVO superato** (obbligatorio: un rilevatore tarato per non segnalare e' indistinguibile da uno rotto). Puntato su **Bitfinex 2018-19** (problemi bancari/Tether): **22 episodi**, il piu' lungo **2.324 ore consecutive** a +447bps di picco, altri a 1.151h/+663bps e 496h/+1136bps. **22 scatti dove il problema c'era, 0 su Deribit in 8 anni.** E la DURATA risponde alla domanda vera: un venue gated resta dislocato per **settimane** → 4h di latenza costano una frazione trascurabile del preavviso. (4) **Economia della risposta:** costo ATTESO di un falso allarme (flat 3 giorni, misurato sul book reale a ogni data d'inizio) = **0.248%** di equity (coda p5 −2.065%); guadagno di un vero positivo = **100%**. Break-even: `p_annua > (falsi allarmi/anno) × 0.00248` → a 1 ogni 8 anni serve **p > 0.031%**, a 12/anno servirebbe p > 2.97%. **Il valore sta nella SPECIFICITA', non nella sensibilita'.** ⚠️ Errore mio corretto: il break-even si calcola sulla **media**, non sul p5 (con la coda esce 8.3x piu' severo e la conclusione si ribalta). (5) **Tre stati, e il terzo NON e' il primo:** `OK` / `ALERT` / **`BLIND`** (referenze irraggiungibili o in disaccordo fra loro → dopo 12h e' un allarme suo). *"Non vedo" non e' "va tutto bene"* — stessa lezione della contabilita' a 3 stati di `paper_dvolspread`. **ALLERTA, NON BLOCCA:** l'azione a un vero positivo e' *prelevare* (manuale — una chiave API con permesso di prelievo sarebbe essa stessa un rischio), e bloccare non protegge il saldo, che e' a rischio anche stando flat. **Runbook pre-deciso** nel docstring del modulo (escludere guasto referenze → `public/status` → **prelievo di prova**, unica evidenza diretta → flat + prelievo totale). (6) ⚠️ **Cio' che NON copre, e non e' un argomento per riaprire il 26/07:** un fallimento **senza finestra** (furto di chiavi, sequestro, exit-scam notturno) non lo prende nessun tripwire; quella parte di `p` resta scoperta e la sola difesa e' lo split. E il preavviso di 200-2.300 ore viene da **un** caso osservato: e' un'ancora, non una distribuzione. **REGOLE:** (a) un rilevatore tarato per non segnalare va validato su un **controllo positivo**; (b) una soglia si sceglie con un criterio **dichiarato prima** (i criteri ovvi sbagliano in versi opposti); (c) la persistenza richiesta **e' latenza** e va confrontata con la durata del fenomeno da rilevare; (d) un break-even si calcola sulla **media**, non sulla coda; (e) ⚠️ **una diagnostica STAMPATA non e' un controllo** — la prima corsa tronco' il campione da 8 anni a **29 giorni** per un inner-join con Kraken (che serve solo ~700 candele) e la copertura era gia' a video: ora c'e' una guardia che ferma lo script (2ª occorrenza in un giorno dopo GTAA01 — **l'outer-join con referenze di lunghezza diversa e' una trappola ricorrente**); (f) un controllo positivo finito dentro il ramo `else` **non gira mai** (trovato in sessione: era esattamente il difetto che doveva prevenire). - ⚖️ **RIVALUTAZIONE DELLA STRATEGIA (2026-07-26, fine giornata) — 0 cambi, e il peso 75/25 confermato per la TERZA volta.** Script `r0726_reeval_live_weight.py`, test `tests/test_reeval_live_weight.py` (6), diario `2026-07-26-reeval-strategia.md`. **Book, pesi, cron, config INVARIATI.** (1) **Solo UNA delle sei misure del giorno apriva una decisione**, e per una ragione precisa: il peso 75/25 fu confermato il 24/07 con la lente **hourly**, che il 26/07 e' risultata pessimistica su ENTRAMBI i lati di SKH01 (uscite +0.081, ingressi +0.048 di Sharpe di book) → *se SKH01 vale piu' di come e' stato pesato, 0.25 e' ancora giusto?* Contro tirava il LOO de-luckato dello stesso giorno (SKH01 = il meno affidabile dei cinque). **Due correzioni in versi opposti: si misura, non si deduce.** (2) **Misura** (path live `intra_entry=True`, 8 offset, mediana delle differenze appaiate): argmax a **w=0.35** e 0.30-0.40 batte 0.25 nell'**88%** degli offset — il segnale c'e' ed e' nel verso previsto. Ma **plateau entro 0.05 = [0.25...0.50]** (il peso live e' dentro) e **`weights_tilt_null` FALLISCE** (delta_insample −0.0026, gate_pass False). (3) ⚠️ **Il motivo vero sta in cio' che la mediana nasconde: il guadagno e' tutto nella coda ALTA.** p10 per peso: 1.463 (0.25) / 1.465 (0.30) / 1.455 (0.35) / 1.435 (0.40) / 1.374 (0.50) mentre il p90 sale monotono 1.915→2.064. **Alzare SKH01 non compra Sharpe, compra dipendenza da quale ancora ti e' capitata** (banda da 0.45 a 0.69). Coerente con altre due misure indipendenti: SKH01 ha la frazione d'ancora piu' grande da restituire (LOO) ed e' **4x** piu' fee-sensibile (curva fee). **Tre misure indipendenti: SKH01 e' la gamba fragile, e 0.25 sta all'estremo prudente della regione robusta.** (4) 📌 **La rivalutazione che conta non e' sulla strategia.** Ordini di grandezza a confronto: ottimizzare il peso = **+0.030 Sharpe** (gate fallito); versare **€250/mese invece di €0** = da **mai** a **16.2 anni** (P(entro 20a) 92%); perdere il conto Deribit a p=1% = **−18%** di probabilita' di arrivare, ripartendo da zero. **Il book e' dentro il suo plateau su ogni asse misurato: la ricerca ha smesso di essere il vincolo binding.** I vincoli binding oggi sono **capitale che entra** e **conto che non sparisce**. (Non significa che la ricerca sia finita — significa che il margine residuo vale centesimi di Sharpe contro leve che valgono il risultato.) **REGOLE:** (a) una rivalutazione parte dall'elenco di cosa **cambia una decisione**, non dal riassunto di cosa si e' scoperto; (b) quando due correzioni puntano in versi opposti **si misura** (a occhio si poteva argomentare qualunque cosa); (c) **un argmax dentro un plateau non e' una decisione**, e la mediana da sola puo' nascondere il fatto decisivo (qui: p90 su, p10 giu'); (d) quando le leve hanno ordini di grandezza diversi **dirlo**, o si lavora molto senza cambiare niente; (e) rivalutare **non** vuol dire anticipare i gate pre-registrati — anticiparli e' selezione sull'hold-out. - ❌ **GTAA01 NON E' DEPLOYABILE — blocco PRIIPs CONFERMATO sul conto reale (2026-07-26).** Nato da una domanda dell'operatore ("GTAA01 puo' essere in revolut?"), verificato lo stesso giorno tentando l'ordine. Il broker rifiuta: *"Trading limitato — Questo prodotto non dispone di un KID in inglese o in una lingua approvata per il vostro Paese. I clienti retail possono negoziare prodotti retail preconfezionati solo se e' disponibile un KID appropriato."* SPY/QQQ/IWM/TLT/GLD/HYG sono ETF **domiciliati USA**: gli emittenti non pubblicano il KID e i broker UE ne vietano l'**acquisto** al retail. ⚠️ **Le quotazioni restano visibili** — vedere i prezzi non e' poter comprare, ed e' esattamente cio' che rendeva l'assunzione invisibile. **COSA CADE:** lo sleeve **cosi' com'e' non e' deployabile**, e con esso il piano di attivarlo a ~$13k. Restano **valide come ricerca e nulle come deploy**: la validazione a 30 anni (22/06), il fix dei costi IB (25/07), `GTAA_MIN_CAPITAL`, e il risultato del LOO (26/07) che lo indicava come **l'unico sleeve positivo nel 100% delle estrazioni su tutte e tre le metriche**. **COSA NON CADE:** tutte le traiettorie, i muri e le tabelle di rendita pubblicate usano `book_series(with_gtaa=0)` = **solo TP01+SKH01 su Deribit** → nessun numero del piano va rifatto. E il book live non lo include. **REGOLA: la negoziabilita' sul conto REALE va verificata quando lo sleeve entra in RICERCA, non quando entra nel book.** Qui 5 settimane di misure poggiavano su un'assunzione mai controllata, e il controllo e' costato **un ordine di prova**. E' l'analogo azionario di cio' che il progetto fa gia' rigorosamente sul crypto (min-order, haircut small-cap, eseguibilita' a $600): la stessa disciplina non era stata applicata all'equity. - ✅ **LA VIA D'USCITA UCITS E' APERTA E COSTA ~ZERO — misurata 2026-07-26 (domanda dell'operatore: "usiamo revolut o degiro"). E la premessa su cui era stata scartata era MIA e FALSA.** Script `fetch_ib_ucits.py` + `r0726_gtaa_ucits.py`; modulo nuovo `src/data/eq_crosscheck.py`; test `tests/test_eq_crosscheck.py` (14) + `tests/test_gtaa_ucits.py` (10); diario `2026-07-26-gtaa-ucits.md`. **Book/pesi/cron/config INVARIATI.** (0) ⚠️ **CORREZIONE:** la nota diceva "storia UCITS piu' corta → si perde la validazione a 30 anni". FALSO per un motivo strutturale: **il PRIIPs vieta di COMPRARE, non di GUARDARE**. I prezzi dei 6 ETF USA restano leggibili (l'operatore li aveva sul terminale *mentre* l'ordine veniva rifiutato) → il **segnale** gira sui 30 anni per sempre, cambia solo il **veicolo** su cui si incassa. La storia corta serve solo a misurare la deviazione del veicolo, un drift lento. **Regola: prima di dichiarare che un vincolo esterno distrugge un risultato, chiedersi cosa vincola esattamente** — "non posso comprare" ≠ "non posso vedere". (1) **Il cambio di veicolo NON costa.** Tre lenti a un grado di liberta' per volta su 6.3 anni comuni: L0 (segnale USA + rend. USA, pubblicato) **Sh 0.81 / CAGR 3.96%**; L2 (segnale UCITS + rend. UCITS, deploy) **Sh 0.84 / CAGR 4.08%**. Drag del veicolo **+0.10%/anno** EW, coerente coi TER (controllo piu' netto: GLD 0.40% vs IGLN 0.12% → atteso +0.28%, misurato +0.36%); e la **ritenuta USA 15% sui dividendi (~35bps) e' A FAVORE dell'UCITS** e non e' nel drag misurato (`ADJUSTED_LAST` USA e' al lordo). *(Ipotesi fiscale dichiarata, fonte secondaria.)* ⚠️ **Lo stimatore ovvio da' la risposta sbagliata:** la media delle differenze giornaliere dava **−0.47%/anno** su CSPX contro **−0.06%** vero. Le due serie seguono lo stesso indice ma sono campionate a orari diversi (Londra chiude 4h30 prima) → la differenza giornaliera e' dominata da uno sfasamento che si inverte il giorno dopo: **SE ~7%/anno, 15× la quantita' stimata**, piu' il drag di varianza. **REGOLA: la deviazione fra due veicoli sullo stesso indice si misura sul RAPPORTO CUMULATO** (e' una domanda sul drift), mai sulla media delle differenze. (2) ✅ **IL VINCOLO NON E' IL BROKER, E' IL PREZZO DI UNA AZIONE — e quello e' una SCELTA.** CSPX costa $802 e VUAA $144 sullo **stesso** S&P 500. Due insiemi: **STORIA** (CSPX/EQQQ/XRSU/ IDTL/IGLN/IHYU, finestra lunga, per misurare) e **DEPLOY** (VUAA/XNAS/R2US/IDTL/IGLN/IHYU, prezzo unitario basso, per eseguire). A **$3.000** con esecuzione a azioni INTERE: STORIA tiene **4/6 gambe** ed e' a mercato il **33%** del tempo; DEPLOY tiene **6/6** al **65%**, ΔSharpe −0.04. **Il frazionamento del broker NON serve.** Scartati benche' con piu' storia: RTWO (Russell 2000 *quality*), CSUSS (*ESG*), IDP6 (S&P 600) — equivalenza dell'INDICE prima della storia. ⚠️ Letto sulla colonna **gambe vive + vol**, non su Sharpe: il vincolo intero *alza* lo Sharpe a capitale piccolo perche' arrotonda in giu' e paga meno commissioni = **null de-levering, 4ª occorrenza** (VRP-DD, TP01×DVOL, MAT01). (3) **Il costo per ordine.** Col canonico lo sleeve fa **77 ordini/anno a $3k, 102 a $10k, 149 a $50k**; soglia oltre cui non vale la pena (Sharpe<0.45) = **$0.90/ordine a $3k, $2.23 a $10k, $7.62 a $50k**. Listino **proporzionale** ≈ indifferente al capitale, listino **fisso** = tassa regressiva (regola 25/07 riconfermata su altro venue). ⚠️ **Revolut/Degiro NON sbloccano gli ETF USA**: il PRIIPs vale per ogni intermediario UE, IB e' anzi fra i piu' permissivi. - ✅ **ADDENDUM 2026-07-27 — il numero di ordini e' un PARAMETRO, e con la banda giusta il costo smette di essere binding su qualunque broker UE.** Nato dalla correzione dell'operatore *"io ho gia' Revolut e Degiro e li uso da anni, IB sono solo iscritto"*: la raccomandazione del 26/07 ("restare su IB") poggiava su **"il conto esiste gia'"**, che era falso. Il gateway IB serve solo per i **dati** del segnale (basta il paper), quindi il broker di esecuzione e' libero. Script `r0727_gtaa_broker.py`, test `tests/test_gtaa_broker.py` (9). **Book/pesi/cron/config INVARIATI.** (a) I 77-149 ordini/anno sono la conseguenza di `REBAL_EVERY=5`/`REBAL_BAND_USD=50`, scelti il 25/07 **per il listino IB su azioni USA e a una taglia sola**. A cadenza settimanale allargare la banda **non costa**: Sharpe a **costo zero** 1.27 ($50) → **1.27** ($400) mentre gli ordini vanno 84 → 23. Rallentare la CADENZA invece costa (1.27 → 1.12 mensile). Meccanismo: `_exposure` e' la media di 4 indicatori binari, si muove a scatti di 0.25 ≈ $417 su una gamba da $1.667 → **la banda filtra la deriva del vol-target, non il segnale di trend**. ✅ Controllo fuori finestra: sui **veicoli USA su 10 anni** lo Sharpe a costo zero passa 0.98 → **0.96** mentre gli ordini calano del **74%** (133 → 35) — non e' un artefatto della finestra corta UCITS (3.2a). (b) ⚠️ **MA la banda in dollari ASSOLUTI e' la parametrizzazione sbagliata.** A $3.000 una banda da $400 e' l'**80% della gamba**: **3 ordini/anno**, a mercato il **45%** del tempo invece del 66%. Lo Sharpe resta 0.71 — accettabile — **su una strategia che ha smesso di seguire il proprio target**. E' il **null de-levering in veste nuova**: non travestito da "meno drawdown" ma da "meno costi". **REGOLA: quando un parametro di esecuzione e' espresso in valuta assoluta il suo effetto dipende dal capitale, e il controllo non e' lo Sharpe ma la QUOTA DI TEMPO A MERCATO.** (c) **Configurazione proposta: banda = 25% della gamba** → **21 ordini/anno a OGNI capitale** (invariante), esposizione 66% ovunque; soglia per ordine **$5.65 a $3k / $18.90 a $10k / $47 a $25k** contro i **$2.08 a $3k** del canonico. E' la differenza fra "serve un broker economico" e "va bene qualunque broker europeo". ⚠️ **Proposta, non cambio di produzione**: tarata su questa finestra, non passata per `study_family_honest` ne' per un deflated-Sharpe — e GTAA01 non e' deployabile prima dei $20k, quindi c'e' tempo per validarla. (d) **Cosa cercare sul proprio conto — per ISIN, non per ticker** (da contract details IB; tutti domiciliati IE, quotati a **Londra in USD**): **VUAA** `IE00BFMXXD54` ($143.80) · **XNAS** `IE00BMFKG444` ($65.74) · **R2US** `IE00BJ38QD84` ($86.35) · **IDTL** `IE00BSKRJZ44` ($3.09) · **IGLN** `IE00B4ND3602` ($79.06) · **IHYU** `IE00B4PY7Y77` ($94.12). Nessuna azione oggi (decisione venue: 100% Deribit fino a $20k). ⚠️ **CORREZIONE 27/07 A QUESTO PUNTO.** Avevo scritto "una linea in EUR aggiunge la conversione per ordine → prendere quella in USD". E' vero **solo per un conto in USD**. Per un conto in EURO (retail italiano su Revolut/Degiro) vale l'**OPPOSTO**: la linea USD costringe a convertire a ogni ordine, quella EUR no. L'esposizione economica e' identica (il fondo detiene attivi USD e **nessuna delle due linee e' coperta**): la valuta di quotazione non copre nulla, decide solo se serve una conversione. **REGOLA GIUSTA: prendere la linea nella valuta del proprio saldo.** Misurato (turnover lordo **$13.655/anno** su $10k, 21 ordini): 15bps −0.04 Sh/$20 a., 25bps **−0.07 Sh/$34 a.**, 50bps −0.14/$68 → a 25bps equivale a **~$1.6 in piu' per ordine**, piccolo rispetto alla soglia di $18.90. **REGOLA: un costo di conversione non e' una proprieta' dello strumento ma della coppia strumento-CONTO.** (f) **Equivalenze e ripieghi, verificati su contract details IB (27/07).** **ZPRR (Xetra EUR) == R2US (Londra USD): stessa ISIN `IE00BJ38QD84`, stesso fondo, stesso NAV** → se un broker non quota la linea di Londra, quella di Xetra e' identica (e su conto in euro, migliore). **REGOLA: si cerca per ISIN, non per ticker** — lo stesso fondo ha ticker diversi su borse diverse. ⚠️ **SPY4 `IE00B4YBJ215` NON e' small cap ne' S&P 500**: e' SPDR **S&P 400 MID cap** (l'S&P 500 e' SPY5 `IE00B6YX5C33`). Misurato come ripiego della gamba small: su 6.5 anni Sharpe **0.86 vs 0.86**, CAGR 4.26% vs 4.20%, **corr fra i due sleeve 0.991**, peggiore in 3/7 anni = moneta (sulla finestra corta di 3.2a sembrava −0.15: rumore) → **ripiego accettabile**, per ragione meccanica (small e mid USA correlano ~0.95 giornaliero, un TSMOM si accende negli stessi giorni). Non e' "validato": 6.5 anni non distinguono due gambe cosi' simili, ed e' esattamente perche' la scelta non conta. Se c'e' una linea Russell 2000, si usa quella. (g) ✅ **DEGIRO HA TUTTE E SEI LE GAMBE — verificato sul conto reale (2026-07-27, screenshot watchlist "Pythagoras").** Era **Revolut** a non avere R2US. Su Degiro: VUAA e XNAS su **Tradegate in EUR**, R2US/IDTL/IGLN/IHYU su **LSE in USD**. ✅ Verifica indipendente che le linee EUR siano gli stessi fondi (dai dati, non dallo screenshot): il rapporto prezzo-IB/prezzo-Degiro dev'essere **un solo cambio** → VUAA 1.1341, XNAS 1.1315, **scarto 0.23%**; le altre 4 stanno a 0.993-0.998 (gia' USD). Due fondi diversi non darebbero lo stesso cambio. ⚠️ **ERRORE MIO, dello stesso tipo che avevo appena codificato:** per cercare le linee in euro delle altre 4 gambe ho interrogato IB **per TICKER** sulle borse tedesche → "nessuna linea EUR" su 4/4, **falso**. Cercando **per ISIN** ognuna ce l'ha: **ZPRR** (=R2US), **IS04** (=IDTL), **EGLN** (=IGLN, Londra EUR), **IS0R** (=IHYU). **Un "assente" da una ricerca per ticker su una borsa dove quel ticker non esiste NON significa "non esiste".** **Turnover per gamba a $10k (21 ordini/anno):** **IDTL 9 ordini / $6.257 = 46%**, VUAA $2.289 (17%), IGLN $1.695 (12%), XNAS $1.614 (12%), IHYU $958 (7%), R2US $843 (6%) → **il turnover e' concentrato**, il 71% e' su gambe in USD (**$9.752/anno**, conversione **$24/a a 25bps**, $49 a 50bps = 6-12% del CAGR). **Spostare la sola IDTL su IS04 copre il 64% del turnover convertibile.** ⚠️ Non e' un risparmio netto (spread Xetra piu' larghi delle linee primarie di Londra + tariffa di connettivita' per borsa) e su $10k parliamo di decine di dollari l'anno in entrambe le direzioni: **non e' una decisione importante, ed e' piu' utile dirlo che costruire una precisione finta.** ⚠️ Il prompt **W-8BEN** di Degiro ("aliquota ridotta della ritenuta USA") **non riguarda queste sei**: sono fondi IRLANDESI, non titoli USA — la ritenuta 15% la subisce il fondo al proprio interno e nessun modulo dell'investitore la cambia. **Stato: PREPARAZIONE, non azione** (saldo Degiro €328,92; GTAA01 richiede ≥$3k e la decisione venue tiene tutto su Deribit fino a $20k). **LEZIONE: una raccomandazione poggiata su un fatto non verificato sul conto reale vale quanto quel fatto** — due volte in due giorni un'assunzione sul conto ha cambiato la conclusione (prima la negoziabilita' PRIIPs, poi quale conto e' davvero operativo). (e) **"degiro ha api?" — NO, e costa −0.02 di Sharpe.** DEGIRO non espone una API di trading ufficiale al retail; Revolut nemmeno (la sua e' per pagamenti); IB si'. I wrapper NON ufficiali degli endpoint interni girano su credenziali + seed 2FA e **si rompono in silenzio** a ogni cambio di front-end — e il progetto ha gia' pagato quel prezzo (`fresh_5m`, 26/07): **un esecutore automatico che puo' rompersi senza dirlo e' peggio dell'esecuzione manuale.** Misurato invece il costo di NON automatizzare: carico operativo **15 settimane/anno con ≥1 ordine** (29% dei controlli, 1.4 ordini per volta); costo del ritardo su 10 anni **1g −0.02 (peggiora in 6/11 anni = moneta), 3g −0.13, 10g −0.27**. ⚠️ Sulla finestra UCITS di 3.2 anni la curva NON e' monotona (5g −0.26, 10g −0.13) → il campione corto non risolve differenze di questa taglia, si legge la finestra lunga. **Il costo non e' il ritardo tipico ma la CODA: il rischio e' la dimenticanza, e si copre con un ALLARME non con una API** (`gtaa_rebalance_plan` esiste gia' in produzione, nato per un esecutore; l'allerta Telegram c'e' gia' sul book live). ⚠️ Lato opposto, vero: il resto del book e' automatico, una gamba manuale aggiunge un modo di fallire che oggi non c'e' — argomento reale a favore di IB, che pero' richiede un secondo venue e quindi cade sotto la decisione venue ($20k). **REGOLA: una capacita' mancante si valuta sul costo di non averla, non sulla sua assenza.** - ⚠️ **IL FEED EQUITY NON AVEVA UN CROSS-CHECK — buco trovato e chiuso (2026-07-26).** `src/data/eq_crosscheck.py`. Nel crypto la certificazione incrocia sempre piu' venue (`certify_feed.py` vs Coinbase USD); il feed equity aveva **solo controlli locali** (integrita', gap, spike, split). Il primo veicolo estero ha trovato il buco alla prima estrazione: **CSPX 2012-01-13** con `open/high 112.740` in **USD** e `low/close 88.010` in **EUR** (fattore dai close adiacenti **1.2797** = EURUSD di quel giorno) → −21.9% e poi +27.8% mentre SPY faceva −0.39%. **La certificazione esistente non lo vedeva:** unica guardia `maxret > 50% → SPIKE?`, e una contaminazione EUR/USD vale ~22-28% — **stesso schema dello split 2:1 del 25/07** (che valeva *esattamente* −50%). **2ª conferma: una soglia tarata su una classe di difetto non sorveglia le altre.** **Perche' il GEMELLO e non una regola locale:** il discriminante del 25/07 (range intraday) qui non funziona — anche un crollo vero ha range enorme (SLV 33%). Cio' che separa i casi e' che **un evento di mercato lo fa anche il gemello**: nel *rapporto* i movimenti veri si cancellano. Controprova su dati reali: la scansione sui **prezzi** segnalava IDTL 2020-03 (liquidazione treasury) e IGLN 2013-04 (crollo oro); sul **rapporto** spariscono. ⚠️ **La soglia non era tarabile sulla deviazione** — rumore legittimo fino al **9.90%** (2025-04-09: Londra chiude alle 11:30 di New York) contro un difetto del 21.4% → margine 2.2×, sotto il 3× richiesto. **La risposta non e' accettare il margine ma CAMBIARE STATISTICA:** `|dev| / movimento del gemello` (un disallineamento d'orario **non puo' superare il movimento del mercato**) → rumore **8.1**, difetto **42.7**, **margine 5.3×**. Soglia 18.0, equidistante in scala log. Tre condizioni congiunte: deviazione + non-spiegato + **rientro** entro 5 barre. **Riparazione = SCARTARE la barra, non ricostruirla** (del prezzo vero non si sa nulla). ⚠️ **Limite dichiarato e chiuso sul DANNO, non sulla rilevabilita':** GBPUSD 1.27 → 21% sempre rilevato; EURUSD 1.09 → 8.3% **dentro il rumore** e non tappabile senza falsi positivi. Misurato invece il danno di una contaminazione non vista: **dSharpe mediano −0.003, peggiore −0.056, |Δ|>0.05 nel 2%**. **REGOLA: quando un buco non si puo' chiudere senza generare falsi positivi, si misura il DANNO del caso non rilevato** — un buco quantificato e innocuo e' un risultato, uno taciuto e' un debito. Il limite e' congelato in un test (`test_limite_dichiarato_*`): se qualcuno abbassa la soglia, il test dice cosa e' cambiato. - 💰 **I VERSAMENTI — le 4 ipotesi che il piano non aveva mai fatto (2026-07-26, ultimo filone).** Tutte le traiettorie del 25-26/07 assumevano versamento **piatto, ininterrotto, per sempre** = l'ipotesi meno realistica del piano. Script `r0726_deposits.py`, test `tests/test_deposits.py` (12), diario `2026-07-26-versamenti.md`. **Book/pesi/cron/config INVARIATI** (non tocca la produzione). Block bootstrap sui ritorni reali del book live, fattore ×0.89 misurato. (1) **SMETTERE — il costo non e' proporzionale ai soldi mancanti.** €250/m per K anni poi stop, orizzonte 20a: 3a ($10.410) → $202.771 / P(muro) 32.7%; 5a ($16.950) → $287.081 / **53.3%**; 10a ($33.572) → $410.220 / 77.9%; 20a ($66.818) → $496.778 / 90.0%. **I primi 5 anni sono il 25% dei soldi e il 58% del risultato.** → un'interruzione al 12° anno costa poco, una al 3° quasi tutto: argomento per partire con un importo **sostenibile**, non ambizioso. (2) **CRESCENTE E' PEGGIO DI PIATTO a pari soldi.** €150/m +5%/anno versa €67.998 → $401.889; piatto €250 versa €66.818 → **$496.778** = **+24% con gli stessi soldi**, solo perche' entrano prima. Metrica giusta per confrontare piani di taglia diversa = **`$ finale / $ versato`** (piatti 7.4x, crescenti 5.1-5.9x). Contro-intuitivo: "i versamenti crescono col reddito" e' prudente per il bilancio, **non** per il capitale. (3) **STESSO TOTALE, CALENDARIO DIVERSO = fattore 6.** €60.000 distribuiti: ultimi 10 anni $178.494 (P(muro) 11%) / piatto 20a $496.778 (90%) / primi 10a $806.285 (98.3%) / primi 5a **$1.104.587 (99.4%)**. ⚠️ NON significa "versa tutto subito": un piano che non si sostiene non e' un piano — serve a scegliere fra calendari **sostenibili**. ✅ **Verificato col rischio di venue dentro** (il vantaggio front-load mette piu' capitale sull'exchange prima = proprio il rischio del giorno): **regge**, 2.22x → 2.09x a p=2%, perche' il rischio colpisce il **tempo**, non il calendario. ⚠️ **MA a p=5% il capitale mediano e' $0 per OGNI calendario** (64% di rovina su 20a) → **formulazione piu' netta del rischio di venue trovata finora: non erode il piano, lo CANCELLA.** (4) **LA DOMANDA INVERSA — rendita netta €/g mediana** (riformula l'obiettivo: €50/g e' UN punto, non l'unico risultato): | €/mese | 5a | 10a | 15a | 20a | P(€50/g a 20a) | |---|---|---|---|---|---| | 100 | 2.08 | 6.54 | 16.40 | 38.07 | 31.0% | | 150 | 3.00 | 9.55 | 23.96 | 55.80 | 58.7% | | **250** | 4.83 | 15.53 | 39.11 | **91.30** | **90.0%** | | 400 | 7.59 | 24.52 | 61.85 | 144.23 | 98.9% | | 600 | 11.26 | 36.52 | 92.17 | 215.07 | 100.0% | Non-linearita': **da 15 a 20 anni la rendita piu' che raddoppia a ogni livello** (gli ultimi anni contano piu' in *rendita*, i primi piu' in *versamenti*). (5) **FREQUENZA = la decisione meno importante.** Mensile fino a ~$2 di costo per trasferimento, bimestrale sopra, trimestrale oltre $25 — ma le differenze sono **1-3%** del capitale finale. Verificato che un deposito **non resta strozzato**: col cap dinamico attivo cap = equity/2 = esattamente il nozionale massimo richiedibile per asset. 📌 **ORDINE DI IMPORTANZA (da citare quando si parla del piano):** versare o no (**da mai a 16 anni**) > quando (**6x**) > quanto presto si smette (5 anni = 58% del risultato) > piatto vs crescente (24%) > frequenza (1-3%). E sopra tutte, fuori scala: **a p=5% di rischio venue il risultato mediano e' zero comunque.** **REGOLE:** (a) un piano di accumulo si giudica sulle sue **deviazioni**, non sul caso nominale — piatto/ininterrotto/per sempre e' l'unico scenario che non succede; (b) piani di taglia diversa si confrontano con una metrica **normalizzata** (`$ finale / $ versato`), altrimenti "versa di piu'" vince sempre; (c) un vantaggio calcolato **ignorando un rischio noto** va ri-misurato con quel rischio dentro anche quando ci si aspetta che regga (qui reggeva, ma la colonna p=5% ha prodotto il risultato piu' importante del filone); (d) quando l'obiettivo dichiarato non e' raggiungibile, la tabella utile e' quella **inversa** — non "quando arrivo a X" ma "cosa compro con quello che ho". - 📅 **NUOVO SCHEMA FEE DERIBIT dal 2026-08-01 — misurata la CURVA, nessuna azione oggi (2026-07-26).** Script `r0726_fee_sensitivity.py`, test `tests/test_fee_sensitivity.py` (6), diario `2026-07-26-fee-deribit.md`. **Book/pesi/cron/config INVARIATI.** L'annuncio (taker piu' bassi, **maker rebate piu' bassi**, soglie VIP abbassate, nuovo VIP7, **liquidation fee 1%** su tutti i prodotti, spot a zero fino al collegamento con Coinbase) **non contiene numeri** e ⚠️ **la tabella nell'articolo Insights e' un'IMMAGINE, non letta da fonte primaria** → i valori indicativi (base ~5bps taker / 2bps maker, VIP7 2/0) vengono da un riassunto **secondario** e vanno etichettati come tali. Percio' e' misurata la **curva**: | bps/lato | %RT | TP01 Sh | SKH01 Sh | BOOK Sh | BOOK CAGR | |---|---|---|---|---|---| | 0 | 0.00% | 1.322 | 1.567 | 1.849 | 21.69% | | 3 | 0.06% | 1.303 | 1.495 | 1.799 | 20.99% | | **5** | **0.10%** | **1.290** | **1.446** | **1.766** | **20.53%** ← oggi | | 10 | 0.20% | 1.258 | 1.324 | 1.682 | 19.39% | | 15 | 0.30% | 1.226 | 1.200 | 1.597 | 18.26% | **Sensibilita' marginale del book: −0.017 Sharpe/bps, −0.23% CAGR/bps** → anche un RADDOPPIO del taker costa 0.08 di Sharpe, **meno della banda d'ancora dello stesso book** (2.222 → 1.946). ⚠️ **SKH01 e' ~4× piu' sensibile di TP01** (−0.69% vs −0.09% CAGR/bps: round-trip discreti vs posizione continua vol-targeted) → **se il taker salisse, il primo parametro da rivedere e' il peso 75/25**, non altro. **REGOLA DECISA IN ANTICIPO (per non decidere col numero davanti): taker ≤5bps/lato → non si tocca nulla; >10bps/lato → rivedere il peso di SKH01.** **Punti irrilevanti e perche':** *maker* — il book manda ordini **market**; tocca solo la raccomandazione **T1 non implementata** (TP resting per incassare il maker), che resta chiusa per il netting su strumento unico e il cui beneficio era quasi tutto "convertire una lotteria in certezza", non la fee. *Liquidation fee 1%* — `live.json` da' nozionale lordo max **1.00x l'equity** (`frac 0.5` × 2 asset) con disaster-SL −30%: servirebbe un movimento avverso ~100%; ⚠️ la conclusione poggia sul CAP, quindi e' cablata una **guardia di decisione** (`test_leva_massima_da_config_resta_sotto_o_uguale_a_1x`): **alzare il cap rompe il test**. *VIP/VIP7* — a $600 il volume 30g e' trascurabile, tier base a qualunque soglia. ✅ **Cio' che il cambio non puo' rompere:** tutti i backtest sono a 0.10% RT → se la fee scende diventano **conservativi**. **AZIONE 1 agosto:** leggere il tier reale in Account Settings e applicare la regola sopra. **REGOLE:** (a) a un annuncio senza numeri si risponde misurando la **curva**, non aspettando il numero; (b) dichiarare la **qualita' della fonte** (immagine non letta = dato secondario); (c) una conclusione che poggia su un parametro di config va legata a un **test su quel parametro**, o sopravvive al cambio che la rende falsa. - ❌ **MURO COME PUNTO FISSO — la mia previsione era SBAGLIATA e il numero pubblicato era giusto per caso (2026-07-26).** Script `r0726_wall_fixedpoint.py`, test `tests/test_wall_fixedpoint.py` (11), diario `2026-07-26-wall-fixedpoint.md`. **Book/pesi/cron INVARIATI.** Il follow-up dichiarato diceva: *"i muri usano il book a 2 sleeve da $600 estrapolato a $272k; il book diversificato ha Sharpe piu' alto → **il muro vero e' piu' basso**"*. **Misurato: FALSO.** (1) **Struttura giusta: il muro e' un PUNTO FISSO** — serve capitale C per girare il book che determina il muro C → si itera `C_{n+1} = muro(book(C_n))`. Converge in **1 iterazione** perche' il muro cade **sopra** la soglia XS01 ($117k), quindi la composizione non cambia; la struttura conta solo se il muro atterra vicino a una soglia — ma **va iterato per saperlo**. (2) **Risultato:** book deployable (TP01 38/SKH01 23/GTAA01 23/XS01 17; **VRP01 escluso** per regola short-vol, **XSR01 escluso** per gate 23/10; costi capital-aware; ancora ×0.860 misurata su questo book) → Sharpe **1.94**, vol 8.9%, CAGR 18.3%. **Muro $273.900 vs $272.061 = +1%.** (3) **Perche':** diversificare alza lo Sharpe (1.64 → 1.94) ma abbassa **drift e vol insieme**; la rendita perpetua vive sul **drift** → 10.91% → 10.84% = invariata. **Il guadagno di Sharpe va in meno rischio, non in piu' reddito** — cioe' il fatto gia' misurato il 25/07 §3, che avevo dimenticato scrivendo il follow-up. (4) ⚠️ **Stavo violando una regola gia' codificata:** *"un diversificatore a basso CAGR si giudica a ISO-RISCHIO, mai a iso-nozionale"* (25/07 §3). A iso-rischio (leva **1.28x**): rendita 13.35%, **muro $222.406 = −18%** — ✅ **replica indipendente** del −19% misurato il 25/07 con macchineria e book diversi. Vale **solo** se la leva e' disponibile e a costo < uplift (IB: Reg-T 2x, portfolio margin da ~$110k, margine ~5.5%/a): **$222k e' un TETTO, non una stima.** (5) ⚠️ **BUG catturato prima di pubblicare:** la prima corsa dava Sharpe 0.95 e muro **$854k** ("diversificare triplica il muro" — spettacolare e falso). Causa: `CC.gtaa_banded` ritorna la storia GTAA **dal 1996** mentre lo sleeve di produzione tronca a `GTAA_BOOK_ACTIVATION`; con la rinormalizzazione per-riga di `combine_outer` il **75% del campione** era **GTAA01 da solo al 100%**. Preso **non da un test** ma perche' la somma pesata dei componenti (~18%) non tornava col drift del combinato (6.8%). **Diagnostica decisiva: la COPERTURA PER COLONNA** (TP01 24.6% / SKH01 24.6% / GTAA01 100.0% / XS01 8.6%) — un 100% accanto a valori bassi dice tutto. **REGOLE:** (a) un follow-up dichiarato contiene una **previsione**, che va misurata non assunta; (b) **rileggere le regole gia' codificate prima di impostare il confronto**; (c) quando un aggregato non torna con la somma dei suoi pezzi, **fermarsi** — era l'unico segnale del bug (nessun test, nessuna eccezione, output plausibile); (d) **la copertura per colonna e' la prima diagnostica di un outer-join**. - ✅ **EDGE WATCH — criteri di kill del book LIVE, cablati (2026-07-26).** *(Bullet aggiunto il 27/07: era in cron dal 26/07 e NON stava in CLAUDE.md — il criterio di morte di cio' che gira con soldi veri non era nella memoria operativa.)* `scripts/live/edge_watch.py` (in `cron_daily.sh`), taratura `r0726_edge_death.py`, test `tests/test_edge_watch.py` (11). Chiudeva l'asimmetria: gate di kill pre-registrati per i CANDIDATI, nessuno per il book. **(A) RITORNO: Sharpe rolling 36m < −0.5** — falso kill 1.8% in 10 anni, riconosce l'edge morto nel 91% dei casi in ~3.8 anni. ⚠️ **La lentezza non e' un difetto della regola, e' statistica:** a 12 mesi la stessa regola ucciderebbe un edge VIVO nell'80% dei casi; a 12m il 56% dei casi "morto" e' indistinguibile da uno vivo. **(B) PROTEZIONE: in un anno con DD buy&hold > 10%, il DD di TP01 deve restare sotto il 75% di quello** — storico 8/8 anni di sinistro superati (protezione 1.8x-34.4x). Serve un criterio SEPARATO perche' il LOO misura il contributo hold-out di TP01 negativo nel 99.1% delle ancore: **"non ha guadagnato" non e' evidenza di morte per uno sleeve difensivo** — la sua morte e' non proteggere nel sinistro, e negli anni senza sinistro il criterio NON si valuta. Se (A) scatta il book **non si spegne da solo**: si riapre `weights_tilt_null` + deflated-Sharpe sui dati nuovi. Se (B) fallisce **2 anni di sinistro consecutivi**, il peso di TP01 va rimesso in discussione. Stato 27/07: **Sharpe 36m +1.51, protezione 8/8.** Diario `2026-07-26-edge-death.md`. - 💰 **IL CAPITALE GIA' FERMO — la leva mai misurata, e la decisione di venue che ne dipende (2026-07-27).** `r0727_lumpsum_split.py`, test `tests/test_lumpsum_split.py` (14), diario `2026-07-27-lumpsum-venue-gates.md`. **Book/pesi/config INVARIATI.** Tutte le traiettorie del 25-26/07 hanno `START = 600.0` **cablato**: il progetto ha misurato il *calendario* dei versamenti (fattore 6) e mai un **versamento iniziale**, mentre su Revolut ci sono ~€10.000 (di cui €6.043 in XEON a ~0% reale netto) contro i $600 che girano. Macchineria = generalizzazione di `r0726_venue_risk.simulate`, **validata: con lump 0 riproduce IDENTICI i numeri del 26/07**. (1) **Cosa compra** (p=0, 20a): **€10.000 fermi oggi e mai piu' nulla → traguardo 17.2a mediani, P 62%, rendita €61.58/g** (il piano €250/m senza lump: 15.7a, P 95%, ma $66.818 versati contro $10.900). Con entrambi: **13.3a, P 99.5%**. (2) ⚠️ **L'equivalenza si misura in versamento mensile equivalente, NON in versamenti risparmiati**: la prima stesura diceva "€10k ≈ €7.414 risparmiati = 0.7x" — numero giusto, **domanda sbagliata** (il valore e' arrivare prima, non versare meno), e invita alla conclusione opposta. Onesto: **€10.000 oggi = +€154/mese per 13 anni = €24.523, cioe' 2.45×.** (3) **Col rischio di venue dentro** (a €10k il conto e' $11.500 e lo split diventa possibile — a quota IB **26%**, non il 25% preferito: sotto $3.000 la gamba equity non esiste): lo split costa **1.9-2.6pp** di P(arrivare) e taglia **P(perso tutto) da 18.4% a 3.5%** a p=1% (da 33.7% a 11.2% a p=2%). Il haircut dichiarato sulla gamba IB (0.8pp taglia piccola + 0.1pp UCITS) sposta **0.1-0.2pp**: il costo della gamba equity non decide. ⚠️ **P(perso tutto) sotto concentrazione NON dipende dal capitale** (con un conto solo "almeno un fallimento" coincide con "perso tutto"): il lump non la peggiora, **moltiplica cio' che porta via**. (4) ✅ **IL RISULTATO OPERATIVO — la protezione non e' bloccata dal PRIIPs.** GTAA01 oggi non e' deployabile, quindi misurato anche lo **SPLIT-CASSA** (seconda gamba ferma): costa **0.6-0.8pp** di P(arrivare) in piu' e **la protezione e' IDENTICA** (dipende da quanti conti falliscono, non da cosa ci sta sopra). **Un rischio non-diversificabile si compra con un secondo CONTO, non con un secondo sleeve.** (5) **Soglie:** split a quota raccomandata da **$12.000**, forzando al 35% da **$8.571**. La riapertura della decisione venue e' a $20.000: **un lump da €10k cade sotto quella soglia ma sopra la fattibilita' tecnica, ed e' un cambiamento del piano = il caso in cui CLAUDE.md dice di riaprire PRIMA.** Materiale pronto; la decisione resta dell'operatore. ⚠️ Cosa NON decide: quanto dei €6.043 sia vero fondo d'emergenza (un fondo d'emergenza non e' capitale disponibile). - ✅ **FEE WATCH + MONITOR HEALTH — due sorveglianze cablate (2026-07-27).** Nessuna tocca l'esecuzione; entrambe in `cron_daily.sh`. (1) **`scripts/live/fee_watch.py`** (test 13): il nuovo schema fee Deribit entra il **1° agosto** e l'annuncio non ha numeri → invece di un promemoria, un sorvegliante. Legge il tier **BASE** da `public/get_instrument` (nessuna chiave; a $600 ogni soglia VIP e' fuori portata), oggi **taker 5.00 / maker 0.00 / liquidazione 75-90 bps**, applica la regola congelata (≤5bps nulla · >10bps rivedere il peso SKH01) e allerta su **qualsiasi** cambiamento dei tre. `test_baseline_e_quella_dei_backtest` lega la soglia al default `fee_rt=0.001` di `backtest_signals`: se divergono, il test lo dice. (2) **`src/live/monitor_health.py` + `scripts/live/monitor_health.py`** (test 16): **tre gate pre-registrati** (STATARB 27/09, XSR01 23/10, DVOLSPREAD 24/10) si decidono su serie forward di cui **una sola** aveva una guardia d'integrita'. Un monitor fermo produce silenzio, e **il silenzio in una serie di ritorni si legge come zero** (stesso schema di `fresh_5m` e del feed-freeze 14/07). Misura **due guasti**, perche' uno solo non basta: **coda** (ultima barra vecchia) e **buchi interni** (copertura fra prima e ultima barra) — ⚠️ *una serie bucata E fresca passa qualunque controllo di freschezza, ed e' il guasto che falsifica un gate senza farsi notare*. Cadenze dichiarate per monitor (prevday e' **orario**, combo segue il calendario di **borsa**: sbagliarle = un falso allarme a settimana); soglia di copertura **0.80** riusata dal veto DVOLSPREAD perche' i gate restino confrontabili. Stati **OK/FERMO/BUCATO/ASSENTE/NUOVO** — "troppo giovane per un giudizio" non e' "sano". Controlli positivi obbligatori nei test. Stato 27/07: 6/6 giudicati, tutti OK (combo 96% per una festivita' che `np.busday_count` non conosce = limite dichiarato, conservativo). - ✅ **BANDA GTAA01 AL 25% — VALIDATA, produzione NON toccata (2026-07-27).** `r0727_gtaa_band_gate.py`, test `tests/test_gtaa_band_gate.py` (13). Chiude il debito dichiarato il 27/07 ("tarata su questa finestra, non passata per `study_family_honest` ne' per un deflated-Sharpe"). Griglia **30 celle** (5 cadenze × 6 bande) su **29.9 anni** del path di produzione, annualizzazione **√252**. **(A) Selezione in-sample** (cella scelta sui soli dati pre-2015, letta sul 2015+): proposta **4/30 in-sample, 5/30 hold-out** → il rango NON migliora sull'hold-out, quindi **non e' selection-on-holdout**. La cella scelta al buio (cadenza **giornaliera**, banda 25%) vale +0.04 di Sharpe ma costa **250 controlli manuali/anno** su un conto senza API → non e' una configurazione, e' un'ipotesi. **(B) Deflated Sharpe 0.999 PASS** (nullo 0.14). **(C)** ⚠️ **il modo di fallire NON e' il de-levering**: allargando la banda la **vol non scende** (0.99-1.10 del riferimento), si rompe il **TRACKING** (corr 0.951 a 25% → 0.907 a 40% → 0.859 a 60%) e lo Sharpe smette di migliorare insieme alla correlazione → nessuna zona premia il congelamento. **Ma il 25% e' AL BORDO** (0.951 contro soglia 0.95), non al centro di un plateau: citarlo cosi'. **Invarianza**: **25 ordini/anno a $3k/$10k/$50k** (banda 25%, Sharpe 0.66/0.70/0.71) contro **65/92/134** (banda $50 fissa, 0.52/0.62/0.66) — ⚠️ 25 e non i **21** citati il 27/07: stimatore diverso (griglia dei controlli su 30 anni USA vs cambi di posizione sulla finestra UCITS di 3.2a); l'*invarianza*, che e' la proprieta' sotto esame, regge in entrambi. **Impatto sul book: Sharpe FULL 2.221 → 2.221, maxDD 6.08% → 5.94% = zero** (il book modella GTAA01 a $10k, dove la banda fissa gia' funziona) → **il valore e' tutto al capitale piccolo** (0.52 → 0.66 a $3k), cioe' al deploy. **`REBAL_BAND_USD` NON cambiato**: non sposta un numero pubblicato e lo sleeve non e' deployabile prima dei $20k → si applica **al deploy**, con questo gate come giustificazione. **REGOLA: un parametro d'ESECUZIONE scelto guardando il risultato e' selezione come ogni altra** e passa per gli stessi gate, anche quando "non tocca l'allocazione". - **Soffitto strutturale BTC/ETH-direzionale ~1.3** superato SOLO espandendo a un meccanismo diverso: cross-sectional su universo Hyperliquid certificato (XS01) → portafoglio Sharpe ~1.55. - **Sweep "strategie alternative" (2026-06-20) — 104 ipotesi / 153 agenti / NIENTE di nuovo regge.** Ricerca onesta a largo spettro su BTC/ETH+DVOL (harness condiviso vettoriale leak-free `scripts/research/alt/altlib.py`, 104 script in `scripts/research/alt/runs/`): 11 famiglie (breakout, trend non-TSMOM, mean-rev gated, DVOL/vol, cross-asset pairs, stagionalità, overlay rischio, opzioni modellate, microstruttura, ML walk-forward, combo). 16 promettenti, **1 sola** sopravvissuta alla verifica avversariale (3 scettici) e comunque NON deployabile. Conferma forte del soffitto ~1.3: ogni PASS era hold-out-fitting o **TP01/TSMOM travestito** (trend-beta del toro). Unico LEAD: **STA05** (EWMA-cross ensemble, **long-short**) — leak-free, plateau, corr hold-out **0.53** a TP01, il blend 0.75·TP01+0.25·STA05 alza l'hold-out 0.31→0.59 (full 1.30→1.24, DD 14→16%); MA hold-out corto (536g) → **forward-monitor, non sleeve.** Lezione harness: valutare lo Sharpe **MARGINALE vs baseline TP01** (non assoluto) + esigere plateau e jackknife drop-one-month sull'hold-out prima di PASS (hanno ucciso 13/14 falsi positivi). Diario `2026-06-20-alt-strategies-100agent-sweep.md`. - **MARGINAL SCORER (implementato 2026-06-20)** — la lezione "Sharpe marginale, non assoluto" è ora codice in `scripts/research/alt/altlib.py`: `study_marginal(name, target_fn)` valuta un candidato direzionale BTC/ETH **sia** in assoluto **sia** rispetto al baseline `tp01_baseline_daily()` (corr, uplift del blend OOS, beta+alpha residua) e ritorna `earns_slot = (abs!=FAIL) AND (marginal==ADDS)`. **Regola: una nuova strategia direzionale si giudica su `earns_slot`, non sullo Sharpe assoluto** (gli overlay-su-TSMOM ereditano lo Sharpe di trend e prendono PASS fasulli — es. CMB04 PASS assoluto → NEUTRAL marginale). Demo `marginal_demo.py`, test `tests/test_marginal_scorer.py`. ⚠️ **INDURITO 2026-06-21 (onda ortho):** la versione fisso-HOLDOUT + jackknife-mese era ingannabile — 17/18 book relative-value "ADDS" su una sola finestra 2025 (ETH-bleed dove TP01 è debole). Tre gate nuovi in `marginal_vs_tp01`: **(1) persistenza multi-cut** (uplift positivo a più date di taglio, non solo 2025); **(2) edge in-sample** (`has_insample_edge`: lo Sharpe standalone PRE-holdout dev'essere ≥0.5 — un low-corr a Sharpe ~0.3 "aggiunge" solo matematica di diversificazione, riportata via `null_pctl_*` vs un asset-rumore a corr-zero); **(3) hedge vs alpha** (`is_hedge`: un low-corr che paga SOLO quando TP01 è debole — `corr(Sharpe-TP01, uplift annuo)` molto negativa — è un hedge, non alpha). Verdetti nuovi: HEDGE, NOISE. Sull'onda ortho lo scorer indurito collassa 17/18 → **1** (`dvol_spread`, unico con edge in-sample reale; comunque forward-monitor per multiple-testing/storia DVOL corta). Lezione: un nuovo sleeve si giudica su edge-in-sample + persistenza multi-cut + non-hedge, non sull'uplift di una finestra fortunata. - **HARNESS REALISM (codificato 2026-06-21, onda intraday)** — due gate nuovi in `altlib.py`, test `tests/test_harness_realism.py`: - **`day_boundary_robust(target_fn, tf)`** — un effetto ora/sessione/giorno il cui uplift marginale **si inverte** spostando il confine del giorno UTC di poche ore è un **artefatto di etichettatura calendario** (ha ucciso `open_drive`: +0.23 a 00:00 → −0.33 a +8h → ARTIFACT-RISK). Un segnale di prezzo è INVARIANT (spread 0); un effetto calendario vero è ROBUST (resta positivo; es. `prevday_range_breakout`). **Regola: ogni segnale calendar/session/hour passa questo test prima di crederci.** - **`eval_weights_smallcap(df, target, capital=600, min_order=5)`** — a ~$600 un ribilanciamento di nozionale < min_order **non si esegue**; la fee proporzionale che `eval_weights` applica a migliaia di micro-trade sub-dollaro (tipici di un overlay vol-target) è **finzione**. Salta i sub-min_order e riporta lo **Sharpe haircut** reale vs modellato. **Vale per OGNI sleeve a questo capitale, TP01 incluso** — lo Sharpe netto onesto a $600 è quello small-cap, non quello modellato. - **SELECTION-ON-HOLDOUT gate (codificato 2026-06-29, filone B intraday ERM)** — terzo gate in `altlib.py`, test `tests/test_harness_realism.py`. Il lead ERM faceva `earns_slot=True` MA lo script di scoperta sceglieva la cella per **`min_hold` massimo** su 60+ celle = **selezione-sull'hold-out**: scegliendola in-sample-only ne esce un'altra (trend-beta corr→TP01 0.53, NEUTRAL) e il deflated-Sharpe crolla (DSR 0.0-0.24 su 122 trial). `study_marginal` da solo non lo vede (giudica UNO stream, non *come* è scelto). Tre funzioni: **`deflated_sharpe()`** (Bailey & Lopez de Prado, PASS ≥0.95), **`select_cell_insample()`** (cella scelta col solo Sharpe pre-HOLDOUT), e il gate combinato **`study_family_honest(name, factory, grid, tfs)`** → `earns_slot_honest = earns_slot[cella in-sample] AND deflated-Sharpe≥0.95`. **Regola: una strategia direzionale grid-searched si giudica con `study_family_honest`, non chiamando `study_marginal` sulla cella a max hold-out.** Chiude il punto cieco gemello di CC01 ("Sharpe implausibile"). Diario `2026-06-29-intraday-regime.md` (analisi `scripts/research/intraday_regime_analysis.py`). - **Onestà sul target €50/giorno:** NON raggiungibile su 2000 in 1-2 anni (servono ~130k di capitale o un DD da rovina). La leva non è la scorciatoia; la via è target-vol + capitale + tempo. La strategia che *guadagna* esiste, ma a ~+€1.5/giorno su 2000. Script ricerca: `scripts/research/track{A,B,C,D,E}_*.py` + `trackD_timing.py`. ## Obiettivo Ricerca: riconoscimento pattern frattali per trading algoritmico su crypto. Target dichiarato €50/giorno partendo da €1.000. **Onestà prima di tutto**: nessun numero va creduto finché non è netto fee, out-of-sample, robusto su griglia, e su dati certificati + liquidi + eseguibili. ## Stack - **Linguaggio:** Python 3.11+ — **Package manager:** uv (`pyproject.toml`, `uv.lock`) - **Dati:** Parquet in `data/raw/` (gitignored). Solo BTC/ETH (5m/15m/1h). - **Analisi/ML:** numpy, pandas, scipy, scikit-learn - **Fonte dati storici:** Deribit mainnet via `ccxt` (pubblico, tokenless) ## Struttura (post-reset) ``` src/data/downloader.py → load_data(asset, tf): legge i parquet certificati da data/raw/ src/strategies/base.py → Strategy (ABC), Signal, BacktestResult, YearlyStats src/strategies/indicators.py → indicatori condivisi (ema, atr, keltner, ...) src/strategies/trend_portfolio.py → TP01: strategia DIFENSIVA robusta (PORT LF1d, >=12h), causale src/portfolio/ → PORTAFOGLIO DI STRATEGIE estensibile (Sleeve + StrategyPortfolio) portfolio.py → combina N sleeve per peso su griglia giornaliera; metriche FULL/hold-out/anno sleeves.py → REGISTRY sleeve attivi: TP01 33 / XS01 15 / VRP01 12 / SKH01 20 / GTAA01 20. Aggiungere = una riga src/fractal/ → indicatori frattali (patterns.py, indicators.py, similarity.py) src/backtest/engine.py → engine di backtesting riusabile src/backtest/harness.py → harness ONESTO (load BTC/ETH, backtest_signals no-leakage, OOS) src/version.py → APP_VERSION (legge il file VERSION) scripts/research/ → ricerca: track{A-I}_*.py + options_vrp_*.py + fetch_dvol.py scripts/portfolio/ → run_portfolio.py (report) + xsec_*.py (ricerca/affinamento XS01) scripts/live/paper_portfolio.py → paper/forward-only del book attivo TP01+XS01 (1d) (no esecuzione reale) scripts/analysis/ → SOLO i tool dati certificati: rebuild_history.py → (ri)costruisce lo storico da Deribit mainnet (base 5m + resample) certify_feed.py → certifica il feed (integrità, coerenza resample, spike, cross-venue) audit_feed.py → audit per-barra vs riferimento esterno multi_source_check.py → cross-check multi-venue (quale venue è "vero") data/raw/ → btc/eth × {5m,15m,1h} (gitignored). UNICO dato attivo. data/instruments_registry.json → registry strumenti (reference) docs/diary/ → diario di ricerca (1 voce: il reset; aggiungere dopo ogni esperimento) Old/ → ARCHIVIO: tutto il vecchio (strategie, live, ricerca, dati, diari) VERSION → semver (2.0.0) ``` ## Comandi ```bash uv sync # installa dipendenze uv run python scripts/analysis/rebuild_history.py --asset BTC ETH # (ri)costruisci storico da Deribit mainnet uv run python scripts/analysis/certify_feed.py # certifica i feed (locale + cross-venue) uv run python scripts/analysis/certify_feed.py --local # solo check locali (veloce) uv run python scripts/research/trackD_trendport.py # backtest strategia vincente (full report) uv run python scripts/research/trackD_timing.py # vincitrice su 15m/1h/4h/1d + PnL/DD/trade per anno uv run python scripts/analysis/fetch_hyperliquid.py # fetch+certify universo Hyperliquid (Cerbero mainnet) -> data/raw/hl_* uv run python scripts/portfolio/xsec_research.py # ricerca cross-sectional su Hyperliquid (XS01) uv run python scripts/portfolio/run_portfolio.py # report del PORTAFOGLIO attivo (TP01+XS01) uv run python scripts/live/paper_portfolio.py # avanza il paper del book TP01+XS01 (forward-only, 1d) uv run pytest # test ``` ```python from src.data.downloader import load_data df = load_data("BTC", "1h") # OK. load_data("SOL", ...) -> FileNotFoundError (guardrail: solo dati certi) ``` ## IL DATO — fonte di verità (regola di prim'ordine) - **La verità è Deribit mainnet**, perché è dove (in futuro) eseguiamo. Cross-check multi-venue: Deribit mainnet è a 0-1 bps dal consenso. **Binance NON è la verità** (è USDT, ~10 bps fuori, e sotto depeg USDT fino al 3% off) → usare Binance/Coinbase SOLO come audit indipendente, mai come ancora per "ripulire" i dati. - **Aggiornare lo storico SOLO con `rebuild_history.py`** (ccxt Deribit mainnet, base 5m unica + resample → coerenza interna garantita). **MAI** il vecchio downloader Cerbero (token testnet = feed farlocco: è la causa della contaminazione). - **Certificare sempre** dopo un rebuild con `certify_feed.py` (integrità OHLC, zero gap, coerenza resample maxΔ≈0, spike = solo crash reali, accordo cross-venue per-anno vs Coinbase USD). ### Universo ricercabile certificato - **BTC / ETH**: puliti (2-6 bps vs Coinbase USD su tutta la storia), liquidi (~0% barre flat a 1h), storia lunga (2018/2019→oggi) → **ogni timeframe (5m/15m/1h)**. È l'unico dato in `data/raw`. - **Alt Deribit (SOL/XRP/ADA/LTC/DOGE/BNB): FUORI.** Illiquidi (LTC 5m 82% barre flat, run ~3 giorni), divergenti, o non certificabili. Archiviati in `Old/data/raw`. - **Universo Hyperliquid (Cerbero MCP MAINNET): 19 alt liquidi a 1d, dal 2024** — BTC/ETH/SOL/BNB/XRP/ DOGE/AVAX/LINK/LTC/ADA/ARB/OP/SUI/APT/INJ/TIA/SEI/NEAR/AAVE. Certificati (`fetch_hyperliquid.py`): flat 0%, cross-venue 4-9 bps vs Binance, >1% ≈0% → `data/raw/hl_*_1d.parquet`. **Caveat:** storia nativa solo **~2.5 anni** (2024-2026; pre-2024 = backfill, vol 0). Abilita le strategie CROSS-SECTIONAL (impossibili a 2 asset). NB: Cerbero col token TESTNET = farlocco; col token **mainnet** (`.env.mainnet`) = reale, ma SEMPRE da certificare (cross-venue + liquidità). ⚠️ **CORREZIONE estrazione (2026-06-20):** il backfill NON è solo pre-2024 — cerbero MCP padda con barre SINTETICHE (volume 0, prezzi copiati da Binance → matchano cross-venue e non sono flat) ogni asset listato su HL **dopo** lo START. Il `flat`+cross-venue da soli non lo vedono: il rivelatore è il **VOLUME**. `fetch_hyperliquid.py` ora (1) taglia il run iniziale a volume 0, (2) scarta chi resta < 365g reali (es. **AXS 83% sintetico → fuori**), (3) gata i gap vol=0 interni. Universo certificato = **51** (era 52). I **19 major di XS01 hanno 0 backfill → invariati** (strategia live non toccata). Verificato direttamente su cerbero MCP. Diario `2026-06-20-cerbero-backfill-fix.md`. ## Metodologia obbligatoria per ogni nuova strategia 1. **Ingresso eseguibile**: direzione e prezzo decisi con dati **fino a `close[i]`**, mai `close[i-1]` con direzione presa da `i`; mai entry sull'estremo (high/low) di una candela. 2. **Backtest NETTO** dopo fee realistiche Deribit (**0.10% RT** taker; maker ~0%) + leva. 3. **Out-of-sample** held-out + robustezza su **griglia parametri** (entrambi gli asset, tutte le celle positive) + **sweep fee** (0.00-0.20% RT, margine ampio). 4. **Liquidità & plausibilità** (lezione v2.0.0): incrociare ogni edge con la liquidità reale del book (quota di barre flat) e con la plausibilità del prezzo (cross-venue). Un edge full+OOS robusto su un book fermo o su wick fantasma NON è un edge. 5. Strategia in `scripts/strategies/` (codice univoco), test in `tests/`, diario aggiornato. ## Lezioni critiche (da NON ripetere — la storia di questo progetto) - **Feed contaminato → libreria fasulla (v2.0.0).** Print fantasma testnet + Binance/USDT hanno prodotto edge inesistenti (+201%/+1238%/+16492% "OOS"). Tutti spariti sul feed reale. Lezione: il dato viene prima della strategia; certificare sempre. - **Look-ahead squeeze (storico).** L'intera famiglia squeeze-breakout aveva accuratezze 76-82% che erano artefatto: decideva la direzione con la candela di breakout `i` ma entrava a `close[i-1]`. Con ingresso onesto: lancio di moneta. (Dettagli nei diari in `Old/`.) - **Entry sugli estremi di candela.** Strategie che entrano a `close` quando `close` è all'estremo del range (≤0.1% o ≥99.9%) gonfiano i ritorni in modo irrealistico (ETH 2024: +30.848% → +2.725% rimuovendoli). Spesso è un artefatto di dato o di entry non eseguibile. - **Mean-reversion vs breakout.** Sui dati storici l'unica direzione che mostrava edge era la mean-reversion (i breakout rientrano) — MA anche quegli edge erano per lo più artefatto del feed: da riverificare da zero su dati certi. - **Fee** = vincolo di prim'ordine. 0.10% RT baseline. Molte operazioni = morte per fee. - **Leva**: testare 3x; 5x raddoppia il drawdown. I numeri a leva alta NON sono il caso base. - **Data leakage** con rendimenti log: `returns[k] = log(close[k+1]/close[k])` usa `close[k+1]`. I feature devono fermarsi a `returns[i-2]` se il prezzo corrente è `close[i-1]`. Verificare SEMPRE. ## Convenzioni - Strategie in `scripts/strategies/` con codice univoco; scartate documentate nel diario. - Diario in `docs/diary/YYYY-MM-DD.md`, aggiornato dopo ogni esperimento significativo. - **Nessun segreto nei commit** (token/chiavi). `.env` e `.env.mainnet` sono gitignored. - Versionamento: `VERSION` (semver) + `scripts/bump_version.py`. `src/version.py` lo legge. ## Archivio `Old/` Tutto il lavoro pre-reset (preservato in git per consultazione storica): strategie (`Old/scripts/strategies`), stack live e portafogli (`Old/src/live`, `Old/src/portfolio`, `Old/scripts/portfolios`), ricerca/gate (`Old/scripts/analysis`), dati non certificati (`Old/data`), 60+ diari (`Old/docs/diary`), test (`Old/tests`). Consultabile come riferimento ("come facevamo X"), ma **nessun edge lì dentro è fidato** finché non è ri-validato su dati certi. ```