Files
PythagorasGoal/docs/diary/2026-07-26-wall-fixedpoint.md
Adriano Dal Pastro 3a44171402 research: il muro come punto fisso — la previsione del follow-up era SBAGLIATA
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>
2026-07-26 18:56:07 +00:00

6.3 KiB
Raw Permalink Blame History

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.