research(prop): lente wick ACCOPPIATA — chiude il follow-up dichiarato del 25/07

La scala di conti funded era giudicata con due lenti a un ordine di grandezza di
distanza su P(>=50 EUR/g): 20.7% close-only vs 1.6-2.5% wick indipendente. Il
difetto era dichiarato (gap estratto indipendente dal rendimento del giorno) ma
il recon accoppiato esisteva solo per il book 75/25.

Qui si generalizza: sleeve TP01/SKH01 separati a risoluzione oraria (minimo
intraday esatto per qualsiasi vettore di pesi) + XS01 accoppiato dagli OHLC
giornalieri HL (recon = sleeve ufficiale a max|delta|=0.0).

FINDING: la calibrazione del wick era giusta, l'errore era l'INDIPENDENZA. Le
marginali coincidono (p50 -0.17pp identico) ma il gap e' ~3x piu' profondo nei
giorni che finiscono BENE (-1.58pp vs -0.48pp), perche' un giorno brutto chiude
sul minimo (m==R nel 26% dei giorni). Il breach si valuta sul minimo -> la lente
indipendente raddoppia i breach da daily-loss (2.0-2.9x, misurato sui giorni
storici). close-only non e' conservativa ma CIECA: 0.00% di breach ovunque.

Verifiche: (1) 1h vs 5m identici (p99 -3.06 vs -3.14pp) -> il caveat di
risoluzione del 24/07 e' trascurabile; (2) riconciliazione col 24/07 RISOLTA
(63.2% vs 58% sulla stessa finestra: non era la finestra, era la lente);
(3) bound severo su XS01 non ribalta config B.

Decisioni: funded 0.75x (non 0.50x — massimizza il payout a 3 anni, $2674 vs
$1230); scala P(>=50/g) ~6% con P(zero) 52-65%; ordine fra politiche invariato
a tutte e 3 le lenti. Book/pesi/cron INVARIATI.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Adriano Dal Pastro
2026-07-25 19:30:03 +00:00
parent 8831c3ff38
commit 4cb82dc474
4 changed files with 1108 additions and 12 deletions
@@ -0,0 +1,234 @@
# 2026-07-25 — La lente wick ACCOPPIATA: chiusura del follow-up dichiarato
**Script:** `scripts/research/r0725_prop_coupled.py` · **Test:** `tests/test_prop_coupled.py` (13 casi)
**Segue:** `2026-07-25-rendita-capcurve-prop.md` §5 (scala prop) e §7 (HyroTrader)
**Book / pesi / cron: INVARIATI.** Nessuna decisione di portafoglio dipende da questo lavoro.
---
## 1. Cosa era rimasto aperto, e perché contava
La scala di conti funded (§5 del diario di stamattina) era stata giudicata con **due lenti** che
differiscono di un **ordine di grandezza** su P(≥50 €/g in 3 anni):
| lente | P(≥50/g) | com'era descritta |
|---|---|---|
| close-only | **20.7%** | tetto ottimista — le regole prop scattano sull'equity intraday, non sulla chiusura |
| wick indipendente | **1.6-2.5%** | pavimento pessimista — gap lognormale estratto **indipendente** dal rendimento del giorno |
Una banda 1.6%-20.7% non decide niente: è la differenza fra "scommessa a coda destra che vale i
600 euro" e "non vale la pena". E il difetto del pavimento era **già dichiarato** nel docstring:
> *«nella realtà i wick profondi stanno sulle giornate brutte (sono ACCOPPIATI): estrarli
> indipendenti aggiunge finti tuffi anche nelle giornate buone → breach spuri → stima troppo
> severa. Il modo giusto è il bootstrap delle TUPLE (ritorno, gap) come in
> r0724_goal50_intraday_mc.py, che però ha il recon solo per TP01+SKH01 → FOLLOW-UP dichiarato.»*
Questo lavoro chiude quel follow-up.
## 2. Metodo
Tre pezzi, tutti verificati contro qualcosa di indipendente:
1. **Recon per-sleeve a risoluzione oraria.** `r0724` calcola il minimo intraday del book Deribit
con i pesi 75/25 **cablati dentro**. Qui i pesi si dividono via per ottenere gli sleeve nudi
(ret, wick) di TP01 e SKH01 — così il minimo si compone **esattamente** sul path orario per
**qualsiasi** vettore di pesi. Logica invariata: exit-al-livello, SL prioritario, fee.
2. **Lente accoppiata per XS01**, che su Hyperliquid è 1d nativo. L'escursione intraday si
ricostruisce dagli **OHLC giornalieri** dei 19 alt: il book si valuta ai 4 checkpoint
O / primo estremo / secondo estremo / C, con **ordinamento condiviso** fra le gambe (le alt
co-muovono) preso nell'ordine **avverso**. Non è path-exact, ma è **accoppiato al giorno vero**,
che è tutto il punto.
*Sanity:* il recon riproduce lo sleeve ufficiale con `max|Δ| = 0.0` esatto.
3. **Le tre lenti sulla stessa macchina di simulazione** (close / indipendente / accoppiata), così
il confronto non mescola differenze di modello con differenze di lente.
---
## 3. Il risultato principale: la calibrazione era giusta, l'**indipendenza** era l'errore
Confronto delle distribuzioni **marginali** del gap (book live TP01/SKH01, 2691 giorni):
| | p50 | p90 | p99 | peggiore |
|---|---|---|---|---|
| **accoppiato (recon)** | 0.17pp | 1.03pp | 2.70pp | 5.96pp |
| indipendente (calibrazione 25/07) | 0.17pp | 0.90pp | 3.50pp | — |
**Sono quasi identiche.** La calibrazione lognormale di stamattina era buona. Quello che era
sbagliato non è *quanto* sono profondi i tuffi, ma **su quali giorni cadono**.
### 3.1 E la dipendenza va nel verso inatteso
Mi aspettavo — e lo avevo scritto — che i gap profondi stessero sui giorni brutti. **È il
contrario:**
| book | giorni | m==R | gap medio | gap \| decile PEGGIORE | gap \| decile MIGLIORE |
|---|---|---|---|---|---|
| A TP01/SKH01 (live) | 2691 | 26% | 0.38pp | **0.48pp** | **1.58pp** |
| B +XS01 (diversif.) | 937 | 20% | 0.36pp | 0.39pp | 1.30pp |
| TP01 solo | 2691 | 33% | 0.39pp | 0.59pp | 1.57pp |
| SKH01 solo | 2691 | 76% | 0.39pp | 0.40pp | 2.97pp |
| XS01 solo | 937 | 53% | 0.44pp | 0.22pp | 2.32pp |
L'escursione intraday è **~3× più profonda nei giorni che finiscono BENE** che in quelli che
finiscono male. Il meccanismo, una volta visto, è ovvio: un giorno brutto **scende tutto il
giorno e chiude sul minimo** (`m == R` nel 26% dei giorni: la chiusura *è* il peggio), mentre
un recupero a V ha un minimo profondo e una chiusura alta.
Il breach però si valuta **sul minimo**. Quindi ciò che conta è quanto gap si aggiunge **nei
giorni brutti** — e lì il gap vero è ~1/3 di quello dei giorni buoni. Un'estrazione indipendente
usa la stessa distribuzione ovunque, e così **carica i giorni brutti con la coda che nella realtà
appartiene ai giorni buoni**.
### 3.2 Quanto costa, misurato sui giorni storici (nessun bootstrap)
Frazione di giorni che sfondano la regola di daily-loss:
| book | leva | regola | close-only | **ACCOPPIATO** | indipendente | gonfiaggio |
|---|---|---|---|---|---|---|
| A (live) | 0.75 | daily 4% (HYRO) | 0.00% | 0.21% | 0.40% | **1.9×** |
| A (live) | 1.00 | daily 4% (HYRO) | 0.00% | 0.32% | 0.78% | **2.4×** |
| B (+XS01) | 0.75 | daily 4% (HYRO) | 0.00% | 0.11% | 0.25% | **2.4×** |
| B (+XS01) | 1.00 | daily 5% (FTMO) | 0.00% | 0.11% | 0.31% | **2.9×** |
Due letture:
- la lente indipendente **raddoppia** i breach da daily-loss (2.0-2.9×);
- **close-only non è "leggermente ottimista": è strutturalmente cieca.** Fa `0.00%` su ogni riga —
la regola di daily-loss **non scatta mai** sulle chiusure. Non è una lente approssimata, è una
lente che non vede affatto quel vincolo.
---
## 4. Tre verifiche — perché un "nessuna differenza" va provato, non assunto
### (1) Risoluzione: l'1h basta? — **sì, misurato**
TP01 tiene peso costante nel giorno, quindi il suo minimo intraday si può calcolare **anche a 5m**
ed è un confronto pulito:
| | p50 | p90 | p99 | peggiore |
|---|---|---|---|---|
| gamba TP01 @1h | 0.337pp | 1.358pp | 3.056pp | 5.34pp |
| gamba TP01 @5m | 0.336pp | 1.366pp | 3.136pp | 5.33pp |
Identici. **Il caveat "i wick a 1h sono un tetto, i 5m sarebbero più profondi" — portato avanti dal
24/07 — è quantificato e trascurabile.** L'ora cattura già il minimo del giorno: i 5m aggiungono
solo rumore dentro un'ora di minimo già individuata.
*Nota di metodo:* entrambe le righe riportavano `n=1865` e la cosa sembrava un errore (stessa
serie confrontata due volte). Non lo era: il filtro scarta i giorni in cui TP01 è **flat** (~30%),
che sono gli stessi a qualsiasi risoluzione. Verificato prima di accettare il risultato.
### (2) Riconciliazione col 24/07 — **la discrepanza dichiarata è risolta**
CLAUDE.md portava un ⚠ aperto: *«Discrepanza col 24/07 (P(vivo) A@0.75x 58% vs 10% mio)»*, con
l'ipotesi che fosse un effetto-finestra. **Non era la finestra, era la lente:**
| finestra | lente | P(pass) | P(vivo 1a) | E[payout/a] |
|---|---|---|---|---|
| 2019-03+ FULL | close | 53.8% | 79.7% | $2.085 |
| **2019-03+ FULL** | **accoppiato** | 48.1% | **63.2%** | $1.618 |
| 2024+ comune | close | 47.0% | 74.8% | $1.632 |
| 2024+ comune | accoppiato | 35.6% | 39.4% | $770 |
Sulla **stessa finestra piena** del 24/07 (recon MTM indipendente, che dava **58%**) la mia lente
accoppiata dà **63.2%** — accordo entro 5pp, con due implementazioni scritte separatamente. Il
**10%** del 25/07 era l'artefatto della lente indipendente. La finestra spiega il resto
(63.2% full → 39.4% sul 2024+, dove config A è debole).
### (3) Bound severo su XS01 — **non ribalta niente**
È XS01 a reggere il vantaggio della config diversificata, e il suo gap dipende da una convenzione
(ordinamento condiviso). Girato anche il bound opposto — ogni gamba al **proprio** peggio nello
stesso istante, fisicamente impossibile su 10 gambe co-moventi ma utile a delimitare l'errore:
| convenzione | gap p90 | peggiore | P(pass) | P(vivo 1a) | E[payout/a] |
|---|---|---|---|---|---|
| ordine condiviso (base) | 0.86pp | 4.81pp | 42.9% | **76.0%** | $1.144 |
| per-gamba (bound severo) | 1.83pp | 15.56pp | 32.3% | **57.6%** | $814 |
| *config A, per confronto* | — | — | 35.6% | **39.4%** | $770 |
Anche al bound severo **config B resta sopra config A** (57.6% vs 39.4%, $814 vs $770). La
conclusione non dipende dalla convenzione.
---
## 5. Cosa cambia nelle decisioni
### 5.1 La raccomandazione HyroTrader si sposta da 0.50x a **0.75x**
Config B (book diversificato, +XS01), lente accoppiata, finestra 2024+:
| leva | P(pass eval) | P(vivo 1a) | E[payout/a] | **E[payout] su 3 anni** |
|---|---|---|---|---|
| 0.50x | 28.6% | 99.5% | $412 | ~$1.230 |
| **0.75x** | 42.9% | 76.0% | $1.144 | **~$2.674** |
| 1.00x | 46.6% | 42.1% | $1.246 | ~$1.992 |
Stamattina la scelta era **0.50x**, perché la lente indipendente dava a 0.75x una sopravvivenza
del 55%. Con la lente onesta la sopravvivenza a 0.75x è **76%**, e 0.75x **massimizza il payout
atteso su 3 anni** — batte 0.50x di 2,2× e 1.00x di 1,3× (a 1.00x la sopravvivenza crolla e
l'effetto composto la punisce). L'argomento del 25/07 — *"la sopravvivenza compone su più anni"*
resta valido; è il punto in cui morde che si sposta.
### 5.2 La scala di conti: il ranking regge, i livelli no
| lente | leva | MISTO EUR/g med | P(≥10/g) | P(≥50/g) | P(zero) |
|---|---|---|---|---|---|
| close-only | 1.00x | 11.11 | 50.8% | **22.0%** | 33.9% |
| **accoppiata** | **0.75x** | 0.00 | **29.7%** | 5.6% | **52.2%** |
| **accoppiata** | **1.00x** | 0.00 | 20.8% | **6.5%** | 65.5% |
| indipendente | 1.00x | 0.00 | 5.2% | 1.0% | 81.5% |
- **L'ordinamento fra politiche SOPRAVVIVE a tutte e tre le lenti**: MISTO ≥ CONC-DIV >
CONC-2SL ≈ SPARSO. L'affermazione di stamattina — *«il confronto fra POLITICHE è robusto:
è la stessa lente applicata a tutte»* — è confermata su una lente che allora non esisteva.
**CONC-2SL (= il book live attuale su ogni conto) resta la peggiore o penultima ovunque.**
- **I livelli si spostano parecchio.** La stima onesta di P(≥50/g) in 3 anni è **~5,6-6,5%**, non
1,6-2,5% e non 20,7%. La scala è **~3-4× più probabile** di quanto diceva il pavimento e
**~3,4× meno** di quanto diceva il tetto.
- **P(≥10/g) è massima a 0.75x (29,7%)**, non alla leva piena: l'ottimo di leva della scala
coincide con quello del conto singolo.
- Il prezzo resta alto: **P(bruciare i €600) = 52% a 0.75x, 65% a 1.00x.**
### 5.3 Il verdetto sul goal, ristretto
Il 25/07 concludeva: *«una via da €600 a €50/g ESISTE con P ~2-21% in 3 anni e P(bruciare i €600)
~33-78% → scommessa a coda destra, NON una rendita»*. Con la lente onesta la banda si stringe:
> **P(≥50 €/g entro 3 anni) ≈ 6%, con P(perdere i €600) ≈ 52-65%.**
> Resta una scommessa a coda destra. Ma è una scommessa con una probabilità **conoscibile**,
> non un intervallo di un ordine di grandezza.
---
## 6. Cosa NON cambia
- **Book, pesi, cron: invariati.** Niente qui tocca il portafoglio.
- Il fronte prop **non è aperto**: questo lavoro dice *cosa costerebbe e con quale probabilità*,
non che vada fatto.
- Resta il caveat di finestra del 25/07: il **2024+** è la finestra in cui XS01 è stato scoperto e
affinato → la **taglia** del vantaggio di config B è ottimista; il **meccanismo** (correlazione
bassa → meno DD → più sopravvivenza sotto vincolo di DD) è robusto. La verifica (2) qui sopra
quantifica per la prima volta quanto pesa la finestra da sola (63.2% → 39.4% su config A).
- XS01 resta **STAT-MODE sul capitale proprio** (serve ~$20k). Su un conto funded da $100k è
eseguibile: è esattamente l'asimmetria capitale-proprio vs funded del §4 di stamattina.
---
## 7. Lezione da portare avanti
> **Un modello di rischio intraday non si valida sulla distribuzione marginale del wick, ma sul suo
> ACCOPPIAMENTO al rendimento del giorno.** Qui la marginale era calibrata quasi perfettamente
> (p50 0.17pp identico) e ciò nonostante il modello sbagliava di 2-3× sui breach, perché metteva
> i tuffi sui giorni sbagliati. Un test "i percentili del mio wick sintetico coincidono con quelli
> del recon" sarebbe **passato**, e la stima sarebbe rimasta sbagliata.
Corollario controintuitivo, da ricordare perché è il contrario dell'intuizione: **l'escursione
intraday è più profonda nei giorni che chiudono bene**. I giorni che chiudono male chiudono *sul*
minimo. Ogni regola valutata sul minimo (daily-loss, trailing DD, stop di conto) va misurata su
tuple accoppiate, mai su un wick estratto a parte.
Terzo: **close-only non è una lente conservativa, è una lente cieca** per le regole intraday —
0.00% di breach da daily-loss su ogni configurazione testata. Va usata come controllo, mai come
stima.