monitor: advance() consuma solo barre CHIUSE — serie rigenerate, guardia PREMATURO, 4 debiti chiusi
S5.1 RIPARATO E RIGENERATO. Filtro condiviso src/live/paper_guard.py (barra open-labeled chiusa = ts + cadenza <= adesso) importato da tutti e 6 i monitor; serie rigenerate dallo stesso start_ts con scripts/live/paper_regen.py (evidenza in *.pre_regen_20260826.*): statarb +1,95 -> -1,61 (il ribaltamento del gate 27/09 previsto dall'audit), dvolspread -14,73 -> -4,41, xsr -4,98 -> -2,72, prevday invariato. Nessuna data di gate si sposta. Guardia cablata in monitor_health: stato PREMATURO (ultima barra che chiude dopo l'mtime, grazia 5 min, open_labeled=False per collect_chain) — sul dato vivo segnala i 5 rotti e tace sui 2 sani; dopo la rigenerazione 7/7 OK. paper_portfolio non rigenerato (GTAA su ADJUSTED_LAST: replay != serie registrata, P12), tolta la coda non chiusa. D6 pagata di nuovo nel fix: asi8 in pandas 3 e' in us, non ns — blindata con test su tre risoluzioni. S5.12 ESTESO: conftest devia anche trades.db (wrapper su connect: il default e' catturato alla definizione) e docs/journal/; book_executions.jsonl sorvegliato con impronta inizio/fine suite. S5.5 FATTO: test_leva_massima cancellato con nota (misurava frac*n_asset: con una chiave di scala avrebbe continuato a passare smettendo di controllare). S5.9 INDAGATO E RIPARATO (r0826_skh_band_drift): il dato regge (taglio 02/07 riproduce l'audit 1,6376, in-sample identico su ogni taglio); la deriva era la finestra hold-out — e la sola settimana 15-22/08 vale +0,35 di Sharpe hold-out. Il test ora taglia il feed al 02/07 e verifica la riproduzione stretta. Suite: 751 passati, 0 falliti. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01B9UyJLHzR7EJzxR3iQ3RN1
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
# 2026-08-26 — `advance()` riparato e rigenerato, quattro debiti chiusi in un giorno
|
||||
|
||||
Quattro debiti di CLAUDE.md §5 chiusi: **§5.1** (advance + rigenerazione + guardia),
|
||||
**§5.12** (isolamento test esteso), **§5.5** (test di leva cancellato con nota),
|
||||
**§5.9** (test rosso indagato e ancorato). Suite: **751 passati, 0 falliti** — tutta verde
|
||||
per la prima volta dal ~24/08.
|
||||
|
||||
## §5.1 — advance() consuma solo barre CHIUSE, e le serie sono RIGENERATE
|
||||
|
||||
**Il fix** (`src/live/paper_guard.py` + 6 monitor): la riga
|
||||
`new = [i for i in range(len(ts)) if ts[i] > last_ts]` diventa `PG.nuove_chiuse(ts, last_ts,
|
||||
cadenza)` — una barra open-labeled e' chiusa quando `ts + cadenza <= adesso`. Filtro condiviso,
|
||||
importato da tutti e sei i monitor (anche `paper_combo`, che era sano *per caso*: ora e' sano
|
||||
*per costruzione*).
|
||||
|
||||
⚠️ **D6 pagata DI NUOVO scrivendo il fix:** la prima stesura di `indice_chiuso` usava `asi8`
|
||||
assumendo nanosecondi — pandas 3 usa `us` di default, e l'intero nella scala sbagliata dava
|
||||
"chiusa" la barra del giorno in corso **senza eccezioni**. Beccata dal test di fumo, riparata
|
||||
con la sottrazione dall'epoca (la forma di `resample_tf`), e blindata da un test che prova
|
||||
`ns/us/s`. *La regola che stavo cablando e' quella che stavo violando.*
|
||||
|
||||
**La guardia** (era "raccomandata e non cablata"): `monitor_health` ha ora lo stato
|
||||
**PREMATURO** — ultima barra che chiude DOPO l'mtime del file, grazia 5 min. Derivata dalle
|
||||
spec esistenti (P1), con `open_labeled=False` per `collect_chain` che timbra i giri, non barre
|
||||
(P14: senza il flag avrebbe allertato sempre). Controllo positivo sul dato vivo: **ha segnalato
|
||||
esattamente i 5 rotti e taciuto sui 2 sani** prima della rigenerazione; dopo, 7/7 OK.
|
||||
|
||||
**La rigenerazione** (`scripts/live/paper_regen.py`): stesso `start_ts` pre-registrato, config
|
||||
congelata, replay del codice di produzione riparato — il metodo validato due volte dall'audit
|
||||
del 22/08 (0 barre chiuse cambiate su 1.427/1.488 + 6/6 al bit). Vecchi file archiviati come
|
||||
`*.pre_regen_20260826.*` (evidenza del difetto, nel perimetro di backup). **Nessuna data di
|
||||
gate si sposta.**
|
||||
|
||||
| monitor | barre | Sharpe rotto → vero |
|
||||
|---|---|---|
|
||||
| `paper_statarb` (gate **27/09**) | 58 → 57 | **+1,95 → −1,61** — il ribaltamento previsto dall'audit |
|
||||
| `paper_dvolspread` (kill 24/10) | 32 → 31 | −14,73 → −4,41 |
|
||||
| `paper_xsr` (gate 23/10) | 32 → 31 | −4,98 → −2,72 |
|
||||
| `paper_prevday` | 1584 → 1584 | +0,39 → +0,40 |
|
||||
|
||||
`paper_portfolio` **non** rigenerato (gamba GTAA su ADJUSTED_LAST ri-aggiustato: il replay non
|
||||
sarebbe la serie registrata — P12); tolta la sola coda non chiusa, cosi' la guardia non resta
|
||||
accesa per sempre su un difetto gia' riparato (P14). Storia pre-fix dichiarata corrotta.
|
||||
|
||||
## §5.12 — un test non puo' piu' scrivere nel libro di bordo vivo
|
||||
|
||||
`tests/conftest.py`: oltre al watermark, ora deviati **`trades.db`** (wrapper su `connect` —
|
||||
il default e' catturato alla definizione, patchare la costante non serviva a niente) e
|
||||
**`docs/journal/`** (pagine tracciate da git). Per `book_executions.jsonl`, che i test caricano
|
||||
ad-hoc con importlib e conftest non puo' raggiungere prima: **impronta a inizio suite, verifica
|
||||
a fine suite**, col falso positivo possibile (fill reale del cron :47 durante la suite)
|
||||
dichiarato nel messaggio.
|
||||
|
||||
## §5.5 — il test di leva e' CANCELLATO, non aggiustato
|
||||
|
||||
`test_leva_massima_da_config_resta_sotto_o_uguale_a_1x` misurava `frac x n_asset`: con una
|
||||
chiave di scala la grandezza vera diventerebbe `frac x n_asset x scala` e il test avrebbe
|
||||
continuato a passare smettendo di controllare. Al suo posto una nota che rimanda al tetto sul
|
||||
PRODOTTO di GATE SCALA-01, da cablare nel codice che leggera' la chiave, quando esistera'.
|
||||
|
||||
## §5.9 — il test rosso non segnalava un guasto: segnalava una banda scritta male
|
||||
|
||||
`r0826_skh_band_drift.py` — feed tagliato a date crescenti, stesso codice di produzione:
|
||||
|
||||
| taglio | Sharpe hold-out |
|
||||
|---|---|
|
||||
| 02/07 (audit) | **1,6376** — riproduce l'audit |
|
||||
| 25/07 (banda cablata) | 1,5751 |
|
||||
| 01→15/08 | 1,566 → 1,547 (scivola piano) |
|
||||
| **22/08** | **1,8966** |
|
||||
| oggi | 1,9306 — riproduce il rosso |
|
||||
|
||||
**Il dato regge** (in-sample 1,424 **identico su ogni taglio**; il taglio all'epoca riproduce
|
||||
l'epoca). Il codice non c'entra. 📌 **La scoperta vera: la SOLA settimana 15-22/08 (rally ETH
|
||||
con SKH01 long) vale +0,35 di Sharpe hold-out** — il numero e' cosi' fragile, e chi cita
|
||||
"hold-out 1,9" oggi citerebbe 1,55 di una settimana fa. Coerente con §2: l'hold-out canonico
|
||||
di SKH01 era gia' il numero da non citare.
|
||||
|
||||
**La riparazione:** il test ora **taglia il feed al 02/07** e verifica la riproduzione stretta
|
||||
(±0,02) di full/in-sample/hold-out/maxDD. Si rompe se cambiano codice o dato sulla finestra
|
||||
congelata — e per nessun altro motivo. La deriva del vivo non e' affare suo: per quella ci
|
||||
sono i monitor (e da oggi la guardia PREMATURO).
|
||||
|
||||
Nel farlo, un altro inciampo istruttivo: la prima esecuzione del drift stampava **sette righe
|
||||
identiche** — `run_asset` memoizza in un dict di modulo (`_CACHE`), non in `lru_cache`, e lo
|
||||
svuotamento non lo toccava. Anche il test riparato ora pulisce quel dict, prima E dopo, per
|
||||
non avvelenare gli altri test.
|
||||
|
||||
## Conseguenze sui gate (nessuna data si muove)
|
||||
|
||||
- **STATARB 27/09**: il monitor ora misura la serie vera (**−1,61** a oggi). Coi criteri
|
||||
pre-registrati invariati, a oggi punta al RITIRO — si legge quel giorno, non prima.
|
||||
- **XSR01 23/10 / DVOLSPREAD 24/10**: metrica primaria finalmente su serie reali.
|
||||
Restano i difetti dichiarati (§5.3 pavimento del gate XSR01; veto DVOLSPREAD ora sorvegliato
|
||||
dalla guardia).
|
||||
@@ -790,6 +790,26 @@ SORGENTE** di `cron_daily.sh` — ogni chiamata a `journal.py` deve avere `--gio
|
||||
perche' `journal.py` **senza argomenti scrive OGGI**. La guardia **non vieta** di rigenerare
|
||||
spesso: vieta di scrivere la pagina **una volta e lasciarla li'**.
|
||||
|
||||
🚨 **RIPARATO E RIGENERATO (2026-08-26): `advance()` e i 6 forward-monitor (§5.1).**
|
||||
Il fix e' un filtro condiviso (`src/live/paper_guard.py`): barra open-labeled chiusa =
|
||||
`ts + cadenza ≤ adesso`, importato da tutti e sei i monitor — `paper_combo` compreso, che era
|
||||
sano *per caso* (aspettava la chiusura di una borsa, non per progetto) ed e' ora sano *per
|
||||
costruzione*. Rigenerazione con `scripts/live/paper_regen.py`: stesso `start_ts` pre-registrato,
|
||||
config congelata, replay del codice di produzione riparato (il metodo validato 2 volte
|
||||
dall'audit 22/08); evidenza del difetto archiviata in `*.pre_regen_20260826.*` dentro il
|
||||
perimetro di backup. Esiti (Sharpe rotto → vero): statarb **+1,95 → −1,61** (il ribaltamento
|
||||
del gate 27/09 previsto dall'audit) · dvolspread −14,73 → −4,41 · xsr −4,98 → −2,72 · prevday
|
||||
+0,39 → +0,40. `paper_portfolio` non rigenerato (GTAA legge ADJUSTED_LAST ri-aggiustato: il
|
||||
replay non sarebbe la serie registrata, P12): tolta solo la coda non chiusa, storia pre-fix
|
||||
dichiarata corrotta. La guardia raccomandata dall'audit e' **cablata in `monitor_health`**:
|
||||
stato **PREMATURO** (l'ultima barra chiude dopo l'mtime del file, grazia 5 min), derivato
|
||||
dalle spec esistenti (P1), con `open_labeled=False` per `collect_chain` che timbra giri e non
|
||||
barre (P14). Controllo positivo sul dato vivo: prima della rigenerazione segnala **esattamente
|
||||
i 5 rotti** e tace sui 2 sani; dopo, 7/7 OK. ⚠️ Lezione nel fix: la prima stesura di
|
||||
`indice_chiuso` usava `asi8` assumendo `ns` — pandas 3 usa `us`, e la barra del giorno in corso
|
||||
risultava "chiusa" **senza eccezioni** (D6, pagata di nuovo scrivendo il codice che doveva
|
||||
impedirla). Blindato con un test su tre risoluzioni (`ns/us/s`).
|
||||
|
||||
🚨 **RIPARATO (2026-08-26): il P&L di giornale contava i VERSAMENTI come profitto.**
|
||||
Il «giorno» era un delta di equity fra letture: la voce del 25/08 dichiarava **+$1.414,57 di
|
||||
P&L** quando $1.399,39 erano il deposito USDC dell'operatore, e il «cumulato dall'arming»
|
||||
|
||||
@@ -631,6 +631,11 @@ serviva a diagnosticare l'altro guasto.*
|
||||
📌 **`paper_combo` e' sano PER CASO:** aspetta la chiusura di una **borsa**, non per progetto.
|
||||
Nessuna riga di codice chiede la barra chiusa — **se la sua griglia cambiasse diventerebbe rotto in
|
||||
silenzio.**
|
||||
✅ **CHIUSO IL 2026-08-26:** `advance()` riparato in tutti e 6 i monitor
|
||||
(`src/live/paper_guard.py`), serie rigenerate dallo stesso `start_ts`
|
||||
(`scripts/live/paper_regen.py`; statarb +1,95 → **−1,61**), guardia PREMATURO cablata in
|
||||
`monitor_health` (5/6 segnalati prima della rigenerazione, 7/7 OK dopo). Dettaglio nel diario
|
||||
`2026-08-26-advance-riparato-e-debiti.md`.
|
||||
✅ **Guardia raccomandata (NON implementata), e ha il pregio di essere banale:**
|
||||
`ts_ultima_barra + cadenza <= mtime del file di serie`, grazia 5 min. **O(1)**, nessuna strategia da
|
||||
rieseguire, usa solo cio' che il monitor gia' scrive; segnala **5/6** e **tace sul sano**; controllo
|
||||
|
||||
Reference in New Issue
Block a user