research(vrp): profit-take al 50% REFUTED, e una correzione a un numero di stamattina

Book, pesi, cron, config INVARIATI.

VRP01 tiene fino a scadenza (S1 = px[i+tn], nessuna gestione infra-settimana)
e il profit-take era l'unico grado di liberta' non misurato: i 4 overlay del
03/07 erano tutti sul lato del RISCHIO, questo e' sul lato del PROFITTO.
Replica del sleeve bit-exact (max|diff| = 0.0) prima di ogni delta.

VERDETTO con fee reali per gamba: canonico ShFULL 1.32 -> PT25 0.22 /
PT50 -0.18 / PT75 -0.45. Null del de-levering REFUTED 6/6: a PT25 basta
k=0.818 per lo stesso DD con Sharpe 1.32 invece di 0.22.

MECCANISMO (confronto appaiato per ingresso): scatta sull'86-91% dei VINCENTI
e sul 19-25% dei perdenti -> tronca i vincenti del 27% e salva un perdente su
cinque. La peggior settimana e' IDENTICA (-7.27%) in ogni variante: nelle
settimane brutte lo spread non tocca mai +50%, quindi e' pura troncatura
dell'upside.

IPOTESI MIA REFUTATA IN SESSIONE: 'su 7g chi tocca +50% e' chi sarebbe scaduto
senza valore, quindi a scadenze lunghe paga'. Testata su 7/10/14/18/21/28g:
delta Sharpe negativo a tutti e sei. A 18g (il tenore di cerbero-bite) il DD
migliora 7.1->3.8% ma lo Sharpe crolla = firma del de-levering.

CORREZIONE a un numero pubblicato oggi: il sleeve modella le fee come 12.5%
del credito netto, il listino vero e' 0.03% del sottostante per gamba (cap
12.5% del premio della singola opzione, che quasi mai morde) -> sovrastima di
~2x. Il numero onesto di VRP01 con f=0.73 e' ShFULL 0.47, non 0.31.
fee_frac NON cambiato: il forfait e' conservativo e i numeri di ammissione di
questo progetto si tengono conservativi.

A $3.000 la domanda non e' il rendimento: BTC min 0.1 = $6.210 di collaterale
per lotto -> FUORI; ETH min 1 contratto = $1.832 -> 1 lotto. Il sleeve 50/50
diventa ETH-only e al peso di book (12% = $360) sono 0 lotti.

REGOLE: (a) un'uscita si giudica appaiata per INGRESSO, mai allineando le serie
sulla data di USCITA — e' quella che la variante cambia, e l'inner-join tiene
solo i casi in cui non e' successo niente (errore commesso e corretto in
sessione, congelato in un test); (b) una regola d'uscita che scatta piu' spesso
sui vincenti che sui perdenti non e' protezione, e' troncatura; (c) prima del
rendimento a un capitale dato, misurare il lotto minimo del venue.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Adriano Dal Pastro
2026-07-30 21:57:15 +00:00
parent a2f28153d8
commit 04cb572535
4 changed files with 815 additions and 0 deletions
+157
View File
@@ -0,0 +1,157 @@
# 2026-07-30 (3º filone) — profit-take al 50% su VRP01: REFUTED, e una correzione a un numero di stamattina
**Domanda dell'operatore:** *«fai la misura del profit-take al 50%, simula con 3K».*
**Esito: book, pesi, cron, config INVARIATI.** Il profit-take **non entra**. Ma il filone ha
prodotto una correzione favorevole a un numero pubblicato **oggi stesso**, e una mia ipotesi
refutata nella stessa sessione.
Script `scripts/research/r0730_vrp_profit_take.py`, test `tests/test_vrp_profit_take.py` (16 casi).
## Perché questa misura e non un'altra
VRP01 come codificato **tiene fino a scadenza**: in `_vrp_weekly_asset` il payoff è su
`S1 = px[i + tn]`, non esiste gestione infra-settimana. L'onda 03/07 aveva testato 4 overlay di
protezione DD (exit-spike, **stop-loss MTM 1.5/2/3×**, ala di coda, cooldown) e li aveva refutati
4/4 col null del de-levering — ma il profit-take **non era fra quelli**: è un'uscita sul lato del
*profitto*, non del rischio. Era l'ultimo grado di libertà non misurato su questo sleeve, e la
misura del 30/07 sulle quote reali diceva che sarebbe scattato in **13 settimane su 15**.
L'idea è la regola 1 del motore di cerbero-bite (`debit <= 50% del credito`), progetto dismesso lo
stesso giorno. **Non se ne eredita il giudizio: bite non ne ha uno** (59 decisioni, tutte
`no_entry`, 0 posizioni, in testnet). Si misura.
## Fondazione: replica bit-exact
Prima di ogni delta, la re-implementazione riproduce `_vrp_weekly_asset` a **max|diff| = 0.00e+00
su entrambi gli asset, zero date non condivise**. Senza questa, ogni numero sotto sarebbe rumore di
implementazione. Congelata in un test: se qualcuno tocca il sleeve, si rompe.
## Il verdetto
Fee **reali per gamba** (`min(0.03% del sottostante, 12.5% del premio)` = listino Deribit letto da
`public/get_instruments`), identiche a canonico e variante.
| variante | ShFULL | ShHOLD | maxDD | CAGR | peggior sett. | usciti prima | giorni |
|---|---|---|---|---|---|---|---|
| **canonico (a scadenza)** | **1.32** | **0.82** | 10.5% | 10.5% | 7.27% | — | 7.0 |
| PT 25% | 0.22 | 0.44 | 8.6% | 0.9% | 7.27% | 87% | 2.7 |
| **PT 50%** | **0.18** | **0.65** | 17.3% | 1.3% | 7.27% | 79% | 3.6 |
| PT 75% | 0.45 | 1.24 | 19.5% | 3.0% | 7.27% | 71% | 4.6 |
**Null del de-levering: REFUTED 6/6** (3 livelli × vol-matched e DD-matched). ⚠️ Nota onesta: sotto
scalatura moltiplicativa lo Sharpe è **invariante**, quindi il null si riduce a «la variante ha
Sharpe più alto?». Il `k` dice solo *quanto* de-levering ottiene lo stesso DD: per PT25 basta
**k=0.818** per avere lo stesso 8.6% di DD **con Sharpe 1.32 invece di 0.22**.
## Il meccanismo — e perché serviva il confronto appaiato
⚠️ **Errore di metodo commesso e corretto in sessione.** Le due varianti sono indicizzate sulla
**data di uscita**, che il profit-take cambia: un `join="inner"` fra le serie tiene solo le
settimane *senza* uscita anticipata, dove i valori coincidono per costruzione. La prima
diagnostica stampava «troncamento 0%, variazione +0%» su tutto — potenza zero, e una conclusione
esattamente opposta al vero. È la trappola dell'inner-join già codificata due volte nel progetto
(venue watch, GTAA), qui in veste nuova. Congelata in `test_confrontare_per_data_di_uscita_da_una_risposta_falsa`.
Rifatto **appaiato per ingresso** (stesso trade, due esiti):
| | BTC (71 trade) | ETH (92 trade) |
|---|---|---|
| scatta sui **vincenti** | **86%** | **91%** |
| scatta sui **perdenti** | 25% | 19% |
| vincenti | +1.419% → +1.023% (**28%**) | +1.638% → +1.218% (**26%**) |
| perdenti | 3.649% → 2.941% (19%) | 4.248% → 3.505% (17%) |
| somma PnL | +60.2% → **+40.9%** | +56.6% → **+36.5%** |
**Il profit-take tronca del 27% i trade che avrebbero vinto comunque e salva un perdente su
cinque.** La peggior settimana è **identica** (7.27%) in tutte le varianti: nelle settimane brutte
lo spread non raggiunge mai +50%, quindi si arriva a scadenza e si prende la perdita piena. È pura
troncatura dell'upside.
## ❌ Ipotesi mia, nata e refutata nella stessa sessione
Il meccanismo suggeriva una spiegazione: *su 7 giorni chi tocca +50% è proprio chi sarebbe scaduto
senza valore; a scadenze lunghe — 18g, quella di bite, e i 30-45 DTE dello standard di mestiere —
la regola dovrebbe pagare.* Testata su 6 tenori:
| tenore | Sh hold | Sh PT50 | ΔSh |
|---|---|---|---|
| 7g | 1.32 | 0.18 | 1.50 |
| 10g | 1.51 | 0.12 | 1.40 |
| 14g | 1.14 | 0.56 | 1.71 |
| **18g** (bite) | **1.51** | **0.37** | **1.14** |
| 21g | 1.09 | 0.27 | 1.36 |
| 28g | 1.31 | 0.06 | 1.25 |
**Negativo a tutti e sei.** A 18g è il meno peggio e il DD migliora davvero (7.1% → 3.8%), ma lo
Sharpe crolla: **firma del de-levering**, non di una protezione. Ipotesi refutata.
⚠️ **La colonna `Sh hold` NON è un risultato.** Sei celle scelte sul campione pieno: il tenore 18
sembra migliore del 7 (1.51 vs 1.32) ma è esattamente la selezione che `study_family_honest` +
deflated-Sharpe esistono per uccidere. La griglia 03/07 si fermava a 10 giorni, quindi il buco è
reale — ma va chiuso con lo strumento giusto, non con questo sweep.
## ✅ Correzione a un numero pubblicato stamattina
Il sleeve modella le fee come **12.5% del credito netto** round-trip. Il listino vero è **0.03% del
sottostante per gamba** (cap 12.5% *del premio della singola opzione*, che quasi mai morde): su ETH
sono $1.14 d'ingresso contro i $2.26 del forfait, cioè il modello **sovrastima le fee di ~2×**.
| lente | ShFULL | ShHOLD | maxDD | CAGR |
|---|---|---|---|---|
| sleeve ufficiale (forfait) | 1.08 | 0.58 | 11.8% | 8.2% |
| **fee reali per gamba** | **1.32** | **0.82** | 10.5% | 10.5% |
Combinato col **f = 0.73** misurato stamattina sulle quote reali, il numero onesto di VRP01 è
**ShFULL 0.47 / DD 14.5%**, non lo **0.31** che ho scritto oggi in CLAUDE.md — che era calcolato
con le fee forfettarie. Il f resta il difetto dominante; la fee lo attenua di ~+0.16.
**Nessuna azione:** `fee_frac` **non è stato cambiato**. Il forfait è conservativo, e questo
progetto preferisce i numeri di ammissione conservativi (stessa logica per cui l'audit d'ancora
del 03/07 su VRP01 è stato accolto come «numeri conservativi, non gonfiati»). Cambiarlo alzerebbe
i numeri di uno sleeve senza aggiungere edge.
## Rientro immediato dopo l'uscita
Testato come strategia a sé (non è un overlay: cambia la cadenza). PT50 + rientro fa **Sh 1.19**
contro 1.32 del canonico, CAGR 4.9% contro 10.5%, 200 trade contro 163. Il suo **ShHOLD 2.42** è
vistoso — ed è precisamente la firma che questo progetto ha imparato a non credere: non è
selezionabile in-sample (Sharpe FULL più basso), quindi crederci sarebbe selezione sull'hold-out.
**Non è un lead.**
## $3.000 — la domanda che viene prima
Parametri veri da `public/get_instruments` (30/07): **ETH `min_trade_amount` = 1 contratto = 1 ETH;
BTC = 0.1 BTC**. Collaterale = strike corto (convenzione cash-secured del sleeve).
| | spot | lotto min | collaterale/lotto | a $3.000 | fee round-trip |
|---|---|---|---|---|---|
| BTC | $63.917 | 0.1 | **$6.210** | **0 lotti — FUORI** | $7.67 = 17.8% del credito |
| ETH | $1.906 | 1.0 | $1.832 | 1 lotto | $2.29 = 12.6% del credito |
Tre conseguenze:
1. **A $3.000 il sleeve 50/50 diventa ETH-only** — cioè non è più il sleeve misurato.
2. **Al peso di book (12%) l'allocazione è $360 = 0 lotti.** Per un solo lotto ETH servirebbe il
**61% del conto** su un singolo sleeve.
3. Quindi a $3.000 la domanda «il profit-take migliora VRP01?» **non è la domanda che decide**:
VRP01 non è collocabile a quel capitale in nessuna forma sensata.
## Cosa resta
- **Profit-take: REFUTED**, a ogni livello, a ogni f, a ogni tenore, contro il null del de-levering.
Con questo il conto degli overlay refutati su VRP01 sale a **5 su 5**, e il filone «gestire VRP01
dentro il modello» è chiuso su tutti i lati misurabili.
- **Buco reale rimasto:** il tenore oltre i 10 giorni non è mai passato per `study_family_honest`.
Non è urgente (le opzioni non sono eseguibili prima di ~$2.6k, e a $3k solo ETH e a peso assurdo).
- **Il vincolo binding non è la ricerca.** Vale la nota del 26/07: qui si è misurato un ΔSharpe che
non cambia niente, mentre le leve che decidono restano il capitale che entra e il conto che non
sparisce.
## Regole
- **Un'uscita si giudica su un confronto APPAIATO PER INGRESSO**, mai allineando due serie sulla
data di uscita: la variante che stai testando è esattamente quella che cambia quella data, e il
join tiene solo i casi in cui non è successo niente.
- **Una regola d'uscita che scatta più spesso sui vincenti che sui perdenti non è protezione, è
troncatura** — e si vede in una riga: la peggior settimana non cambia.
- **Prima di misurare il rendimento a un capitale dato, misurare il lotto minimo del venue.** Qui
la risposta operativa («non è collocabile») non dipendeva da nessuno Sharpe.