chore(reset): v2.0.0 — storico certificato Deribit mainnet, ripartenza pulita
Reset del progetto su fondamenta verificate dopo la scoperta che l'intera libreria "validata OOS" era artefatto di feed contaminato (print fantasma del feed Cerbero TESTNET + storico Binance/USDT). - Storico ricostruito da Deribit MAINNET (ccxt pubblico, tokenless) e CERTIFICATO (certify_feed.py): BTC/ETH puliti su TUTTA la storia (mediana 2-6 bps vs Coinbase USD), integrita' OHLC + coerenza resample (maxΔ 0.00) + cross-venue OK. Alt esclusi (illiquidi/divergenti: LTC/DOGE 50-82% barre flat; XRP/BNB non certificabili). - Verdetto sul feed pulito: FADE / PAIRS / XS01 / TSM01 morti (ogni portafoglio Sharpe -2.3..-3.0, DD ~40%); solo SH01 e frammenti HONEST con segnale residuo, da ri-validare in isolamento. - Cleanup "restart pulito": strategie, stack live (src/live, src/portfolio, runner/executor, yml, docker), ~100 script ricerca/gate, waste/games/ portfolios, dati non certificati + cache e 60+ diari -> archiviati in Old/ (preservati, non cancellati). Diario consolidato in un unico documento. - Skeleton ricerca tenuto: Strategy ABC + indicatori + src/fractal + src/backtest/engine + load_data; tool dati certificati (rebuild_history, certify_feed, audit_feed, multi_source_check). - Universo dati ATTIVO: solo BTC/ETH (5m/15m/1h); guardrail fisico (load_data su alt -> FileNotFoundError). Esecuzione DISABILITATA, conto flat. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
# 2026-06-07 — Implementazione fix improvement-sweep (P0 + punti 2-6, settimana 1)
|
||||
|
||||
Implementati e deployati i fix "settimana 1" del piano dello sweep 2026-06-06
|
||||
(tutti fix di parità/protezione/osservabilità, nessun cambio di strategia → nessun
|
||||
gate OOS richiesto). Versioni: v1.1.3 (punti 1-4), v1.1.4 (punti 5-6).
|
||||
|
||||
## P0 — cap SHAPE 0.0588 ripristinato (v1.1.3)
|
||||
|
||||
`portfolios.yml` ridichiara il dict caps COMPLETO `{PAIRS: 0.33, SHAPE: 0.0588}`
|
||||
(l'override sostituisce interamente i caps di `_defs.py` via setattr in
|
||||
`base.py:load_active_portfolio` — footgun ora commentato nel yml). Verificato live
|
||||
post-restart: SH_BTC+SH_ETH = 0.0588 totale (prima 0.1176 = 2x intended), non-cappati
|
||||
risaliti a 0.0647, sum = 1.0 — parità col backtest canonico (FULL 6.43 / OOS 8.58).
|
||||
|
||||
## Punti 2-4 — parità worker multi-asset (v1.1.3)
|
||||
|
||||
- **TR01 fee × leva**: `POS · LEV · fee_rt/2` per flip come il reference
|
||||
`honest_improve2._tr_basket_daily:150` (prima sotto-caricata 2x).
|
||||
- **TR01 forming-bar**: crossover EMA E booking del return solo su barre 4h COMPLETE
|
||||
(riga -1 = candela in corso finché non è trascorsa la sua durata, pattern EXIT-16).
|
||||
Evidenza live che non può più ripetersi: flip SOL 0→1→0 in 59min stessa finestra 4h.
|
||||
- **PairsWorker forming-bar**: entry ED exit sul close di barra COMPLETA, come il
|
||||
backtest `pairs_research` (close settled).
|
||||
- **TSM01/ROT02 silent-return**: WARN log + Telegram `PANEL_SHORT` quando il panel
|
||||
inner-join è sotto il lookback (helper condiviso `_warn_panel_short` in
|
||||
rotation_worker), gated su "era già operativo", una notifica per episodio.
|
||||
|
||||
Verifiche: 72 test (7 nuovi), `validate_worker_pairs` ESATTO, `validate_honest_workers`
|
||||
invariato. **Nota onesta**: TR01 replay worker −44% vs reference +42% è IDENTICO
|
||||
pre/post fix → divergenza di convenzione pre-esistente (capitale-unico con
|
||||
`mean(rets)` solo sugli asset in posizione vs media-equity 1/N del reference).
|
||||
Da rivisitare a parte: "stesso ordine di grandezza" oggi non regge più.
|
||||
|
||||
## Punto 5 — disaster-bracket on-book + alert outage (v1.1.4)
|
||||
|
||||
Durante un outage (poll-loop in except) le posizioni REALI restavano senza stop sul
|
||||
book e senza valutazione exit. Ora:
|
||||
|
||||
- **`ExecutionClient.place_disaster_sl`**: STOP_MARKET reduce-only a ~−30%
|
||||
dall'ingresso (trigger sul mark), piazzato a ogni REAL_OPEN sui fade eseguiti
|
||||
(MR01/MR02/MR07/DIP01) e cancellato in `_real_close` (prima del TP-reconcile).
|
||||
In operatività normale non scatta mai → 0 costo Sharpe; nei crash il fill è al
|
||||
gap (cappa la coda, non la elimina). Config: `overrides.execution.disaster_sl_pct`
|
||||
(default 0.30, 0 = off). `real_dsl_order_id` persistito (resume-safe).
|
||||
- **SCOPERTA**: il `set_stop_loss` di cerbero-mcp è un `private/edit` Deribit (solo
|
||||
ordini APERTI) → inutilizzabile su market già fillati; il bracket va piazzato come
|
||||
trigger order autonomo via `place_order(type="stop_market")` (già supportato).
|
||||
- **Semantica cancel trigger order** (verificata su testnet): la cancel risponde con
|
||||
lo stato AL MOMENTO della cancel (`untriggered` = successo; il re-cancel dà
|
||||
`order_not_found`); `error` = non più in book (probabile trigger scattato → il
|
||||
market a valle filla 0 e REAL_CLOSE esce verified=False).
|
||||
- **Alert `FEED_OUTAGE`**: dopo 5 poll falliti consecutivi (~5 min) Telegram con
|
||||
l'elenco delle posizioni reali aperte; notifica di ripresa con durata.
|
||||
|
||||
Smoke testnet (`live_shadow_smoke.py`, esteso): 4 scenari long+short — il path
|
||||
**short-side TP-resting** (BUY limit reduce-only) non era MAI stato esercitato.
|
||||
Tutti verdi: resting/cross-immediato due lati, DSL piazzato/cancellato (verificato
|
||||
zero ordini orfani sul book), conto flat a fine smoke.
|
||||
|
||||
## Punto 6 — osservabilità multi-asset (v1.1.4)
|
||||
|
||||
- `in_position` aggiunto ai `_save()` di TR01/ROT02/TSM01.
|
||||
- `hourly_report`: nuova sezione **MULTI-ASSET** (book corrente | ultimo flip |
|
||||
freschezza status) — prima i 3 worker erano invisibili nel report (collect()
|
||||
filtra su event/in_position che non emettevano): impossibile distinguere
|
||||
"flat/risk-off by-design" da "wiring rotto". I multi-asset sono esclusi dalla
|
||||
tabella IN CORSO (assume entry/bars single-leg).
|
||||
|
||||
## Code review multi-agente del giorno stesso (v1.1.7)
|
||||
|
||||
Review a 7 angoli su `8c4e1cd..HEAD` + check trades live. Il candidato top dei finder
|
||||
("stop_market senza trigger") è REFUTATO: cerbero-mcp traduce `price→trigger_price +
|
||||
trigger=mark_price` e in produzione 2 DSL erano armati + 1 ciclo completo pulito.
|
||||
Quattro fix applicati:
|
||||
|
||||
1. **Alert `REAL_DIVERGENCE`** (|slippage sim/reale| ≥ 100bps a open/close). Scoperta
|
||||
dal check trades: alle 10:37 uno **spike print testnet** (candela 10:00 H=65618 con
|
||||
O/C~62400) ha fatto shortare alle 3 fade BTC un close fantasma a 65266.5 — il reale
|
||||
ha fillato correttamente a ~62395 (−440bps) ma il sim ha bookato +2.26 mai esistiti
|
||||
(MR07 reale −0.13). Prima passava in silenzio.
|
||||
2. **`FEED_OUTAGE` anche su feed degradato senza eccezione** (HTTP 200 con candles
|
||||
vuote → i worker saltavano il tick in silenzio e lo streak restava 0). Helper unico
|
||||
`_outage_tick` (fix anche dell'incoerenza chiavi minuti/durata_min).
|
||||
3. **`src/live/bars.py`**: detection forming-bar UNIFICATA (era copiata in 4 punti,
|
||||
con `_check_stale_feed` che hardcodava 1h). È l'invariante di sicurezza di EXIT-16:
|
||||
ora vive in un posto solo, testato (`test_bars.py`).
|
||||
4. **DSL cancel hardening**: retry su errore transitorio + alert Telegram
|
||||
`REAL_DSL_CANCEL_FAIL` se lo stop resta forse ORFANO sul book (prima l'id veniva
|
||||
dimenticato in silenzio → lo stop stantio poteva colpire la posizione successiva);
|
||||
`order_not_found` = probabile trigger durante outage → solo log (il close a valle
|
||||
esce già verified=False). Test con executor finto (`test_real_close_dsl.py`).
|
||||
|
||||
Finding noti NON ancora fixati (in coda): ROT02/TSM01 valutano la candela 1d in
|
||||
formazione al primo poll dopo mezzanotte (stessa classe del fix TR01/Pairs, pre-esistente);
|
||||
engine dei gate copiato fra i 3 script `*_port06_impact.py`; epoche hourly_report hardcoded.
|
||||
|
||||
## Resta in roadmap (settimana 2, OGNUNO dietro gate PORT06/OOS)
|
||||
|
||||
trend_max=3.0 sulle 6 fade → pos pairs 0.15-0.25 per-famiglia → DIP01 EXIT-16
|
||||
(validazione gap-aware) → SH01 ri-validazione train-window ~8760 barre.
|
||||
Follow-up tecnico: divergenza convenzione TR01 worker vs reference (sopra).
|
||||
Reference in New Issue
Block a user