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>
8.8 KiB
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:
- A $3.000 il sleeve 50/50 diventa ETH-only — cioè non è più il sleeve misurato.
- Al peso di book (12%) l'allocazione è $360 = 0 lotti. Per un solo lotto ETH servirebbe il 61% del conto su un singolo sleeve.
- 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.