# 2026-07-26 — Il muro come PUNTO FISSO: la mia previsione era sbagliata, e il numero pubblicato era giusto per caso **Richiesta:** *"fai follow up"* — il follow-up dichiarato poche ore prima: > I muri assumono il book a 2 sleeve da $600 fino a $272k. Il book a 5 sleeve ha Sharpe piu' alto, > quindi **il muro vero e' piu' basso di $272k**. **Script:** `r0726_wall_fixedpoint.py`. **Test:** `tests/test_wall_fixedpoint.py` (11). **Book, pesi, cron, config: INVARIATI.** --- ## 0. Esito in una riga **La previsione era sbagliata: il muro NON scende.** A pari nozionale e' **$273.900** contro i **$272.061** pubblicati — **+1%**, cioe' l'estrapolazione col book a 2 sleeve era **giusta per caso**. Solo a **iso-rischio** scende, a **$222.406 (−18%)**, e li' serve leva a costo minore dell'uplift, che non e' gratis. --- ## 1. La struttura giusta: il muro e' un punto fisso Il difetto era reale: `book_series(alloc=$600)` e' il book a **2 sleeve**, estrapolato fino a $272k. A quella taglia gireresti un altro book — a ~$13k si accende GTAA01 (IB), a ~$118k XS01 (Hyperliquid, 19 gambe). E la correzione ha una forma: **serve capitale C per girare il book che determina il muro C**. Si itera `C_{n+1} = muro(book(C_n))`. ``` iter capitale ipotesi sleeve Sharpe rendita -> muro 0 $272,061 TP01+SKH01+GTAA01+XS01 1.94 10.84% $273,900 CONVERGE a $273,900 (variazione < 2%) ``` Converge in **una** iterazione, e il motivo e' istruttivo: il muro cade **sopra** la soglia di XS01 ($117k), quindi la composizione del book non cambia fra un'iterazione e l'altra. La struttura a punto fisso conta solo se il muro atterra **vicino a una soglia** — qui non succede, ma non si poteva sapere prima di iterare. **Regole di ammissione rispettate** (e' il book *deployable*, non il *migliore*): **VRP01 escluso** (regola permanente: niente short-vol da modello in deploy), **XSR01 escluso** (gate pre-registrato 23/10), pesi = book attivo rinormalizzato, costi **capital-aware** (TP01 haircut min-order, GTAA01 commissione IB reale a banda+cadenza, SKH01 sul path live), fattore d'ancora **misurato su questo book** (×0.860) e non ereditato. --- ## 2. Perche' il muro non scende ``` sleeve peso drift/a vol/a Sharpe TP01 38% 15.7% 12.2% 1.29 SKH01 23% 27.6% 23.4% 1.18 GTAA01 23% 6.1% 5.4% 1.12 XS01 17% 28.0% 20.9% 1.34 book 2-sleeve (riferimento) drift 18.6% vol 11.4% Sharpe 1.64 book deployable al p.fisso CAGR 18.3% vol 8.9% Sharpe 1.94 ``` Diversificare **alza lo Sharpe** (1.64 → 1.94) ma abbassa **drift e vol insieme**. La rendita perpetua vive sul drift: 10.91% → 10.84%, cioe' **invariata**. Il guadagno di Sharpe finisce tutto in **meno rischio**, non in piu' reddito. E' esattamente il fatto gia' misurato il 25/07 (§3): *"Diversificare NON crea reddito a pari nozionale — libera BUDGET DI RISCHIO"*. Non me ne ero ricordato scrivendo il follow-up. ## 3. Il confronto onesto e' a ISO-RISCHIO — e stavo violando una regola del progetto CLAUDE.md ha una regola codificata il 25/07: > **Un diversificatore a basso CAGR si giudica a ISO-RISCHIO, mai a iso-nozionale** (e' il null > de-levering al contrario). Il confronto che avevo impostato era **iso-nozionale**: quello sbagliato secondo la regola del progetto stesso. ``` lente rendita muro 2 sleeve, ×0.89 (pubblicato) 10.91% $272,061 deployable, ISO-NOZIONALE (leva 1.00x) 10.84% $273,900 (+1%) deployable, ISO-RISCHIO (leva 1.28x) 13.35% $222,406 (-18%) ``` ✅ **Replica indipendente:** il 25/07 misurava, con macchineria diversa e su un book diverso, iso-rischio → **−19% di muro**. Qui esce **−18%**. Due implementazioni separate, stesso numero. ⚠️ L'iso-rischio vale **solo se la leva e' (a) disponibile e (b) a costo minore dell'uplift** — addendum IB del 25/07: su ETF a IB c'e' Reg-T 2x (portfolio margin da ~$110k) e il margine costa ~5.5%/anno. **Il $222k NON sconta il costo del margine: e' un tetto, non una stima.** --- ## 4. Il bug che ha quasi prodotto un titolo grottesco La prima corsa dava: Sharpe **0.95**, CAGR 6.7%, muro **$854.013** — cioe' *"diversificare triplica il muro"*, un risultato spettacolare e falso. Il numero era plausibile abbastanza da poter essere pubblicato. **Causa:** `CC.gtaa_banded` ritorna la storia GTAA **dal 1996**, mentre lo sleeve di produzione (`sleeves._gtaa_daily_returns`) la tronca a `GTAA_BOOK_ACTIVATION` (2019-03). Con la rinormalizzazione per-riga di `combine_outer`, per il **75% del campione** (1996-2019) il "book a 4 sleeve" era **GTAA01 da solo al 100%** — uno sleeve al 4% di drift. **Come l'ho preso:** non da un test, ma perche' **la somma pesata dei componenti (~18%) non tornava col drift del combinato (6.8%)**. Una discrepanza di 11 punti che non sapevo spiegare. **Diagnostica decisiva:** la copertura per colonna — `TP01 24.6% / SKH01 24.6% / GTAA01 100.0% / XS01 8.6%`. Un 100% accanto a tre valori bassi dice tutto in una riga. **Cablato:** `test_gtaa_e_troncato_all_era_book` (la causa), `test_il_book_deployable_non_parte_dal_1996` (l'effetto, per prendere una gamba futura che reintroducesse storia antecedente) e `test_il_book_a_4_sleeve_ha_sharpe_superiore_al_singolo_gtaa` (plausibilita'). --- ## 5. Regole trasferibili 1. **Un follow-up dichiarato contiene una PREVISIONE, e la previsione va misurata, non assunta.** Avevo scritto in CLAUDE.md "il muro vero e' piu' basso": era una deduzione ragionevole (piu' Sharpe → piu' rendita) e sbagliata, perche' la rendita vive sul **drift**. 2. **Prima di misurare, rileggere le regole gia' codificate.** La risposta ("diversificare non crea reddito a pari nozionale, si giudica a iso-rischio") era gia' in CLAUDE.md dal 25/07 e ho impostato comunque il confronto sbagliato. 3. **Quando un aggregato non torna con la somma dei suoi pezzi, fermarsi.** L'11% di discrepanza era l'unico segnale del bug: nessun test lo copriva, nessuna eccezione, output plausibile. 4. **La copertura per colonna e' la prima diagnostica di un outer-join.** Un 100% accanto a valori bassi = una gamba con storia diversa che domina la rinormalizzazione. 5. **Un punto fisso converge subito se non e' vicino a una soglia** — ma va iterato lo stesso per saperlo.