Il follow-up dichiarato stamattina 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. A pari nozionale il muro e' $273.900 contro i $272.061
pubblicati (+1%): l'estrapolazione col book a 2 sleeve era giusta PER CASO.
STRUTTURA: il muro e' un PUNTO FISSO — serve capitale C per girare il book che determina
il muro C, quindi si itera C_{n+1} = muro(book(C_n)). Converge in 1 iterazione perche' il
muro cade SOPRA la soglia XS01 ($117k) e la composizione non cambia; la struttura conta
solo se il muro atterra vicino a una soglia, ma va iterato per saperlo.
BOOK DEPLOYABLE (non il "migliore"): TP01 38 / SKH01 23 / GTAA01 23 / XS01 17. VRP01
escluso per regola permanente (niente short-vol da modello in deploy), XSR01 escluso per
gate pre-registrato 23/10. Costi capital-aware, fattore d'ancora x0.860 misurato su
QUESTO book. Sharpe 1.94, vol 8.9%, CAGR 18.3%.
PERCHE' NON SCENDE: diversificare alza lo Sharpe (1.64 -> 1.94) ma abbassa drift e vol
INSIEME, e la rendita perpetua vive sul DRIFT -> 10.91% -> 10.84%, invariata. Il guadagno
di Sharpe va in meno rischio, non in piu' reddito. E' il fatto gia' misurato il 25/07 §3,
dimenticato scrivendo il follow-up.
E 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: $222k
e' un TETTO, non una stima.
BUG CATTURATO PRIMA DI PUBBLICARE: la prima corsa dava Sharpe 0.95 e muro $854k
("diversificare triplica il muro" — spettacolare e falso). 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%).
Book, pesi, cron, config INVARIATI.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
6.3 KiB
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
- 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.
- 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.
- 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.
- 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.
- Un punto fisso converge subito se non e' vicino a una soglia — ma va iterato lo stesso per saperlo.