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

158 lines
8.8 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-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.