Files
PythagorasGoal/Old/docs/diary/2026-06-09-pairs15m-live-path.md
Adriano Dal Pastro 14522262e6 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>
2026-06-19 15:20:59 +00:00

83 lines
5.0 KiB
Markdown

# 2026-06-09 — Percorso live 15m per ETH/BTC pairs: COSTRUITO e VALIDATO
Seguito di `2026-06-09-pairs15m-port06-gate.md` (il gate passa, edge reale e non
artefatto flat). Qui si costruisce e VALIDA l'infrastruttura per eseguire il pairs
ETH/BTC a 15m con flat-skip, alla pari del backtest (disciplina validate_worker_pairs).
## 1. Engine canonico (regression-locked)
`scripts/analysis/pairs_research.py`: aggiunti `aligned_ohlc`, `is_flat_ohlc`,
`pairs_sim_flat(..., flat_skip, scan_buffer)`. Regola di uscita **LIVE-REALIZABLE**:
la condizione (|z|<=z_exit O bars>=max_bars) ARMA `exit_ready`; si esce al CLOSE della
PRIMA barra PULITA successiva (mai a un prezzo passato come faceva il prototipo push-back).
- **Regression-lock**: `pairs_sim_flat(flat_skip=False)` == `pairs_sim` ESATTO
(ETH/BTC 1h 1756 trade, 15m 9388 trade, ret/dd/sharpe identici al bit).
## 2. PairsWorker esteso (retrocompatibile)
`src/live/pairs_worker.py`: param `flat_skip`, stato `exit_ready` (persistito), tick
ora fa merge OHLC e rileva le candele flat (O=H=L=C in UNA gamba). Entry saltato su barra
stale; uscita con la stessa regola exit_ready dell'engine. **Default off = comportamento
1h storico invariato** (se mancano le colonne OHLC, flat=False).
## 3. Runner: fetch sub-orario (inerte finche' non c'e' uno sleeve 15m)
`src/portfolio/runner.py`: `_SUBHOURLY={5m,15m,30m}`, `_LOOKBACK_DAYS` esteso; il loop
fetcha DIRETTO da Cerbero i timeframe sub-orari per (asset,tf) (non resamplabili dal 1h) e
un router `_series_for` instrada la serie giusta a ogni worker. Zero impatto sul live
attuale: nessuno sleeve e' 15m → `subhourly_needs` vuoto → ramo morto.
## 4. VALIDAZIONE (validate_worker_pairs.py) — TUTTO OK
Replay bar-per-bar del worker == backtest:
| caso | worker | backtest | match |
|---|---|---|---|
| ETH/BTC 1h | 1756 trd, cap 2.886.616 | 1756, 2.886.616 | **OK esatto** |
| BTC/LTC 1h | 599 trd, cap 16.861 | 599, 16.861 | **OK esatto** |
| **ETH/BTC 15m-flat** | **8452 trd** | **8453 trd** (cap entro 0.15%) | **OK** |
(1 trade di differenza = posizione finale aperta non chiusa nel replay, atteso.)
## 5. Gate finale (engine == worker) — PROMOSSO
`pairs15m_gate_final.py` (corr 1h vs 15m = 0.372, 3201 ingressi flat saltati):
| variante ETH/BTC | FULL Sh | FULL DD | OOS Sh | OOS DD |
|---|---|---|---|---|
| baseline 1h | 6.43 | 3.96 | 8.58 | 1.36 |
| **SWAP 15m-flat** | 7.31 | 3.55 | **9.95** | **1.26** |
| **BLEND 1h+15m** | 7.03 | 3.66 | 9.57 | 1.24 |
Entrambi PROMOSSI (a fee backtest). Caveat slippage del gate precedente invariato → il
BLEND e' la forma raccomandata (meta' allocazione sul 1h pulito, slippage-robusto).
## Stato e attivazione (NON fatta — decisione di deploy)
Tutto il PERCORSO e' pronto e validato, ma il 15m **non e' attivo nel portafoglio live**:
attivarlo cambia il trading reale e va deciso esplicitamente. Per accenderlo:
1. `_defs.py`: aggiungere SleeveSpec pairs ETH/BTC a 15m (tf="15m",
params={n:66,z_in:1.674,z_exit:1.0,max_bars:35,flat_skip:True}) — come SWAP della 1h o
come 2a sleeve (BLEND) sotto il cap PAIRS.
2. `report_families.build_everything` / `sleeves`: l'equity del nuovo sleeve dal
`pairs_sim_flat(tf=15m, flat_skip=True)` (per parita' backtest==report).
3. Shadow smoke su testnet (come `live_smoke_pairs.py`) prima del paper reale.
4. `deploy.sh` (bump+rebuild) — il runner gia' fetcha 15m e passa flat_skip via spec.params.
Test suite: nessuna regressione (1h byte-exact). Artefatti: pairs_research.py,
pairs_worker.py, runner.py, validate_worker_pairs.py, pairs15m_gate_final.py.
## ATTIVAZIONE IN REALE (2026-06-09) — BLEND, mezza size
Deciso: BLEND (sleeve 15m ACCANTO al 1h, non swap). Implementato:
- `_defs.py`: SleeveSpec `PR_ETHBTC_15M` (tf=15m, flat_skip, params.position_size=0.10
= meta' del family PAIRS 0.20) in PAIRS -> entra in PORT04/05/06.
- `report_families.build_everything`: equity da `pairs_sim_flat(tf=15m, flat_skip=True, pos=0.075)`
(mezza size, == intento live) con sid PR_ETHBTC_15M.
- `runner.pos_for_spec`: override PER-SLEEVE (params.position_size) > famiglia > globale.
- **Mezza size perche'** a peso pieno il 15m pesava il 25.8% del rischio PORT06 (vs 9.5% del
1h): dimezzato -> 11.5% vs 10.6%, bilanciato. Disciplina come la cap SHAPE; rispetta il
caveat slippage (il 15m non domina il book).
**PORT06 col BLEND (mezza size)**: FULL Sharpe **6.43->7.20** DD **3.96->3.68**,
OOS Sharpe **8.58->9.66** DD **1.36->1.31**. Migliora tutto.
**Smoke live 15m** (`pairs15m_live_smoke.py`): Cerbero serve candele 15m FRESCHE per
ETH e BTC (ultima barra 0 min fa, flat live 2-3%), worker flat-skip ticca OK. Esecuzione
reale a 2 gambe gia' coperta da `live_pairs_smoke.py` (livello strumento, tf-indipendente).
**Regression-lock aggiornati** (miglioria attesa, non regressione): test_definitions
(17->18 sleeve), test_backtest_parity_cap (FULL 6.47->7.20, OOS 8.82->9.66). Suite verde.
Live: il runner fetcha 15m diretto, costruisce il PairsWorker(flat_skip) col pos 0.10,
e lo esegue reale a 2 gambe (pairs_enabled). Attivazione via deploy (bump+rebuild).