Files
PythagorasGoal/docs/diary/2026-07-30-vrp-profit-take.md
T
Adriano Dal Pastro 04cb572535 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>
2026-07-30 21:57:15 +00:00

8.8 KiB
Raw Blame History

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.