Files
PythagorasGoal/docs/diary/2026-07-26-skh-live-book-deluck.md
T
Adriano Dal Pastro 825bf081f4 research: traiettoria di accumulo ricalcolata col fattore de-luck corretto
Il fattore agisce DUE volte e i due effetti pesano quasi uguale: alza il drift (si
accumula prima) E abbassa il bersaglio (il muro scende da $495k a $272k). Le colonne
li separano invece di sommarli alla cieca.

Mediana degli anni da $600 al capitale-rendita (block bootstrap, 3000 path, 25 anni):

  dep./mese   x0.60 muro $495k   x0.89 muro $495k   x0.89 muro $272k
              (25/07)            (solo drift)       (26/07)
     0        mai                mai                mai
     250      22.4a  (8% <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%)

VALIDAZIONE: la colonna x0.60 riproduce ESATTAMENTE i numeri pubblicati il 25/07
(500/m -> 19.6a, 1000/m -> 14.8a) -> la replica e' fedele e le altre due colonne sono
confrontabili con quelle.

A 500 EUR/mese: dei ~7 anni guadagnati, ~4 vengono dal drift e ~3 dal bersaglio.

CIO' CHE NON CAMBIA: 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:
correggere il x0.6 accorcia i tempi, non crea una via che non c'era.

Book, pesi, cron, config INVARIATI.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-26 17:05:49 +00:00

216 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2026-07-26 — Follow-up SKH01 "vol-targeted": il blocco non esisteva. E il ×0.6 era troppo severo del 31-34%.
**Richiesta:** *"fai il follow-up SKH01 vol-targeted"*.
**Script:** `r0726_skh_sigcache.py` (cache), `r0726_skh_live_book.py` (misura),
`r0726_deluck_factor.py` (decomposizione), `r0726_capwall_refresh.py` (muri ricalcolati).
**Test:** `tests/test_skh_live_book.py` (8). **Book, pesi, cron, config: INVARIATI.**
---
## 0. Il follow-up era mal diagnosticato
Portato avanti come bloccante per tre sessioni, con questa motivazione registrata in CLAUDE.md:
> il book ricalcolato sul path live e' bloccato da una **incompatibilita' di lenti** — il
> simulatore SKH01 compone per-trade a nozionale unitario, **lo sleeve e' vol-targeted**;
> combinarle darebbe un numero preciso e falso.
**Lo sleeve SKH01 non e' vol-targeted.** Tre verifiche indipendenti:
1. `_skyhook_returns` chiama `backtest_signals(..., leverage=1.0, position_size=1.0)` — che nel
suo docstring dice *"ogni trade muove capital di position_size \* leverage \* ret_netto"*:
compounding per-trade a nozionale pieno, **la stessa lente del simulatore**;
2. nel sorgente dello sleeve non compare `target_vol` / `vol_target` / `realized_vol`;
3. `r0702_anchor_skh01.sim_equity(mode='canonical')` riproduce `backtest_signals` con
**max|diff| = 0.0**.
Vol annualizzata realizzata per sleeve: SKH01 **20.7%**, TP01 12.2%, XS01 20.9%, GTAA01 5.4%.
Il 20.7% e' probabilmente cio' che aveva suggerito "vol-target 20%" — ma e' un **prodotto** della
strategia (uscite % asimmetriche + poco tempo a mercato), non un parametro. **SKH01 e' l'unica
delle cinque a NON essere vol-targeted**, ed e' il contrario di quanto si credeva.
**Lezione:** un blocco dichiarato va ri-verificato prima di costruirci sopra, non ereditato. Qui
il costo e' stato tre sessioni di follow-up rimandato per un ostacolo inesistente, e la verifica
che lo ha smontato e' durata due minuti.
---
## 1. La misura: ingressi live vs backtest, de-luckata
Due path identici in tutto (livelli, uscite intra-barra, cap `max_per_day`, fee, non-overlap)
tranne **quando si valuta l'ingresso**: LIVE = a ogni confine orario dentro il bin 230m (cio' che
il cron fa), BACKTEST = solo a chiusura di bin.
Riusa la macchina a stati fedele del 26/07 (`r0726_skh_partial_entry.simulate`). ⚠️ Trovato per
strada: **`simulate` non e' mai chiamata da `main()` di quello script** — i numeri headline del suo
diario vennero da una corsa ad hoc mai committata. Qui il driver e' committato.
**Costo:** la ricostruzione del segnale a ogni osservazione oraria costa ~9 min per (asset,
offset). Su 2 core con il cron live da non affamare, la griglia piena (23 offset) era fuori
portata → **sottocampione uniforme dichiarato a priori: 8 offset**, uno ogni 90m su [0,690).
E' un sottocampione per costo, non una selezione; la banda che ne esce ha 8 punti invece di 23.
**Sanity superato prima di tutto** (campionato sugli EVENTI, non sulla popolazione — lezione del
26/07): **120/120** bin con ingresso ricostruiti su entrambi gli asset.
```
off CANON ShBT ShLIVE dSharpe trade LIVE trade BT falsi
0 +1.446 +1.174 +1.204 +0.029 534 447 68
90 +1.043 +1.182 +1.194 +0.011 538 472 67
180 +1.467 +1.505 +1.698 +0.193 544 469 60
270 +1.231 +1.199 +1.205 +0.006 605 477 179
360 +0.761 +1.069 +1.397 +0.328 570 478 109
450 +0.921 +0.917 +2.025 +1.108 530 484 36
540 +0.751 +0.374 +0.445 +0.071 531 411 138
630 +0.871 +0.991 +1.144 +0.154 460 412 47
SLEEVE (50/50) mediana appaiata +0.112 positive 8/8 banda [+0.006, +1.108]
PER-ASSET mediana appaiata +0.097 positive 13/16 banda [-0.170, +1.086]
```
**Il numero del 26/07 era ~4x troppo grande.** Confrontando like-with-like — quel diario citava la
mediana **per-asset** — si passa da **+0.38 su 3 offset** a **+0.097 su 8**, e da "6/6 non
negativi" a **13/16**. Il segno regge, la taglia no: ennesimo Δ misurato su poche ancore che ne
eredita la fortuna. L'outlier a offset 450 (+1.108) mostra perche' la statistica e' la mediana.
⚠️ Le due righe della tabella **non sono la stessa grandezza** e vanno tenute separate: nel BOOK
entra lo sleeve 50/50, dove la diversificazione BTC/ETH cambia il denominatore.
### A livello di book
```
dSharpe FULL mediana +0.048 p10 -0.015 p90 +0.677 >0 in 79.3%
dSharpe HOLD-OUT mediana +0.051 p10 -0.589 p90 +0.721 >0 in 51.2%
d drift annuo mediana +0.731pp p10 +0.044pp p90 +6.800pp >0 in 100.0%
```
Lo Sharpe e' quasi una monetina, **il drift e' positivo nel 100% delle estrazioni**. Meccanismo:
l'ingresso intra-bin prende un prezzo migliore (piu' drift) ma i falsi ingressi aggiungono churn
(530-605 trade live contro 411-484) → vol e ritorno salgono insieme e lo Sharpe non si muove.
Per la domanda del ×0.6, che e' **sul drift**, il numero rilevante e' +0.73pp.
---
## 2. Un'ipotesi mia, nata e morta nella stessa sessione
Guardando i primi **due** offset avevo notato che il canonico oscillava di 0.40 mentre i path del
simulatore stavano fermi, e ne avevo tratto un'ipotesi: la *grid timing-luck* di SKH01 (audit
02/07: 93-98° pctl, "spike non plateau", gate DD<30% che fallisce in 15/23 offset) sarebbe stata
in buona parte un **artefatto della lente a chiusura-di-bin**, non una fragilita' della strategia
live — che valuta ogni ora e non e' ancorata al confine del bin.
**Refutata.** Dispersione dello Sharpe fra gli 8 offset:
```
path min mediana max range std
CANONICO (chiusura bin) +0.751 +0.982 +1.467 0.716 0.289
BT-sim (chiusura bin) +0.374 +1.122 +1.505 1.131 0.325
LIVE-sim (intra-bin) +0.445 +1.204 +2.025 1.580 0.459
rapporto di dispersione LIVE/CANONICO: 1.59x
```
Il path live e' **piu'** disperso fra le fasi della griglia, non meno. **L'audit del 02/07 resta
valido com'e':** la timing-luck di SKH01 e' della strategia, non della lente. L'ipotesi e' nata su
2 offset, si e' incrinata a 4 (1.24x) e si e' chiusa a 8 (1.59x) — e la direzione dell'errore era
sempre la stessa, il che e' il motivo per cui 2 punti non bastano mai.
---
## 3. Il ×0.6 decomposto, misurato, corretto
Il fattore taglia il **drift** (`b - 0.4*mean(b)`) ed era applicato **sopra** la lente `hourly`,
cioe' sopra un modello del live gia' pessimistico. Mescolava due cose separabili.
**(a) Fortuna d'ancora sul drift** — misurata sullo spazio congiunto:
| | canonico | pctl | MEDIANA | p10-p90 |
|---|---|---|---|---|
| book 5-sleeve, drift | 17.33% | 96.0° | **15.15%** | [13.88, 16.49] |
| book 5-sleeve, CAGR | 18.56% | 96.0° | **16.00%** | [14.55, 17.56] |
| book LIVE 75/25, drift | 19.27% | 93.8° | **17.16%** | [15.75, 18.67] |
→ fattore d'ancora **×0.874** (5-sleeve) / **×0.890** (book live). La **vol e' invariata** fra le
ancore (7.80% → 7.76%): la fortuna sta tutta nel drift, non nel rischio.
**(b) Degradazione del path live** — non-negativa su tutto cio' che e' stato misurato:
uscite SKH01 **+0.081** Sharpe di book (23/23 offset); ingressi SKH01 **+0.73pp** di drift
(100% delle estrazioni); TP01 barra parziale trascurabile (24 ancore).
**Il ×0.6 implicava un residuo ×0.687 attribuito al live oltre l'ancora.** Nessuna misura del
progetto lo sostiene. Il sospetto gia' registrato in CLAUDE.md — *"il ×0.6 sopra il path live
rischia di contare DUE VOLTE la degradazione SKH01"* — e' **confermato quantitativamente**.
> **FATTORE ONESTO: ×0.87 ×0.91** (5-sleeve) / **≥×0.89** (book live), contro il ×0.60 in uso.
> **Troppo severo del 31-34%.**
La componente uscite spingerebbe oltre, ma e' misurata in Sharpe e non in drift: non convertita,
per non inventare precisione. Quindi il limite superiore e' esso stesso conservativo.
---
## 4. Cosa cambia nei muri di capitale (`r0726_capwall_refresh.py`)
Stessa macchineria del 25/07 (`book_series`, `survival`, `_boot_paths` importati, non riscritti).
```
fattore leva SWR-20a PERPETUA capitale
×0.60 (25/07, a occhio) 1.00 7.36% 6.00% $494,758
×0.60 (25/07, a occhio) 1.50 8.16% 8.11% $366,300
×0.89 (26/07, ancora MISURATA) 1.00 10.94% 10.91% $272,061
×0.89 (26/07, ancora MISURATA) 1.50 13.72% 14.87% $199,625
×1.00 (nessun haircut) 1.00 12.48% 12.72% $233,330
```
**Il muro per 50 EUR/g scende del ~45%: da ~$495k a ~$272k** (leva 1.0), e il valore vero sta fra
la riga ×0.89 e la riga ×1.00 perche' ×0.89 e' un limite inferiore.
**Cio' che NON cambia:** $272k restano **~453x** il conto di oggi. La conclusione strutturale del
25/07 — *i 600 euro come CAPITALE sono refutati, come BIGLIETTO (prop) no* — regge intatta.
Cambia la taglia dell'errore, e cambia che il numero e' misurato invece che scelto.
Rendita sul conto attuale: EUR 0.12/g (×0.6) → **EUR 0.18/g** (×0.89). A questa taglia sono
centesimi: **il fattore conta per il MURO e per le soglie prop, non per il conto di oggi.**
### La traiettoria — il fattore agisce DUE volte
Correggere il fattore alza il drift (si accumula prima) **e** abbassa il bersaglio (serve meno
capitale). I due effetti pesano quasi uguale, quindi vanno separati invece che sommati alla cieca:
```
dep./mese ×0.60 muro $495k ×0.89 muro $495k ×0.89 muro $272k
(25/07) (solo drift) (26/07)
€0 mai mai mai
€250 22.4a (8% <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%)
```
**Validazione indipendente:** la colonna ×0.60 riproduce **esattamente** i numeri pubblicati il
25/07 (€500/m → 19.6a, €1000/m → 14.8a). La replica e' fedele, quindi le altre due colonne sono
confrontabili con quelle.
A €500/mese: dei ~7 anni guadagnati, ~4 vengono dal drift e ~3 dal bersaglio piu' basso.
⚠️ **Cio' che il fattore NON cambia:** 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 —
correggere il ×0.6 accorcia i tempi, non crea una via che non c'era. E la mediana e' una mediana:
meta' dei path arriva dopo, e una quota non arriva affatto.
---
## 5. Regole trasferibili
1. **Un blocco dichiarato e' un'ipotesi, non un fatto.** Ri-verificarlo prima di costruirci sopra
o di rimandare: qui tre sessioni di attesa contro due minuti di verifica.
2. **Un Δ su poche ancore eredita la loro fortuna, sempre** — terza occorrenza in due giorni
(recupero on-book, degrado d'esecuzione, e ora gli ingressi: +0.38 → +0.097).
3. **Quando un fattore correttivo e' scelto a occhio, decomporlo prima di rifiutarlo o accettarlo.**
Il ×0.6 non era "sbagliato": era due fattori moltiplicati insieme, uno dei quali contato due volte.
4. **Sharpe e drift rispondono a cose diverse.** L'effetto ingressi e' una monetina sullo Sharpe e
certo sul drift: chiedersi *quale* delle due grandezze entra nella decisione prima di misurare.
5. **Due punti non fanno una tendenza** — nemmeno quando la meccanica sembra spiegarla. L'ipotesi
sulla dispersione era plausibile e sbagliata, e il costo di verificarla era basso.