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:
Adriano Dal Pastro
2026-08-26 10:12:23 +00:00
parent a51844875b
commit d597fc64e8
20 changed files with 872 additions and 54 deletions
+36 -6
View File
@@ -9,6 +9,7 @@ import sys
from pathlib import Path
import numpy as np
import pandas as pd
import pytest
ROOT = Path(__file__).resolve().parents[1]
@@ -41,13 +42,42 @@ def test_t1_le_modalita_condividono_le_stesse_trade_boundaries():
def test_t1_canonical_riproduce_il_backtest_ufficiale():
"""La modalita' 'canonical' deve coincidere col backtest dello sleeve: e' l'ancora
di tutto il confronto. Tolleranza larga (il feed cresce ogni giorno)."""
di tutto il confronto.
⚠️ RISCRITTO il 2026-08-26 (era il rosso noto §5.9, indagato PRIMA di toccarlo —
`r0826_skh_band_drift.py`). La versione precedente confrontava una banda scritta
sulla finestra del 02/07 con un numero calcolato sul feed VIVO, che il cron allunga
ogni notte: l'hold-out e' passato da 1,64 a 1,93 senza che nulla si fosse rotto —
e la SOLA settimana 15-22/08 (rally ETH con SKH01 long) vale +0,35 di Sharpe
hold-out. Una banda che insegue il feed non riproduce niente: qui il feed viene
TAGLIATO alla data dell'audit, cosi' il test torna a essere una riproduzione
(N11) — si rompe se cambiano il CODICE o il DATO sulla finestra congelata, e per
nessun altro motivo. La deriva del vivo non e' piu' affare suo: per quella ci sono
i monitor."""
import r0702_anchor_skh01 as r02
import r0726_skh_onbook as ob
s, _ = ob.skh_series(0, "canonical")
full, _, hold, dd = ob.sh3(s)
assert 1.2 < full < 1.7, full # audit 02/07: ~1.46
assert 1.3 < hold < 1.9, hold # audit 02/07: ~1.64
assert 0.12 < dd < 0.24, dd # audit 02/07: ~18.1%
CUT = int(pd.Timestamp("2026-07-02", tz="UTC").value // 10**6)
get5m_vero = r02.get5m
def _tagliato(asset: str):
df = get5m_vero(asset)
return df[df["timestamp"] < CUT].reset_index(drop=True)
r02.get5m = _tagliato
r02._CACHE.clear() # run_asset memoizza in un dict, non in lru_cache
r02.skh_port.cache_clear()
try:
s, _ = ob.skh_series(0, "canonical")
full, ins, hold, dd = ob.sh3(s)
finally:
r02.get5m = get5m_vero
r02._CACHE.clear() # le cache tagliate non devono avvelenare altri test
r02.skh_port.cache_clear()
# i numeri misurati da r0826_skh_band_drift al taglio 02/07 (== audit 02/07)
assert abs(full - 1.463) < 0.02, full
assert abs(ins - 1.424) < 0.02, ins
assert abs(hold - 1.6376) < 0.02, hold
assert abs(dd - 0.181) < 0.01, dd
def test_t1_il_limit_tp_non_puo_riempire_peggio_del_livello():