research(capitale): il lump-sum vale 2.45x, e la protezione dalla rovina non passa da GTAA01

Quattro filoni chiesti dall'operatore ("proposte"). Book, pesi, config: INVARIATI.

1. LUMP-SUM + VENUE (r0727_lumpsum_split.py). Tutte le traiettorie del 25-26/07 avevano
   START=600 cablato: mai misurato un versamento iniziale, mentre ~10k EUR stanno fermi
   altrove. Macchineria validata: con lump 0 riproduce IDENTICI i numeri del 26/07.
   - 10k EUR oggi e mai piu' nulla -> traguardo 17.2a, P 62%, rendita 61.58 EUR/g
   - equivalenza onesta: +154 EUR/mese per 13 anni = 24.523 EUR, cioe' 2.45x
     (la prima stesura misurava i versamenti risparmiati: numero giusto, domanda sbagliata)
   - col rischio venue: a 11.500$ lo split e' possibile (quota IB 26%, non 25%) e taglia
     P(perso tutto) da 18.4% a 3.5% a p=1%, costando 1.9-2.6pp di P(arrivare)
   - SPLIT-CASSA: seconda gamba ferma costa altri 0.6-0.8pp e protegge IDENTICO
     -> la protezione non e' bloccata dal PRIIPs: serve un CONTO, non uno sleeve

2. FEE WATCH (scripts/live/fee_watch.py). Nuovo schema Deribit dal 1 agosto senza numeri
   pubblicati -> sorvegliante invece di promemoria. Legge il tier base dall'endpoint
   pubblico (oggi taker 5.00 bps), applica la regola congelata e allerta sui cambiamenti.

3. MONITOR HEALTH (src/live/monitor_health.py). Tre gate pre-registrati si decidono su
   serie forward di cui una sola era sorvegliata. Misura coda E buchi interni: una serie
   bucata ma fresca passa qualunque guardia di freschezza.

4. BANDA GTAA01 25% VALIDATA (r0727_gtaa_band_gate.py). 30 celle, 29.9 anni, dpy=252.
   Non e' selection-on-holdout (4/30 IS, 5/30 OOS), DSR 0.999, tracking OK ma AL BORDO.
   Il modo di fallire non e' il de-levering (la vol non scende) ma la perdita di tracking.
   Impatto sul book: zero -> REBAL_BAND_USD non toccato, si applica al deploy.

Aggiunto anche il bullet edge_watch, cablato il 26/07 e mai finito in CLAUDE.md.

Test: 56 nuovi, 504/504 verdi.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Adriano Dal Pastro
2026-07-27 14:14:39 +00:00
parent 3f0812c7fc
commit fd05307c96
13 changed files with 1963 additions and 0 deletions
@@ -0,0 +1,277 @@
# 2026-07-27 — Il capitale già fermo, due sorveglianze mancanti, e la banda GTAA validata
Richiesta dell'operatore: *"proposte"*. Delle cinque proposte messe sul tavolo ne sono state
scelte quattro; questo diario le chiude tutte. **Book, pesi, cron-strategia, config: INVARIATI.**
Il cron guadagna due sorveglianze (non toccano l'esecuzione).
Script: `r0727_lumpsum_split.py`, `r0727_gtaa_band_gate.py`, `scripts/live/fee_watch.py`,
`scripts/live/monitor_health.py` + `src/live/monitor_health.py`.
Test: `test_lumpsum_split.py` (14), `test_gtaa_band_gate.py` (13), `test_fee_watch.py` (13),
`test_monitor_health.py` (16) = **56 nuovi**.
---
## 1. Il capitale già fermo — la leva mai misurata
### Il buco
Tutte le traiettorie pubblicate il 25 e 26/07 hanno `START = 600.0` **cablato**. Il progetto ha
misurato con grande cura il *calendario* dei versamenti (fattore 6 fra front e back loading) e
non ha mai misurato un **versamento iniziale** — mentre sul conto Revolut ci sono ~€10.000, di
cui €6.043 in XEON che rende ~0% reale netto. Il conto che gira ne ha 600.
### Validazione prima dei numeri
La macchineria è una generalizzazione di `r0726_venue_risk.simulate` (capitale iniziale e
deposito diventano parametri, tutto il resto identico incluso l'ordine di consumo dell'RNG).
Con lump=0 e €250/mese deve riprodurre **esattamente** i numeri del 26/07:
```
p=0.0% P(arrivare) 0.9487 vs 0.9487 · P(perso tutto) 0.0000 vs 0.0000 -> IDENTICO
p=1.0% P(arrivare) 0.8080 vs 0.8080 · P(perso tutto) 0.1842 vs 0.1842 -> IDENTICO
```
### Cosa compra un versamento iniziale (p=0, 100% Deribit, 20 anni)
| lump | dep/mese | totale versato | anni al muro | P(entro 20a) | cap. mediano | rendita a 20a |
|---|---|---|---|---|---|---|
| €0 | €0 | $600 | **mai** | 0.0% | $16.354 | €3.21/g |
| €2.000 | €0 | $2.780 | 19.0a | 2.5% | $75.773 | €14.89/g |
| €5.000 | €0 | $6.050 | 18.5a | 22.9% | $164.901 | €32.39/g |
| **€10.000** | **€0** | **$11.500** | **17.2a** | **61.7%** | **$313.448** | **€61.58/g** |
| €0 | €250 | $66.818 | 15.7a | 94.9% | $544.645 | €106.99/g |
| €2.000 | €250 | $68.998 | 15.1a | 96.8% | $605.454 | €118.94/g |
| €5.000 | €250 | $72.268 | 14.4a | 98.2% | $695.475 | €136.62/g |
| €10.000 | €250 | $77.718 | **13.3a** | 99.5% | $844.022 | €165.80/g |
La riga che sorprende è la quarta: **€10.000 fermi oggi, senza versare mai più nulla,** portano
al capitale-rendita in 17.2 anni mediani con P=62%. Il piano da €250/mese senza lump ci arriva in
15.7 anni con P=95%: più affidabile, ma costa $66.818 di versamenti contro $10.900 una volta sola.
### L'equivalenza — e la metrica che sbagliavo
Prima stesura: *"€10.000 subito risparmiano 30 mesi = €7.414 di versamenti futuri, cioè 0.7x"*.
Numero giusto, domanda sbagliata, e la conclusione che invita è l'opposto di quella corretta: il
valore di un lump-sum non è versare *meno*, è arrivare *prima*. La formulazione onesta è a quale
versamento mensile permanente equivale:
| lump | traguardo | equivale a versare | cioè |
|---|---|---|---|
| €2.000 | 15.1a (da 15.7a) | €281/mese | +€31/mese per 15 anni (€5.666) |
| €5.000 | 14.4a | €327/mese | +€77/mese per 14 anni (€13.241) |
| **€10.000** | **13.3a** | **€404/mese** | **+€154/mese per 13 anni (€24.523)** |
**€10.000 oggi valgono €24.500 di versamenti futuri: 2.45×.** È lo stesso meccanismo del
front-loading misurato il 26/07, portato al suo estremo.
### E il rischio di venue, che è la metà scomoda della domanda
Il 26/07 aveva già osservato che il front-loading mette più capitale sull'exchange *prima*.
Un lump-sum è il front-loading estremo, quindi va misurato col rischio dentro. A €10.000 il conto
sarebbe $11.500 e lo split diventa **possibile** — a quota IB **26%**, non il 25% preferito: sotto
$3.000 sulla gamba equity non c'è uno sleeve, c'è cash su un secondo conto.
| p annua | P(arrivare) CONC | SPLIT | SPLIT+costi | **P(perso tutto) CONC** | **SPLIT** |
|---|---|---|---|---|---|
| 0.0% | 99.5% | 98.2% | 98.0% | 0.0% | 0.0% |
| 0.5% | 93.2% | 91.4% | 91.2% | **9.7%** | **0.9%** |
| 1.0% | 87.1% | 85.2% | 85.0% | **18.4%** | **3.5%** |
| 2.0% | 76.2% | 73.2% | 73.1% | **33.7%** | **11.2%** |
| 5.0% | 50.5% | 47.9% | 47.8% | **64.1%** | **40.7%** |
Lo split costa **1.9-2.6pp** di P(arrivare) e taglia P(perso tutto) da 18.4% a 3.5% (a p=1%).
La colonna "SPLIT+costi" applica alla gamba IB il haircut dichiarato (0.8pp/anno di costi a
taglia piccola + 0.1pp di drag UCITS): **cambia lo 0.1-0.2pp**, cioè niente. Il costo della
gamba equity non è ciò che decide.
⚠️ **P(perso tutto) sotto CONC non dipende dal lump** (9.7/18.4/33.7/64.1% a qualunque taglia):
con un conto solo *"almeno un fallimento"* **coincide** con *"perso tutto"*, e quella probabilità
è una proprietà del tempo di esposizione. Il lump non la peggiora — moltiplica ciò che porta via.
### La sezione che serviva davvero: e se la seconda gamba fosse solo liquidità?
GTAA01 **oggi non è deployabile** (blocco PRIIPs; la via UCITS su Degiro è verificata ma in
preparazione). Quindi lo split disponibile *subito* è Deribit + un conto fermo.
| p annua | P(arrivare) CONC | SPLIT-GTAA | **SPLIT-CASSA** | P(perso tutto) CONC | SPLIT |
|---|---|---|---|---|---|
| 0.5% | 93.2% | 91.4% | **90.7%** | 9.7% | 0.9% |
| 1.0% | 87.1% | 85.2% | **84.5%** | 18.4% | 3.5% |
| 2.0% | 76.2% | 73.2% | **72.6%** | 33.7% | 11.2% |
**Tenere ferma la seconda gamba invece di investirla costa 0.6-0.8pp di P(arrivare) e non toglie
NULLA alla protezione** — che è identica, perché dipende da *quanti conti* falliscono, non da cosa
ci sta sopra. **La protezione dalla rovina non è bloccata dal PRIIPs, non aspetta la validazione
della banda, non richiede che GTAA01 esista: richiede un secondo conto.**
### Soglie
* split a quota **raccomandata** (25%): da **$12.000**
* split forzando la quota fino al 35%: da **$8.571**
* con un lump da €10.000 il conto sarebbe **$11.500** → possibile, ma a quota 26%.
La riapertura della decisione di venue è fissata a $20.000. Un lump da €10k porta il conto sotto
quella soglia ma sopra la fattibilità tecnica — ed è **un cambiamento del piano**, il caso in cui
CLAUDE.md dice esplicitamente di riaprire prima. Questa tabella è il materiale per farlo; la
decisione resta dell'operatore, come il 26/07.
⚠️ **Cosa questo filone NON decide:** quanto dei €6.043 in XEON sia un vero fondo d'emergenza.
Un fondo d'emergenza non è capitale disponibile, e la tabella qui sopra misura *cosa compra ogni
euro che entra*, non *quali euro debbano entrare*.
---
## 2. Fee Deribit — un sorvegliante invece di un promemoria
Il nuovo schema entra in vigore il **1° agosto** e l'annuncio non contiene numeri. La regola era
già decisa in anticipo (≤5bps/lato → nulla; >10bps → rivedere il peso di SKH01, 4× più
fee-sensibile di TP01). Mancava solo il modo di accorgersene.
`public/get_instrument` espone il tier **base** — che è quello che paga un conto da $600, dove
ogni soglia VIP è fuori portata — senza chiavi:
```
strumento taker maker liquidaz.
BTC-PERPETUAL 5.00 0.00 75.00
ETH-PERPETUAL 5.00 0.00 90.00
verdetto: [OK] taker 5.0bps <= 5: non si tocca nulla
```
`scripts/live/fee_watch.py` (in `cron_daily.sh`) confronta con l'ultima lettura, allerta su
**qualsiasi** cambiamento — taker, maker e liquidation fee, che l'annuncio tocca tutti e tre — e
applica la regola congelata. Cross-check best-effort sulla fee **realmente pagata** dai trade del
conto, con `{}` che significa *non misurata* e non *zero*.
`test_baseline_e_quella_dei_backtest` lega `BASELINE_TAKER_BPS` al default `fee_rt=0.001` di
`backtest_signals`: se un giorno le due divergessero, il confronto smetterebbe di avere senso.
---
## 3. I forward-monitor non erano sorvegliati
**Tre gate pre-registrati** — STATARB **27/09**, XSR01 **23/10**, DVOLSPREAD kill **24/10** — si
decideranno leggendo serie forward. Di quelle serie **una sola** aveva una guardia d'integrità
(`paper_dvolspread`, contabilità a 3 stati + veto sotto l'80%). Le altre nessuna: `paper_xsr`,
`paper_statarb`, `paper_prevday`, `paper_portfolio`, `paper_combo` → 0 controlli.
Un monitor fermo produce silenzio, e **il silenzio in una serie di ritorni si legge come zero**,
cioè come una misura. È lo stesso schema già pagato con `fresh_5m` (26/07) e col feed-freeze del
14/07.
`src/live/monitor_health.py` misura **due guasti diversi**, perché una sola misura non basta:
* **coda** — l'ultima barra è vecchia (il monitor si è fermato adesso);
* **buchi interni** — la serie è più corta del proprio arco temporale. *Una guardia di sola
freschezza lascerebbe passare un monitor che ha perso il 30% delle barre di mezzo e ha scritto
stanotte* — ed è esattamente il guasto che falsifica un gate senza farsi notare.
Cadenze dichiarate per monitor, perché sbagliarle significa un falso allarme a settimana:
`paper_prevday` registra a barra **oraria** (864 barre in 36 giorni); `paper_combo` vive sul
calendario di **borsa** (venerdì è l'ultima barra fino a lunedì). Soglia di copertura **0.80**,
riusata di proposito dal veto DVOLSPREAD: una soglia diversa per monitor renderebbe i gate non
confrontabili.
Stati: `OK` / `FERMO` / `BUCATO` / `ASSENTE` / **`NUOVO`** — quest'ultimo per i monitor troppo
giovani per un giudizio (XSR01 e DVOLSPREAD hanno 2 barre): non allerta, ma **non risulta sano**.
Stato al 27/07: 6/6 monitor giudicati, tutti OK; `paper_combo` al 96% per il 3 luglio — festività
di borsa che `np.busday_count` non conosce. È un **limite dichiarato** e conservativo (segnala di
più, non di meno).
I test includono i **controlli positivi** obbligatori (un rilevatore che non ha mai segnalato
nulla è indistinguibile da uno rotto): monitor fermo → FERMO, serie bucata e fresca → BUCATO,
stato assente → ASSENTE.
---
## 4. La banda GTAA01 al 25% — validata
La proposta del 27/07 (banda = 25% della gamba invece di $50 assoluti) era dichiarata
esplicitamente non validata. Griglia **30 celle** (5 cadenze × 6 bande) su **29.9 anni** di path
di produzione, annualizzazione **√252** (una serie su giorni di borsa passata a 365 esce con lo
Sharpe ×1.20: l'errore del 25/07).
**(A) Selezione in-sample** (cella scelta sui soli dati pre-2015, letta sul 2015+, l'hold-out
equity documentato di GTAA01):
```
cella scelta al buio : cadenza 1, banda 25% -> IS 0.66 · OOS 0.90 · FULL 0.74
cella proposta 27/07 : cadenza 5, banda 25% -> IS 0.62 · OOS 0.86 · FULL 0.70
rango della proposta : 4/30 in-sample · 5/30 sull'hold-out
```
Il rango **non migliora** passando all'hold-out → non è selezione-sull'hold-out (la firma sarebbe
il contrario). La cella scelta al buio preferisce il controllo **giornaliero**, che vale +0.04 di
Sharpe e costa **42 ordini/anno con 250 controlli manuali**: il conto d'esecuzione non ha API
(misurato il 27/07), quindi non è una configurazione, è un'ipotesi. La cadenza settimanale costa
0.04 e compra l'eseguibilità a mano.
**(B) Deflated Sharpe** sulle 30 celle, dpy=252: **0.999 PASS** (massimo atteso sotto il nullo
0.14), sia per la proposta sia per la cella scelta al buio.
**(C) Null de-levering** — e qui il modo di fallire **non è quello atteso**:
| banda | corr col riferimento | vol/rif | Sh FULL | |
|---|---|---|---|---|
| 0% | 0.983 | 1.03 | 0.59 | OK |
| 10% | 0.980 | 1.02 | 0.64 | OK |
| **25%** | **0.951** | **0.99** | **0.70** | OK (al bordo) |
| 40% | 0.907 | 1.04 | 0.67 | fuori traccia |
| 60% | 0.859 | 1.10 | 0.59 | fuori traccia |
Allargando la banda **la volatilità non scende**: il null de-levering classico non morde. Ciò che
si rompe è il **tracking** — lo sleeve tiene posizioni vecchie e smette di somigliare a sé stesso.
E i due segnali concordano: oltre il 25% la correlazione cala *e* lo Sharpe smette di migliorare,
quindi non esiste una zona in cui il numero premia il congelamento. ⚠️ Ma **il 25% è al bordo**
(corr 0.951 contro una soglia di 0.95), non al centro di un plateau: va citato così.
**Invarianza al capitale** — la ragione per cui la proposta esiste:
| capitale | banda 25% | ord/anno | Sharpe | | banda $50 fissa | ord/anno | Sharpe |
|---|---|---|---|---|---|---|---|
| $3.000 | $125 | 25 | **0.66** | | $50 | 65 | 0.52 |
| $10.000 | $417 | 25 | **0.70** | | $50 | 92 | 0.62 |
| $50.000 | $2.083 | 25 | **0.71** | | $50 | 134 | 0.66 |
⚠️ **25 ordini/anno, non i 21 citati il 27/07**: stimatore diverso (qui il gate contato sulla
griglia dei controlli, 30 anni, veicoli USA; lì i cambi di posizione sulla finestra UCITS di 3.2
anni). L'*invarianza* — che è la proprietà 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 $10.000, dove la banda fissa già funziona: **il valore della proposta è tutto al capitale
piccolo** (0.52 → 0.66 a $3k), cioè al deploy.
**Verdetto: la proposta passa i tre gate.** Produzione **NON toccata**: cambiare
`REBAL_BAND_USD` non sposta un solo numero pubblicato, e lo sleeve non è deployabile prima dei
$20k. Il cambio si applica **al deploy**, insieme alla scelta del broker, con questo diario come
giustificazione.
---
## 5. Il debito chiuso di straforo
`edge_watch.py` — i criteri di kill del book **live** — è in cron dal 26/07 e **non era in
CLAUDE.md** (zero occorrenze). Il criterio di morte di ciò che gira con soldi veri non stava nella
memoria operativa del progetto: la sessione successiva avrebbe ragionato come se non esistesse.
Aggiunto.
---
## 6. Regole
1. **Un parametro d'esecuzione scelto guardando il risultato è selezione come ogni altra**, e va
passato per gli stessi gate — anche quando "è solo esecuzione" e non tocca l'allocazione.
2. **Quando si misura l'effetto di un vincolo, si misura anche il vincolo del vincolo.** Lo split
di venue a $11.500 non è "25% su IB": è 26%, perché sotto $3.000 la gamba equity non esiste.
È il capitale a scegliere la quota, non la preferenza.
3. **Il valore di un versamento iniziale non si misura in versamenti risparmiati** (domanda
sbagliata, rapporto 0.7×) ma in **versamento mensile equivalente** (2.45×). La prima
formulazione invita alla conclusione opposta.
4. **Una guardia di freschezza non è una guardia d'integrità.** Il guasto che conta — la serie
bucata e fresca — passa la prima e fallisce la seconda.
5. **Il verdetto pre-scritto va confrontato coi numeri prima di stamparlo.** Il testo di (C)
diceva "il numero migliora perché esce dal mercato": la vol misurata *non scendeva*, quindi era
falso. Il fallimento vero era un altro (tracking), e dirlo giusto vale più che avere ragione.
6. **Un rischio non-diversificabile si compra con un secondo conto, non con un secondo sleeve.**
La protezione dalla rovina è identica con GTAA01 o con liquidità: dipende da quanti conti
falliscono, non da cosa ci sta sopra.