ee5c6ed539
Giornata partita da "stato trades" e finita sul disegno del sistema. Versamento di 1.400 USDC atterrato alle 11:03:35Z (equity $667,88 -> $2.066,88); il giro delle 11:47 ha ribilanciato correttamente e ha ripiazzato i disaster-SL alla taglia nuova -- prima volta che il ramo riparato stamattina gira sul serio. (1) PIANO A 10 ANNI DAL CONTO VERO -- r0825_piano_10a_500.py (nuovo) Le tabelle pubblicate partono da $600/$635: rifatte su $2.067, lente L3 CONGIUNTA. Replica superata: chiede EUR 1.718/m dove la tabella da $635 chiedeva EUR 1.733. EUR 500/mese per 10 anni -> mediana $114.934, rendita 18,35 EUR/g, P(>=50 EUR/g) = 0,0% su 3.000 traiettorie. Il bersaglio con EUR 500/m arriva al 17o anno. L'EQUIVALENZA CHE ORDINA IL PIANO: EUR 100/mese in piu' == +4,07%/anno di drift, cioe' +27% su TUTTO il drift del libro. A 10 anni i bonifici fanno il 59%. Tutta la leva autorizzabile vale quanto EUR 100-150/mese: k=1,25 (+15,6%) vale MENO di EUR 100/mese in piu' (+19,1%), e si porta dietro il peggior giorno al 21,48%. E il libro a k=1 rende MENO dell'S&P (15,19% vs 17,40%): il vantaggio sta nello Sharpe (1,35 vs 0,89) e senza leva NON si converte in rendimento. Senza leva il libro non si giustifica come veicolo di ACCUMULO -- si giustifica come veicolo di RENDITA, dove serve 2,5x meno capitale ($254k contro $646k) perche' la perpetua vive sul DD. (2) "ETF QUANDO IL LIBRO E' FLAT" -- SCARTATO, r0825_capitale_fermo.py (nuovo) Il libro e' flat il 28,0% dei giorni (2,7% nel 2021, 77,0% nel 2022, 75,6% nel 2026); live, esposto 14 giorni su 64, leva lorda mediana 0,00x e max 0,52x su un tetto di 1,0x -- il cap non ha mai morso, il vincolo e' il segnale. A ISO-RISCHIO il dinamico PERDE: Sharpe 1,01 contro 1,40 del 50/50 e 1,35 del libro. E il null a maschera casuale (400 estrazioni, stessa quota, blocchi 20g) lo mette al 30o percentile: fa PEGGIO di commutare a caso. A iso-nozionale sembrava vincere (drift 17,09%, il piu' alto) perche' aveva la vol piu' alta: e' la trappola di M6, il de-levering e' il PRIMO test. E IL MECCANISMO CHE SEMBRAVA OVVIO NON ESISTE. Aggregato: SPY 4,91% nei giorni flat contro 21,48% negli altri (-16,57%), e la storia si scrive da sola. FALSA: scomposta per anno il segno ALTERNA (3 su, 4 giu') e il 2022 -- l'anno che doveva reggerla -- ha il segno OPPOSTO. Artefatto di composizione: i giorni flat stanno negli ANNI brutti per l'azionario, non nei GIORNI brutti. M9 ha fatto il suo lavoro su di me. (3) SLIPPAGE RIFATTO ALLA TAGLIA VERA -- r0822_slip_audit.py riparato 26 fill (erano 18), $6-$319. I due piu' grandi mai eseguiti sono di oggi e hanno preso 1,01% e 0,54% della loro barra 5m, con il print a meta' del range (q=0,50). Il caso peggiore resta un fill da $74 del 18/07 al 21,9%: un sabato, nastro inesistente. L'attrito non e' funzione della TAGLIA ma di taglia/volume-della-barra -- l'estrapolazione lineare che prevedeva ~71% a questo capitale e' refutata dalla misura diretta. NB non e' "assente", e' "non ancora testato": manca un fill grande in una barra sottile, e il weekend e' dove TP01 fa il 38% del proprio gross. DIFETTO P1 RIPARATO: l'equity era CABLATA a 636.0 con un commento che diceva di leggerla dal watermark. Il giorno del versamento avrebbe stampato $636 sbagliando di 3,3x proprio la sezione che esiste per dire QUANDO la misura scade. Riparata leggendo il watermark -- e poi riparata di nuovo, perche' i fill del campione sono stati eseguiti a conti diversi ($597-$2.067) e una base sola e' sbagliata comunque la si scelga. Ora la normalizzazione e' PER FILL, e a $600 riproduce il 22,0% originale. DUE ERRORI MIEI, CATTURATI PRIMA DI PUBBLICARLI - maschera VUOTA vestita da risultato: la prima stesura di r0825_capitale_fermo prendeva i giorni flat dalla serie DE-LUCKATA, ma `deluck` sottrae una costante e lo zero esatto sparisce -> maschera vuota, dinamico identico al book, e lo script ha stampato tabelle piene e un p-value. Lo ha rivelato solo la riga "0 = 0.0%". REGOLA: stampare la CARDINALITA' di una maschera prima di usarla. - il meccanismo falso della (2), demolito dalla scomposizione per anno. Suite: 730 passati, 1 fallito -- quello gia' noto di 5.9 (deriva dati, non codice). Watermark del libro live sopravvissuto intatto alla suite (fixture autouse di stamattina). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B9UyJLHzR7EJzxR3iQ3RN1
475 lines
41 KiB
Markdown
475 lines
41 KiB
Markdown
# PythagorasGoal — Istruzioni per agenti
|
||
|
||
**Come si usa questo file.** Qui sta solo cio' che serve per **non sbagliare una decisione**:
|
||
stato, book, numeri citabili, decisioni vincolanti, gate con la loro data, debiti aperti, regole.
|
||
Il racconto completo — 69 filoni di ricerca, le misure, i controesempi, gli errori corretti — sta
|
||
in `docs/memory/`, estratto **verbatim** da questo file il 2026-08-25 (nulla riscritto, nulla perso).
|
||
|
||
⚠️ **Prima di riaprire un tema, apri il file di memoria che lo copre.** Quasi tutto e' gia' stato
|
||
misurato, e **il motivo per cui una cosa e' morta vale piu' dell'esperimento che l'ha uccisa**:
|
||
chi la riapre deve battere il motivo, non ripetere la misura.
|
||
|
||
| file | contiene | aprilo quando |
|
||
|---|---|---|
|
||
| `docs/memory/10-sleeve-e-candidati.md` | TP01 · XS01 · VRP01 · SKH01 · GTAA01 · XSR01, portafoglio | tocchi uno sleeve o i pesi |
|
||
| `docs/memory/20-ondate-e-scartati.md` | 69 filoni, ogni scartato col suo perche' | hai un'idea "nuova" |
|
||
| `docs/memory/30-piano-capitale-fisco.md` | muri, versamenti, rischio venue, fisco, prop firm | parli di soldi, rendita, orizzonti |
|
||
| `docs/memory/40-produzione-e-deploy.md` | esecutore, tripwire, monitor, libro di bordo, PRIIPs/UCITS | tocchi cio' che gira con soldi veri |
|
||
| `docs/memory/50-dati-e-feed.md` | difetti del dato trovati e riparati, catena opzioni | tocchi i feed |
|
||
| `docs/memory/60-metodo-e-gate.md` | i gate codificati in `altlib.py` | valuti un candidato |
|
||
| `docs/research/RESULTS-0822.md` | registro per filone §1-69 | vuoi il dettaglio di un filone |
|
||
| `docs/diary/` (123 voci) | la sessione originale, per data | vuoi il contesto completo |
|
||
|
||
---
|
||
|
||
## 0. Stato — v2.0.0 RESET (2026-06-19)
|
||
|
||
**LEGGERE PRIMA DI TUTTO.** Il progetto fu resettato dopo aver scoperto che l'intera libreria di
|
||
strategie "validata OOS" era **artefatto di uno storico contaminato** (print fantasma del feed
|
||
Cerbero **testnet** + storico **Binance/USDT**). Ri-testate sul feed reale, tutte perdono ogni anno.
|
||
Documento di fondazione: `docs/diary/2026-06-19-deribit-history.md`.
|
||
|
||
- Lo storico e' **ricostruito da Deribit mainnet e certificato**. Universo affidabile = **solo
|
||
BTC/ETH** (tutti i TF); gli alt sono esclusi (illiquidi/divergenti/non certificabili).
|
||
- Tutto il codice pre-reset e' archiviato in `Old/` (preservato in git, non cancellato).
|
||
- **L'esecuzione e' ARMATA e LIVE** su Deribit mainnet dal 2026-06-20. Capitale reale **~$635**
|
||
(NON i €2.000 nominali del paper trader).
|
||
- Si riparte dalla ricerca di strategie NUOVE, su dati certi, con la metodologia della §8.
|
||
|
||
📌 **La riga che chiude sei ondate e 69 filoni:** *la ricerca ha smesso di essere il vincolo binding
|
||
il 2026-07-26, e sei ondate lo hanno **confermato** invece che ribaltarlo.* I vincoli binding sono
|
||
**il capitale che entra** e **il conto che non sparisce**. Il miglior lead misurato vale
|
||
**+0,046 €/giorno**; versare €500/mese invece di €250 porta P(traguardo a 20 anni) dal 14% all'85%.
|
||
|
||
---
|
||
|
||
## 1. Il book
|
||
|
||
**LIVE (soldi veri).** Deribit mainnet, **TP01 + SKH01 a 75/25**, nettati in software su **una sola
|
||
posizione per asset** (`src/live/book.py`: `W_TP01=0.75`, `W_SKH=0.25`, `WEIGHT=0.5` → 50/50 BTC/ETH).
|
||
Esecutore `scripts/live/book_execute.py`, cron **orario** `scripts/cron_book.sh` (minuto **:47**
|
||
dal 2026-08-25; era `:07`). Due vincoli, entrambi misurati: fuori dai ~26s del minuto tondo
|
||
(rate-limit per-IP) **e** fuori dallo slot di release Deribit (**martedi' 09:00 UTC**, 15-30 min
|
||
annunciati), che il `:07` beccava — 4 volte in 63 giorni. **GTAA01, XS01, VRP01, XSR01 NON sono
|
||
nel book live.**
|
||
|
||
**RICERCA (paper).** Portafoglio a 5 sleeve `src/portfolio/sleeves.active_sleeves`:
|
||
TP01 33 / XS01 15 / VRP01 12 / SKH01 20 / GTAA01 20. **Non e' il book live** — quasi tutti i numeri
|
||
di portafoglio del progetto sono su questa serie, non su quella che gira.
|
||
|
||
**Guardrail live** (`config/live.json`, unica autorita' — **non ridichiararli nel codice**):
|
||
cap per-asset **`equity × 0.5`, SENZA tetto assoluto**, quando l'equity reale e' leggibile;
|
||
`min($3.000, watermark × 0.5)` **solo nel fallback** a equity illeggibile (watermark
|
||
`data/live/equity_seen.json`). ⚠️ Fino al 2026-08-25 questa riga dichiarava `min($3.000, …)`
|
||
come se valesse sempre: **falso** — `max_notional_per_asset_usd` non morde mai sul percorso
|
||
normale (verificato in `src/live/book._cap`). Conseguenza: **il book scala all'infinito a leva
|
||
lorda massima 1,0x**, e nessun livello di capitale cambia il profilo di rischio relativo. ·
|
||
`min_order_usd` 5 · `disaster_sl_pct` 0.30 on-book sulla posizione **netta** · staleness-gate feed
|
||
2 giorni (blocca) · `skh_feed_max_age_min` 30 (allerta, **non** blocca) · alert Telegram.
|
||
|
||
⚠️ **Il nome "disaster-SL −30%" inganna:** e' **rotolante e simmetrico**, non un massimo di perdita
|
||
per trade. Su cicli a ingresso proprio lascia passare perdite oltre −30% senza scattare, e il
|
||
peggior DD dall'ingresso misurato e' **−60,6% BTC / −61,5% ETH**. Dettaglio in `40-produzione`.
|
||
|
||
**Candidati in forward-monitor** (nessuno nel book): XSR01 · DVOLSPREAD · STATARB · PREVDAY.
|
||
|
||
---
|
||
|
||
## 2. I numeri da citare — e quelli da NON citare
|
||
|
||
Ogni numero di questo progetto va scritto **con la sua lente e la sua banda**. Le stime canoniche
|
||
sono all'ancora fortunata; le stime oneste sono la **mediana della banda d'ancora**.
|
||
|
||
| grandezza | ❌ non citare | ✅ citare |
|
||
|---|---|---|
|
||
| Sharpe FULL book 5-sleeve | 2,222 (canonico, 97° pctl) | **1,95** [1,81 – 2,12] |
|
||
| Sharpe HOLD-OUT book | 2,364 (canonico, **99,6°** pctl) | **1,54** [1,11 – 1,91] |
|
||
| maxDD FULL book | 6,07% | **6,85%** [5,99 – 7,94] |
|
||
| TP01 hold-out | 0,31 | **~+0,05** — il valore di TP01 e' il **taglio del DD ~6× vs buy&hold**, non il ritorno |
|
||
| XS01 standalone | 1,50 / 1,71 / DD 11% | ensemble di fase **1,25 / 1,31 / 10,9%**; maxDD fuori campione **21%** |
|
||
| SKH01 | i numeri di ammissione | de-luckato e' **il meno affidabile dei cinque** (l'ancora regala 2/3 del FULL) |
|
||
| VRP01 | f = 1,00 | **f = 0,73** misurato sulle quote reali (IC95 [0,698; 0,780]) |
|
||
| muro capitale-rendita | $272k (lordo) | **$313k** al netto di fisco **e** funding — banda **[$187k – $1,14M]** |
|
||
| P(≥50 €/g), canale funded, 36 mesi | 42% | **2,6%** [1,5 – 4,7], P(zero) 40,3% |
|
||
| soffitto direzionale BTC/ETH | ~1,3 | **~1,15** col funding dentro |
|
||
|
||
📌 **Il libro a k=1 rende MENO dell'S&P 500** (15,19% contro 17,40%, stessa finestra): il vantaggio
|
||
sta nello **Sharpe** (1,35 vs 0,89), e **senza leva non si converte in rendimento**. A iso-rischio
|
||
farebbe +9,0 punti sopra l'indice; a k=1,40 (max difendibile) +3,9 con meno vol. ⇒ **senza leva il
|
||
libro non si giustifica come veicolo di ACCUMULO, si giustifica come veicolo di RENDITA** — dove
|
||
serve **2,5× meno capitale** ($254k contro $646k) perche' la perpetua vive sul drawdown (misura
|
||
2026-08-25, `r0825_piano_10a_500.py`). E **tutta la leva autorizzabile vale quanto €100-150/mese**:
|
||
k=1,25 (+15,6% a 10 anni) vale **meno** di €100/mese in piu' (+19,1%).
|
||
|
||
📌 **L'equivalenza che ordina il piano:** **€100/mese in piu' == +4,07%/anno di drift** (+27% su
|
||
tutto il drift del libro). A 10 anni i bonifici fanno il **59%** del risultato.
|
||
|
||
📌 **Il libro e' FLAT il 28,0% dei giorni** sull'intera storia (2,7% nel 2021, 77,0% nel 2022,
|
||
75,6% nel 2026); live, esposto **14 giorni su 64**, leva lorda mediana **0,00x** e **max 0,52x** su
|
||
un tetto di 1,0x. **Il cap non ha mai morso: il vincolo e' il segnale.** Riempire quel vuoto con
|
||
l'ETF e' stato **misurato e SCARTATO** il 25/08 (`20-ondate`).
|
||
|
||
🚨 **Tre baseline diverse girano sotto lo stesso nome "libro 75/25"**, e lo spread fra loro (0,12 di
|
||
Sharpe, 1,7pp di maxDD) e' **piu' grande di quasi tutti gli effetti che il progetto misura**:
|
||
`hourly` **1,683 / 11,22%** (la lente di **ogni muro e ogni traiettoria**) · `canonical` 1,800 / 9,56%
|
||
· mediana d'ancora 1,626 / 10,4%. **Un Δ accostato al baseline sbagliato cambia piu' del Δ stesso.**
|
||
|
||
🚨 **«Positivo in N/N ancore» NON e' N osservazioni.** Correlazione media fra le 24 ancore di TP01
|
||
0,631 → **N_eff 1,55**; fra le 10 fasi di XS01 0,790 → **N_eff 1,23**. E non si salva sulla differenza
|
||
appaiata (N_eff 1,64-2,24). La **banda d'ancora e' ~4× piu' stretta dell'IC95 bootstrap, che CONTIENE
|
||
LO ZERO**. Si cita come *robustezza alla scelta dell'ancora* (~2 osservazioni), **mai** come N prove,
|
||
**mai** come intervallo di confidenza, e **mai** con un p-value attaccato a un conteggio di ancore.
|
||
*Cade la precisione dei numeri, non la direzione delle decisioni.*
|
||
|
||
🚨 **Il funding dei perpetual non e' modellato in NESSUN backtest** (verificato: zero occorrenze in
|
||
`harness.py`, `trend_portfolio.py`, `sleeves.py`, `portfolio.py`, `src/live/`). Costo misurato:
|
||
**−2,16%/anno di drift** (2019-2026), −1,39% sulla finestra dello strumento vero, −0,55% sul 2025+.
|
||
Esposizione e funding sono **positivamente correlati** → il prodotto ingenuo *esposizione media ×
|
||
tasso medio* **sottostima di ~2×**. E' una tassa sul **drift**, quindi colpisce i **muri** molto piu'
|
||
dello Sharpe.
|
||
|
||
---
|
||
|
||
## 3. Decisioni vincolanti dell'operatore
|
||
|
||
Prese **con l'informazione completa**, non sviste da correggere. Se qualcuno le ripropone "come da
|
||
CLAUDE.md", la risposta e' la colonna *cosa la riapre*.
|
||
|
||
| decisione | data | non si ri-discute | cosa la riapre |
|
||
|---|---|---|---|
|
||
| **100% Deribit fino a $20k** — accettato P(perso tutto) 10/18/34/64% a p=0,5/1/2/5% invece di 0/0/4/27% | 26/07 | la soglia $3k | **$20k**, o un cambio di piano, o `p` che diventa stimabile invece che assunto |
|
||
| **SOL escluso** — universo direzionale resta BTC/ETH (presidiato da un test) | 22/08 | SOL su un book a 2 gambe con questi dati | ~3 anni di storia SOL certificata (**non prima del 2028**), o un meccanismo che non sia TP01/SKH01 congelati |
|
||
| **Niente short-vol da modello in deploy** — e niente long-vol scalp da modello | 19/06 | — | un `f` di stress reale misurato su un crash catturato |
|
||
| **Non de-esporre il weekend** (porta il 38% del gross di TP01 nel 31% del tempo) | 17/07 | — | ogni proposta "risk-off weekend" parte **REFUTED** salvo null de-levering superato |
|
||
| **Peso 75/25 confermato 3 volte** (24/07, 26/07, 24/07-follow-up) | 26/07 | — | `weights_tilt_null` superato, che finora **fallisce** |
|
||
| **Fee Deribit: ≤5 bps/lato → non si tocca nulla; >10 bps → rivedere il peso SKH01** (regola decisa *prima* di vedere il numero) | 26/07 | — | il sorvegliante `fee_watch` allerta da solo |
|
||
| **Gradino di leva NON autorizzato oggi.** 1,25x autorizzabile *a condizione*; **1,50x BOCCIATO** (peggior giorno strutturale 21,48% > 20%); **k max difendibile 1,40** | 23/08 | il 1,50x | costruire prima una **chiave di scala esplicita** in config **e** rifare `r0726_fee_sensitivity` |
|
||
|
||
⚠️ **La regola *"ogni cambio di scala passa dal cap di config, non da `target_vol`"* NON E'
|
||
IMPLEMENTABILE COME SCRITTA:** verificato che in `config/live.json` **non esiste una chiave di scala**
|
||
— servirebbe toccare `WEIGHT`/`W_TP01`/`W_SKH` in `src/live/book.py`, cioe' codice su un percorso con
|
||
soldi veri. Specifica pronta in `docs/research/SPEC-scale-key.md` (`GATE SCALA-01`, 9 condizioni, con
|
||
il **tetto sul PRODOTTO** `n_asset · frac · scala · disaster_sl_pct ≤ 0,50` — non sulla singola chiave).
|
||
|
||
---
|
||
|
||
## 4. Gate pre-registrati — con la loro data
|
||
|
||
Un gate si decide **alla data**, coi criteri scritti **prima**. Anticiparlo e' selezione
|
||
sull'hold-out; cambiarne le soglie guardando l'esito, pure.
|
||
|
||
| gate | data | criterio | stato |
|
||
|---|---|---|---|
|
||
| **STATARB** | 2026-09-27 | soglie 24/07 (non toccate) + diagnostica statica sempre-short | 🚨 **si ribalta col difetto `advance()`**: riparata → RITIRO, attuale → candidato |
|
||
| **XSR01** | 2026-10-23 | Sharpe ≥1,0 **E** haircut a $5.000 ≤40% (se sfonda → ritiro a prescindere), poi `weights_tilt_null` e capitale ≥$5k | 🚨 legge un monitor **mal tarato** (vedi §5.3) |
|
||
| **DVOLSPREAD** | kill 2026-10-24 se Sh<−0,50; decisione 2027-01-24 | (a) Sharpe>0 (b) marginale ADDS+robust_oos+insample_edge (c) **DSR ≥0,95** (d) `weights_tilt_null`; **veto** se barre attive <80% → si estende, non si decide | il veto **non scatta** su una serie che registra 2 min/giorno (§5.1) |
|
||
| **GATE PROP-01** | chiuso 22-23/08 | (a) listino 13/13 ✅ (b) ancora SKH01 23/23 ✅ (c) economica+sopravvivenza 2/2 ✅ | **chiuso 3/3** — ma il numero operativo e' sceso 42% → 7,8% → 4,4% → 2,6% |
|
||
| **GATE PREVDAY-01** | scritto 23/08 | 10 condizioni | **8/10**: la cella che GIRA non e' quella che la selezione onesta sceglie, e quella viva **fallisce il DSR** (0,905) |
|
||
| **`edge_watch`** (kill del book live) | continuo | **(A)** Sharpe rolling 36m < −0,5 → si riapre `weights_tilt_null`+DSR, il book **non si spegne da solo**; **(B)** in un anno con DD buy&hold >10%, il DD di TP01 deve restare <75% di quello | stato 27/07: Sharpe 36m +1,51, protezione **8/8** |
|
||
|
||
📌 **Un gate superato non e' un numero confermato:** differenze e livelli ereditano la fortuna
|
||
d'ancora in modo diverso (nella differenza si cancella in parte, nel livello per niente).
|
||
|
||
---
|
||
|
||
## 5. Debiti aperti — difetti noti NON riparati
|
||
|
||
1. 🚨 **`advance()` registra una frazione del giorno → 4 monitor su 6 sono rotti.**
|
||
`fetch_hyperliquid`/`resample_tf` scrivono la barra del giorno **in corso**, `advance()` la consuma
|
||
e ci porta sopra `last_ts` → `paper_statarb` **4 min/giorno**, `paper_dvolspread` 2, `paper_xsr` 41.
|
||
✅ **La finestra non va persa** (misurato due volte: 0 barre chiuse cambiate su 1.761.259) → l'azione
|
||
e' *"riparare **e rigenerare**"*, e **nessuna data di gate si sposta**. Guardia raccomandata e non
|
||
cablata: `ts_ultima_barra + cadenza ≤ mtime`, grazia 5 min.
|
||
2. 🚨 **Il trasporto degli allarmi e' un punto singolo di guasto** — 6,9% di invii falliti (2/29).
|
||
Fatte il 23/08: retry opzionale in `send()` e registrazione del motivo nel punto in cui veniva
|
||
ingoiato. **Resta:** `alerted=True` marcato **prima** dell'invio → un 🚨 perso e' perso per
|
||
l'episodio intero (gli episodi storici durano 200-2.324 ore). Cambiarlo **cambia il comportamento**
|
||
→ decisione dell'operatore.
|
||
3. 🚨 **Il gate XSR01 del 23/10 legge un monitor tarato sul pavimento del venue sbagliato**
|
||
(C* vero $15.000-20.000, non ~$3.000). Due sole vie pulite: riscrivere la soglia **adesso**
|
||
dichiarando che la si riscrive prima di vedere l'esito, **oppure** lasciarla e **citare il difetto
|
||
alla decisione**. Decisione dell'operatore.
|
||
4. ❓ **Due domande al commercialista, aperte** (valgono ~$22k di muro e ~€30/mese di versamento):
|
||
(a) i derivati Deribit (inverse, margine e regolamento in cripto, sede extra-UE) stanno in
|
||
`c-sexies` (33%) o `c-quater` (26%)? E il collaterale sconta il 2‰ al 31/12? (b) i payout di una
|
||
prop firm: **ne' `c-sexies` ne' `c-quater`** — le fonti convergono su **lavoro autonomo**, nessuna
|
||
prassi ufficiale. *Non sono pareri fiscali: sono domande da porre.*
|
||
5. ⚠️ **`test_leva_massima_da_config_resta_sotto_o_uguale_a_1x` va cancellato con nota, non
|
||
aggiustato:** misura `frac · n_asset` mentre con una chiave di scala la grandezza vera diventerebbe
|
||
`frac · n_asset · scala` → **continua a passare e smette di controllare**.
|
||
6. ⚠️ **TLT ha 13,5 anni di storia in meno** (parte 2016-02 invece del 2002) → **GTAA01 gira su
|
||
CINQUE gambe prima del 2016**, e l'assente e' quella obbligazionaria. Non e' un fetch da rifare (IB
|
||
ritorna 0 barre). ⇒ in-sample e hold-out di GTAA01 **non sono la stessa strategia**.
|
||
7. ⚠️ **Il docstring di `book_execute.py` prescrive "ogni ~230 minuti", il cron gira OGNI ORA.**
|
||
**Il docstring e' sbagliato e la configurazione che gira e' quella giusta** — chi lo "correggesse"
|
||
sposterebbe il libro sulla riga 4h, dove BTC **raddoppia** gli scatti del disaster-SL.
|
||
8. ⚠️ **Il Rulebook Deribit** (ADL, perdita socializzata, *emergency powers*, conti dormienti) **non
|
||
lo sorveglia nessuno**; `MAINT_GRACE_HOURS`=2 **presume** gli annunci invece di leggerli.
|
||
✅ *Ridotto in parte il 2026-08-25:* `src/live/venue_probe.py` interroga l'API **pubblica**
|
||
Deribit e distingue **manutenzione / venue giu' / NOSTRO gateway / non vedo**, e lo slot di
|
||
release (**martedi' 09:00 UTC**) e' ora una costante dichiarata e testata. Resta scoperto il
|
||
Rulebook vero e proprio: la sonda legge se il venue *risponde*, non cosa il venue *annuncia*.
|
||
9. ⚠️ **`tests/test_wave_0726.py::test_t1_canonical_riproduce_il_backtest_ufficiale` FALLISCE**
|
||
(dal ~24-25/08): Sharpe hold-out SKH01 `canonical` **1,9223** contro la banda cablata
|
||
`1.3 < h < 1.9`. **Il codice non e' cambiato, sono cambiati i DATI** — `data/raw/` e' gitignored
|
||
e il cron lo ricostruisce ogni notte, quindi la finestra si allunga e il numero deriva (verso
|
||
l'**alto**). **La banda non e' stata allargata**: si guarda sotto prima di toccarla (lezione
|
||
07/08). Suite: **730 passati, 1 fallito** (25/08).
|
||
10. ⚠️ **Nessuna tabella pubblicata prima del 22/08 contiene fisco E funding insieme.** L'unica
|
||
congiunta e' quella in `30-piano-capitale-fisco.md` — le altre vanno lette con lo sconto.
|
||
11. 🚨 **Le credenziali Deribit esistono SOLO dentro il gateway** (`cerbero-mcp`): in locale c'e'
|
||
solo `CERBERO_TOKEN`. Quindi il gateway e' un **punto singolo di guasto non aggirabile** —
|
||
**4 dei 5 traceback in 63 giorni** sono suoi (404 su `get_positions`, 502, due `ReadTimeout`),
|
||
ed e' l'unico pezzo della catena che possediamo. Un fallback diretto ai **privati** Deribit
|
||
(conto/posizioni/ordini) richiede **chiavi API create dall'operatore** sul conto Deribit:
|
||
e' una decisione, non un refactor. Fatto intanto il pezzo che non le richiede: la sonda
|
||
**pubblica**, che almeno dice *di chi e' il guasto*.
|
||
12. ⚠️ **Un test scriveva nel watermark VIVO** (`data/live/equity_seen.json`): lanciare la suite
|
||
ci metteva **$5.000** e il giro successivo del book mandava un allarme falso *"USCITA DI FONDI
|
||
−86,6%"*. Non era cosmetico: `cap_fallback = min(cap_config, watermark × frac)` sarebbe passato
|
||
da **$334 a $2.500/asset — ~7,5x di leva** su un conto da $668, per giunta sul ramo `eq_fallback`
|
||
che **allerta e NON blocca**. ✅ Riparato il 2026-08-25 con una fixture **autouse** in
|
||
`tests/conftest.py` (strutturale: non si chiede a ogni autore di ricordarsene — quella scommessa
|
||
ha gia' perso il 26/07 e il 21/08) + guardia in `test_cap_watermark.py`. **Resta il principio:
|
||
un test non deve poter scrivere in `data/live/`; oggi e' deviato solo il watermark, non
|
||
`trades.db` ne' `book_executions.jsonl`.**
|
||
|
||
|
||
---
|
||
|
||
## 6. Le regole di prim'ordine
|
||
|
||
Estratte dai 69 filoni. Ognuna e' stata pagata almeno una volta. Testo completo e caso d'origine
|
||
nei file di memoria.
|
||
|
||
### Sul dato
|
||
- **D1** La verita' e' **Deribit mainnet**; Binance/Coinbase solo come audit indipendente, mai come ancora per "ripulire".
|
||
- **D2** **Una riga presente non e' un dato presente**, e **una barra presente non e' una giornata presente**: contare cio' che e' *quotato/chiuso*, non cio' che e' *scritto*.
|
||
- **D3** Una certificazione che guarda solo **dentro** la serie non vede cio' che la serie **ha perso** (split 2:1, contaminazione EUR/USD, troncatura: tutte passano integrita', gap, spike, duplicati).
|
||
- **D4** Ogni soglia di certificazione **tarata su un valore tondo** va controllata contro il difetto che genera *esattamente* quel valore (una soglia al 50% non puo' sorvegliare gli split 2:1).
|
||
- **D5** Quando un buco non si puo' chiudere senza generare falsi positivi, si misura il **danno** del caso non rilevato: un buco quantificato e innocuo e' un risultato, uno taciuto e' un debito.
|
||
- **D6** Due serie dello stesso progetto possono avere **convenzioni di etichettatura diverse**: verificare col **lag**, non fidarsi dell'indice. `DatetimeIndex.view/astype("int64")` su risoluzioni miste produce look-ahead **senza eccezioni e senza NaN**.
|
||
- **D7** Un guasto **in corso** si misura al **giorno peggiore**, non in media. E prima di cancellare una sorgente si verifica che la copia sia **completa**, non che esista.
|
||
|
||
### Sul metodo
|
||
- **M1** Una strategia direzionale si giudica su `earns_slot` (**Sharpe marginale vs TP01**), mai sullo Sharpe assoluto: gli overlay-su-TSMOM ereditano lo Sharpe del trend.
|
||
- **M2** Una famiglia grid-searched si giudica con `study_family_honest` (cella scelta **in-sample-only** + deflated-Sharpe ≥0,95), mai chiamando lo scorer sulla cella a max hold-out.
|
||
- **M3** 🚨 **Non basta contare i trial: serve la VARIANZA di screen** — e **la stessa griglia da' verdetti opposti a seconda di come la si partiziona**. La partizione e' un secondo posto dove barare e' indolore e invisibile: dichiararla **prima**, contare **al rialzo**, e pubblicare la **sensibilita' del verdetto al conteggio**.
|
||
- **M4** Quando si riapre un parametro **si riapre la sua famiglia**.
|
||
- **M5** **Null del de-levering (7 occorrenze):** ogni claim "meno drawdown" si testa a **iso-rischio** prima di crederci — e' il primo test, non l'ultimo. Se la variante e' una pura ri-scalatura il null e' **degenere** (`sh(k·base) ≡ sh(base)`): serve iso-peso sullo Sharpe.
|
||
- **M6** Un diversificatore a **basso CAGR** si giudica a **iso-rischio**, mai a iso-nozionale.
|
||
- **M7** Su offset/ancore appaiate la statistica e' la **mediana delle differenze**, non la differenza delle mediane. E **se si de-lucka una strategia va de-luckato anche il suo DEGRADO**.
|
||
- **M8** Un **argmax dentro un plateau non e' una decisione**; e la mediana da sola puo' nascondere il fatto decisivo (p90 su, p10 giu' = si compra dipendenza dall'ancora, non Sharpe).
|
||
- **M9** Un contributo positivo si **scompone per anno** prima di crederci: "24/24 ancore positive" puo' essere **un anno solo**.
|
||
- **M10** **Due punti non fanno una tendenza** nemmeno quando la meccanica sembra spiegarla.
|
||
- **M11** Un **blocco dichiarato e' un'ipotesi, non un fatto**: si ri-verifica prima di costruirci sopra o di rimandare (3 occorrenze, ogni volta il blocco non esisteva).
|
||
- **M12** Un **follow-up dichiarato contiene una previsione**, che va **misurata** non assunta.
|
||
- **M13** Un criterio si misura sulla sua **risoluzione** prima che sul suo esito, e un gate si valida **contando quante volte lo passa un candidato a caso**.
|
||
- **M14** Un **null di permutazione** va confrontato **a fee zero** (permutare un segnale ne fa esplodere il turnover: il null perderebbe per costo invece che per assenza di informazione) e controllato per **bilanciamento del segno**.
|
||
- **M15** Un rilevatore tarato per **non** segnalare va validato su un **controllo positivo** — e un controllo positivo finito dentro un ramo `else` non gira mai.
|
||
- **M16** Un self-check su **eventi rari** si campiona sugli **eventi**, non sulla popolazione (altrimenti confronta zeri con zeri: potenza zero).
|
||
- **M17** Il **win rate di uno schema parziale+BE non e' merito** (≈ 1/(1+rr1)): convertire ogni claim "WR X%" in **expectancy R netto fee**.
|
||
- **M18** Vs claim su livelli "speciali" (Fibonacci, max-pain, expiry) il test e' il **null location-matched**; vs claim di calendario, il **day-boundary robustness**.
|
||
- **M19** Mettere nella griglia una variabile che si **sa gia' morta** trasforma *"il candidato perde"* in *"il dato non contiene nient'altro di selezionabile"* — l'unica forma in cui un inventario conclude qualcosa su un'assenza.
|
||
- **M20** Un meccanismo si trasferisce a un asset nuovo **coi parametri congelati**, o e' una famiglia nuova; e **il criterio di SELEZIONE va riprovato sull'asset nuovo**.
|
||
- **M21** Quando un meccanismo **non generalizza**, chiedersi **perche'** vale piu' del fatto che non generalizzi.
|
||
- **M22** Un confronto appaiato eredita **tutti** i parametri della riga in cui compare; un'uscita si giudica appaiata per **INGRESSO** (allineare sull'uscita tiene solo i casi in cui non e' successo niente — 3 occorrenze).
|
||
- **M23** Un **Monte Carlo ha una risoluzione e va detta**; e prima di pubblicare un numero nuovo, **far riprodurre alla macchina quello vecchio**.
|
||
- **M24** Un **non-arrivo** si codifica **+∞, mai −1**; una **mediana condizionata** si stampa sempre accanto alla sua probabilita'; un **percentile a 0 decimali mente esattamente agli estremi**.
|
||
- **M25** Quando **due stimatori di coda non concordano si cita la banda**, non quello che conviene.
|
||
- **M26** **Non contare su una compensazione fra correzioni misurate separatamente** — la si misura, e in piu' di una **moneta** (un'interazione piccola cambia segno con la moneta).
|
||
- **M27** Prima di dichiarare che un campo di un dataset e' sbagliato, **aprire il codice che lo produce**. E una **fonte normativa citata in un commento si verifica come un numero**.
|
||
- **M28** Quando **due affermazioni della stessa memoria si contraddicono, la contraddizione e' informazione**: una delle due e' stata scritta guardando i dati.
|
||
|
||
### Sui costi e l'eseguibilita'
|
||
- **C1** Il costo di un venue va modellato nella sua **FORMA** (fisso vs proporzionale), non solo nel livello: un pavimento fisso e' una **tassa regressiva** e due venue a pari "costo medio" danno esiti **opposti** al variare del capitale.
|
||
- **C2** Un parametro d'esecuzione espresso in **valuta assoluta** ha effetto che dipende dal capitale: il controllo non e' lo Sharpe ma la **quota di tempo a mercato**.
|
||
- **C3** Prima di misurare il rendimento a un capitale dato, misurare il **lotto minimo del venue** — e sapere **quale famiglia di strumenti** si sta guardando (inverse vs USDC-lineare: lotti 7,5× diversi).
|
||
- **C4** Un **fattore di errore si giudica moltiplicato per il suo peso** (5,85 al 3% fa meno danno di 2,23 al 18%). Il `f` di una struttura multi-gamba **non e' il `f` di una sua gamba**.
|
||
- **C5** **L'open interest NON misura la negoziabilita'** (su Deribit USDC sono quasi anti-correlati). Prima di credere a un rapporto estremo su un prezzo piccolo, **contare i tick**.
|
||
- **C6** La negoziabilita' **sul conto reale** va verificata quando lo sleeve entra in **RICERCA**, non quando entra nel book (PRIIPs costo': 5 settimane di misure). *"Non posso comprare" ≠ "non posso vedere"*: il segnale puo' girare su una serie che non si puo' negoziare.
|
||
- **C7** Si cerca per **ISIN, non per ticker**; si prende la linea nella **valuta del proprio saldo**; un costo di conversione e' proprieta' della **coppia strumento-conto**, non dello strumento.
|
||
- **C8** La deviazione fra due veicoli sullo stesso indice si misura sul **rapporto cumulato**, mai sulla media delle differenze. Il **carry** si misura sul **log del rapporto dei prezzi**, mai sulla media aritmetica delle differenze.
|
||
- **C9** **Una regola d'uscita che scatta piu' spesso sui vincenti che sui perdenti non e' protezione, e' troncatura** — si vede in una riga: la peggior settimana non cambia.
|
||
- **C10** Una capacita' mancante (es. API di un broker) si valuta sul **costo di non averla**, non sulla sua assenza.
|
||
|
||
### Sulla produzione e le sorveglianze
|
||
- **P1** 🚨 **Un sorvegliante deve DERIVARE il proprio bersaglio dal codice sorvegliato, mai ridichiararlo.** *Un controllo puntato su una configurazione diversa da quella che gira passa sempre, e non sta controllando niente.* **5 occorrenze**: e' il difetto piu' ricorrente del progetto.
|
||
- **P2** Un rilevatore si valida **sul segnale E sul trasporto**.
|
||
- **P3** Se un errore si ingoia per non bloccare, **si registra nel punto in cui lo si ingoia** — non c'e' un secondo momento buono: quando la diagnosi serve, il guasto e' rientrato.
|
||
- **P4** Un'allerta risponde a **due** domande: *cosa* (decide) e *perche'* (ripara). **Una nota di diagnosi cablata e' peggio di nessuna nota.**
|
||
- **P5** Distinguere guasti diversi **anche quando l'azione e' la stessa**; e prevedere lo stato **"non vedo"** (`BLIND`, `flat-senza-dato`, `NUOVO`): *"non vedo" non e' "va tutto bene"*, e il silenzio in una serie di ritorni si legge come **zero**.
|
||
- **P6** Una soglia si sceglie con un criterio **dichiarato prima** (i criteri ovvi sbagliano in versi opposti); la **persistenza richiesta E' latenza** e va confrontata con la durata del fenomeno; un **break-even si calcola sulla media**, non sulla coda.
|
||
- **P7** Un numero di taratura si etichetta con la **CONFIGURAZIONE**, non solo con la finestra; e uno **"zero" si legge accanto alla quota di campione utilizzabile** (meno falsi allarmi *perche' si vede meglio* e *perche' si vede di meno* hanno lo stesso valore stampato e valore opposto).
|
||
- **P8** Un **veto d'integrita' sorveglia l'asse su cui e' stato scritto**: contare *se* il dato c'era non dice *quanto* del giorno copriva.
|
||
- **P9** Un **allarme massimo speso per un evento atteso** e' un allarme che non verra' letto il giorno che e' vero.
|
||
- **P10** Un modello di rischio **intraday** non si valida sulla marginale del wick ma sul suo **accoppiamento** al rendimento del giorno: `close-only` non e' conservativa, e' **cieca** (0,00 breach da daily-loss su ogni configurazione).
|
||
- **P11** Un **dato operativo non ricostruibile non puo' vivere in un file gitignored** — si materializza dove il backup arriva.
|
||
- **P12** Fra due fonti che non concordano, una **riparazione silenziosa e' un'invenzione**: si riporta la divergenza.
|
||
- **P13** Una **guardia sui NUMERI non copre il RAGIONAMENTO**: l'analisi in prosa si legge come opinione di un lettore fallibile, mai come parte del registro. Chi scrive in un registro va **firmato**.
|
||
- **P14** Una **guardia piu' stretta del contratto** produce allarmi che si impara a ignorare; una regola che si accende su $2 di cumulato insegna a saltare la sezione.
|
||
- **P15** Una **regola operativa va provata contro il codice che dovrebbe eseguirla**, o si discute per mesi di un knob che non esiste.
|
||
- **P16** Il cron gira dal **working tree**: con un branch di ricerca attivo, il cron esegue quel branch.
|
||
|
||
### Sul piano e sulle decisioni
|
||
- **N1** **Il piano si dimensiona sul VERSAMENTO, che e' certo, non sul muro** — il muro e' `prelievo/perpetua`, cioe' un `1/x` su una quantita' che va a zero: l'errore e' **asimmetrico verso l'alto** e la banda e' esplosiva.
|
||
- **N2** Un piano di accumulo si giudica sulle sue **deviazioni**, non sul caso nominale (piatto/ininterrotto/per sempre e' l'unico scenario che non succede). Piani di taglia diversa si confrontano su **`$ finale / $ versato`**.
|
||
- **N3** Ordine delle leve, da citare quando si parla del piano: **versare o no** (da *mai* a ~16 anni) > **quando** (6×) > **quanto presto si smette** (i primi 5 anni sono il 25% dei soldi e il 58% del risultato) > piatto vs crescente (24%) > frequenza (1-3%). *A orizzonte corto non fai lavorare la strategia: **compri il capitale coi bonifici**.*
|
||
- **N4** Un rischio **non-diversificabile dagli sleeve** (venue) si prezza a parte, e si compra con un **secondo CONTO**, non con un secondo sleeve. **P(successo) puo' nascondere P(rovina)**: per una rendita la metrica e' la seconda, perche' **zero e' assorbente**.
|
||
- **N5** Quando una metrica **binaria satura**, la decisione si sposta sulla metrica **continua**.
|
||
- **N6** Un **obiettivo si dichiara nella sua definizione operativa PRIMA di ottimizzarlo**: *flusso* e *ricchezza sostenibile* sono entrambe difendibili e differiscono di **cento volte** (33,9% contro 0,33%).
|
||
- **N7** Uno **sleeve difensivo si giudica sul sinistro, non sul premio**: hold-out negativo non e' evidenza di morte.
|
||
- **N8** Una rivalutazione parte dall'elenco di **cosa cambia una decisione**, non dal riassunto di cosa si e' scoperto; quando due correzioni puntano in versi opposti **si misura**; quando le leve hanno **ordini di grandezza diversi, dirlo**.
|
||
- **N9** Quando una raccomandazione viene respinta con motivo, si registra **cosa e' stato accettato in cambio** — altrimenti la stessa analisi la ripropone fra tre mesi come se fosse nuova.
|
||
- **N10** Una **data in un gate va giustificata col COSTO della misura**, non con la sua difficolta' percepita (due gate d'attesa da mesi eliminati in una sera perche' nessuno aveva contato i secondi). Una **verifica esterna a €0 va fatta PRIMA** di qualunque misura che ne dipenda, e si fa **sul venue, non sul sito** di chi la dichiara.
|
||
- **N11** Un numero pubblicato in un diario deve avere **uno script committato che lo riproduce**, e ogni script deve calcolare il proprio **verdetto a runtime** (e' cio' che ha salvato un'ondata interrotta).
|
||
|
||
---
|
||
|
||
## 7. IL DATO — fonte di verita' (regola di prim'ordine)
|
||
|
||
- **La verita' e' Deribit mainnet**, perche' e' dove eseguiamo. Cross-check multi-venue: Deribit
|
||
mainnet e' a 0-1 bps dal consenso. **Binance NON e' la verita'** (e' USDT, ~10 bps fuori, fino al 3%
|
||
sotto depeg) → audit indipendente, mai ancora per "ripulire" i dati.
|
||
- **Aggiornare lo storico SOLO con `rebuild_history.py`** (ccxt Deribit mainnet, base 5m unica +
|
||
resample). **MAI** il vecchio downloader Cerbero (token testnet = feed farlocco: e' la causa del reset).
|
||
- **Certificare sempre** dopo un rebuild con `certify_feed.py` (integrita' OHLC, zero gap, coerenza
|
||
resample maxΔ≈0, spike = solo crash reali, accordo cross-venue per-anno vs Coinbase USD).
|
||
|
||
**Universo ricercabile certificato**
|
||
- **BTC / ETH** — puliti (2-6 bps vs Coinbase USD), liquidi (~0% barre flat a 1h), storia 2018/2019→oggi,
|
||
**ogni timeframe** (5m/15m/1h). E' l'unico dato in `data/raw/` col namespace nudo.
|
||
- **Alt Deribit: FUORI** (illiquidi/divergenti). SOL vive in `data/raw/alt_sol_*.parquet`, **fuori dal
|
||
namespace nudo e non rinfrescato dal cron** — vedi §3 e la lezione: *ricostruire dati per un'analisi
|
||
puo' disattivare un guardrail che vive nell'assenza di un file*.
|
||
- **Hyperliquid (Cerbero MCP MAINNET): 51 certificati, 19 major usati da XS01**, 1d dal 2024. Storia
|
||
nativa ~2,5 anni. ⚠️ Cerbero col token **testnet** e' farlocco; col mainnet e' reale ma **sempre da
|
||
certificare**, e il rivelatore del backfill sintetico e' il **VOLUME**, non il flat ne' il cross-venue.
|
||
- **Catena opzioni Deribit mainnet — raccolta propria** dal 2026-07-30 (`scripts/live/collect_chain.py`,
|
||
cron **:25**). Dettaglio, archivio ereditato, difetti e buchi di colonna in `docs/memory/50-dati-e-feed.md`.
|
||
**Perche' si memorizza invece di interrogarla:** una catena opzioni **non e' ricostruibile a
|
||
posteriori** — un'ora non raccolta e' persa per sempre.
|
||
|
||
**Backup.** `data/raw/` e' gitignored → il dato non ricostruibile (catena, `data/paper_*`,
|
||
`data/chain_collect`, `data/live`, `venue_watch`, `fee_watch`, `config/live.json`) e' salvato da
|
||
`do_pythagoras` in `/opt/docker/scripts/backup.sh` (daily 04:00). ⚠️ `/opt/docker/scripts` **non e' un
|
||
repo git**: quella modifica vive solo su disco.
|
||
|
||
---
|
||
|
||
## 8. Metodologia obbligatoria per ogni nuova strategia
|
||
|
||
1. **Ingresso eseguibile**: direzione e prezzo decisi con dati **fino a `close[i]`**, mai `close[i-1]`
|
||
con direzione presa da `i`; mai entry sull'estremo (high/low) di una candela.
|
||
2. **Backtest NETTO** dopo fee realistiche Deribit (**0.10% RT** taker, conservativo: il tier reale e'
|
||
3,50 bps/lato dal 2026-08-01) + leva. ⚠️ **Il funding NON e' nel motore** — vale −2,16%/anno di drift.
|
||
3. **Out-of-sample** held-out + robustezza su **griglia parametri** (entrambi gli asset, tutte le celle
|
||
positive) + **sweep fee** (0.00-0.20% RT).
|
||
4. **Liquidita' & plausibilita'**: incrociare ogni edge con la liquidita' reale del book (quota di barre
|
||
flat) e con la plausibilita' del prezzo (cross-venue). Un edge full+OOS robusto su un book fermo o su
|
||
wick fantasma **non e' un edge**.
|
||
5. **I gate di `altlib.py`** (dettaglio in `docs/memory/60-metodo-e-gate.md`): `study_marginal` /
|
||
`marginal_vs_tp01` (ADDS·NEUTRAL·REDUNDANT·HEDGE·NOISE, con persistenza multi-cut, edge in-sample,
|
||
hedge-vs-alpha) · `study_family_honest` (+ `deflated_sharpe` ≥0,95, `select_cell_insample`) ·
|
||
`day_boundary_robust` · `eval_weights_smallcap` · `implausible_sharpe` · `anchor_luck_band` /
|
||
`anchor_luck_delta` · `weights_tilt_null` (**ogni** proposta di cambio pesi).
|
||
6. Strategia in `scripts/strategies/` (codice univoco), test in `tests/`, diario aggiornato.
|
||
|
||
---
|
||
|
||
## 9. Lezioni critiche storiche (da NON ripetere)
|
||
|
||
- **Feed contaminato → libreria fasulla (v2.0.0).** Print fantasma testnet + Binance/USDT hanno prodotto
|
||
edge inesistenti (+201%/+1238%/+16492% "OOS"), tutti spariti sul feed reale. **Il dato viene prima
|
||
della strategia.**
|
||
- **Look-ahead squeeze.** Accuratezze 76-82% erano artefatto: direzione dalla candela `i`, ingresso a
|
||
`close[i-1]`. Con ingresso onesto: lancio di moneta.
|
||
- **Entry sugli estremi di candela.** ETH 2024: +30.848% → +2.725% rimuovendoli.
|
||
- **Data leakage con rendimenti log:** `returns[k] = log(close[k+1]/close[k])` usa `close[k+1]`; i
|
||
feature devono fermarsi a `returns[i-2]` se il prezzo corrente e' `close[i-1]`.
|
||
- **Fee** = vincolo di prim'ordine; **leva**: 5x raddoppia il drawdown, i numeri a leva alta non sono il
|
||
caso base.
|
||
- **Onesta' sul target €50/giorno.** Non e' raggiungibile a questo capitale: serve ~$313k (banda
|
||
[$187k – $1,14M]) o **€1.733/mese per 10 anni** a P=90%. La leva non e' la scorciatoia; la via e'
|
||
target-vol + capitale + tempo.
|
||
|
||
---
|
||
|
||
## 10. Obiettivo
|
||
|
||
Ricerca: riconoscimento pattern frattali per trading algoritmico su crypto. Target dichiarato
|
||
€50/giorno partendo da €1.000. **Onesta' prima di tutto**: nessun numero va creduto finche' non e'
|
||
netto fee, out-of-sample, robusto su griglia, e su dati certificati + liquidi + eseguibili.
|
||
|
||
## 11. Stack
|
||
|
||
- **Linguaggio:** Python 3.11+ — **Package manager:** uv (`pyproject.toml`, `uv.lock`)
|
||
- **Dati:** Parquet in `data/raw/` (gitignored). Solo BTC/ETH (5m/15m/1h) nel namespace nudo.
|
||
- **Analisi/ML:** numpy, pandas, scipy, scikit-learn
|
||
- **Fonte dati storici:** Deribit mainnet via `ccxt` (pubblico, tokenless)
|
||
|
||
## 12. Struttura
|
||
|
||
```
|
||
src/data/downloader.py → load_data(asset, tf): legge i parquet certificati
|
||
src/strategies/ → base.py (Strategy/Signal/BacktestResult), indicators.py,
|
||
trend_portfolio.py (TP01), skyhook.py (SKH01)
|
||
src/portfolio/ → portfolio.py (combina N sleeve + weights_tilt_null),
|
||
sleeves.py (REGISTRY: aggiungere uno sleeve = una riga), gtaa.py
|
||
src/backtest/harness.py → harness ONESTO (load BTC/ETH, backtest_signals no-leakage, OOS)
|
||
src/live/ → book.py (esecutore netto TP01+SKH01), shadow.py, deribit.py,
|
||
livefeed.py, venue_watch.py, monitor_health.py, notifier.py,
|
||
tradesdb.py · journal.py · analista.py (libro di bordo)
|
||
src/data/eq_splits.py, eq_crosscheck.py → guardie sul feed equity
|
||
scripts/research/ → ricerca (r<data>_*.py). Harness condiviso: alt/altlib.py
|
||
scripts/analysis/ → SOLO tool sui dati certificati: rebuild_history, certify_feed,
|
||
audit_feed, multi_source_check, fetch_* , certify_cb_chain
|
||
scripts/live/ → book_execute · venue_watch · fee_watch · edge_watch ·
|
||
monitor_health · collect_chain · paper_* · trades_db ·
|
||
journal · analista
|
||
scripts/cron_{book,daily,chain,opt_snapshot,vol_term}.sh
|
||
docs/memory/ → LA MEMORIA (indice in testa a questo file)
|
||
docs/research/ → BRIEF-0822 · RESULTS-0822 (§1-69) · SPEC-scale-key
|
||
docs/diary/YYYY-MM-DD.md → una voce per esperimento (123)
|
||
docs/journal/YYYY-MM-DD.md → libro di bordo, una voce al giorno, 4 livelli per provenienza
|
||
data/live/trades.db → i trade allineati col tempo (dentro il perimetro di backup)
|
||
Old/ → ARCHIVIO pre-reset
|
||
VERSION → semver
|
||
```
|
||
|
||
## 13. Comandi
|
||
|
||
```bash
|
||
uv sync # dipendenze
|
||
uv run python scripts/analysis/rebuild_history.py --asset BTC ETH # storico da Deribit mainnet
|
||
uv run python scripts/analysis/certify_feed.py [--local] # certifica i feed
|
||
uv run python scripts/portfolio/run_portfolio.py # report del portafoglio (ricerca)
|
||
uv run python scripts/live/paper_portfolio.py # avanza il paper (forward-only)
|
||
uv run python scripts/live/trades_db.py --report # stato libro di bordo + P&L
|
||
uv run python scripts/live/trades_db.py --reconcile # incrocio delle 3 fonti sui fill
|
||
uv run python scripts/live/journal.py # voce del giorno (numeri + lettura)
|
||
uv run python scripts/live/analista.py --secco # analisi del giorno, senza salvare
|
||
uv run pytest # test (731: 730 ok, 1 noto §5.9)
|
||
```
|
||
|
||
```python
|
||
from src.data.downloader import load_data
|
||
df = load_data("BTC", "1h") # load_data("SOL", ...) -> FileNotFoundError (guardrail: solo dati certi)
|
||
```
|
||
|
||
## 14. Convenzioni
|
||
|
||
- Strategie in `scripts/strategies/` con codice univoco; **le scartate si documentano** (memoria + diario).
|
||
- Diario in `docs/diary/YYYY-MM-DD.md` dopo ogni esperimento significativo; registro per filone in
|
||
`docs/research/RESULTS-0822.md`.
|
||
- **Quando un risultato cambia una decisione, aggiorna questo file; quando aggiunge racconto, va in
|
||
`docs/memory/`.** Questo file non deve tornare a crescere senza limite.
|
||
- **Nessun segreto nei commit** (token/chiavi). `.env` e `.env.mainnet` sono gitignored.
|
||
- Versionamento: `VERSION` (semver) + `scripts/bump_version.py`; `src/version.py` lo legge.
|
||
|
||
## 15. Archivio `Old/`
|
||
|
||
Tutto il lavoro pre-reset (preservato in git): strategie, stack live e portafogli, ricerca/gate, dati
|
||
non certificati, 60+ diari, test. Consultabile come riferimento ("come facevamo X"), ma **nessun edge
|
||
li' dentro e' fidato** finche' non e' ri-validato su dati certi.
|