From a60ad30ac01b74aeea16d5b2ba24e4922ccf00e3 Mon Sep 17 00:00:00 2001 From: AdrianoDev Date: Fri, 29 May 2026 09:26:27 +0200 Subject: [PATCH] fix(live): naming Deribit corretto per alt -> tutte le 5 coppie pairs tradabili live Gli alt su Deribit sono perp LINEARI USDC: "_USDC-PERPETUAL" (storia dal 2022), non "-PERPETUAL" (vuoto per LTC/ADA, dati errati per SOL). INSTRUMENT_MAP corretto. Smoke test live (live_smoke_pairs.py): tutte e 5 le coppie ricevono feed fresco (1448 barre, ultima ~0.4h) e ticcano. Riabilitate tutte le coppie in strategies.yml. BTC/ETH restano inverse ("-PERPETUAL"). CLAUDE.md / docstring PR01 aggiornati. Co-Authored-By: Claude Opus 4.8 (1M context) --- CLAUDE.md | 12 ++++++---- scripts/strategies/PR01_pairs_reversion.py | 9 ++++---- src/live/multi_runner.py | 19 ++++++++------- strategies.yml | 27 +++++++++++----------- 4 files changed, 36 insertions(+), 31 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 0014d39..c64a839 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -162,9 +162,11 @@ quest'ultima riconferma la dominanza mean-reversion). Due edge reali: (overfit). Corr col mercato ~0.02-0.08. Fee su **2 gambe**: worker live implementato (`src/live/pairs_worker.py`, sezione `pairs:` in `strategies.yml`). LOGICA validata (`validate_worker_pairs.py`: replay == backtest ESATTO). LIVE (`live_smoke_pairs.py`, - smoke reale Cerbero): tradabile **solo ETH/BTC** — LTC/ADA-PERPETUAL VUOTI su Deribit, - SOL pochi dati → le altre 4 coppie restano valide a backtest ma DISABILITATE finché non - si aggiunge un feed live alt. Verifica edge: `pairs_research.py`. + smoke reale Cerbero): **tutte e 5 le coppie con feed live fresco**. Naming Deribit: + BTC/ETH = `-PERPETUAL` (inverse); alt = `_USDC-PERPETUAL` (lineari USDC, + storia dal 2022). Trappola: `LTC-PERPETUAL`/`SOL-PERPETUAL` danno vuoto/dati errati → + usare sempre `_USDC-PERPETUAL`. Resta da verificare solo liquidità/fill in esecuzione. + Verifica edge: `pairs_research.py`. - **TSM01** (`scripts/analysis/tsmom_research.py`): TSMOM multi-orizzonte 3/6/12m + risk-off, **gross 0.30**, distinto da ROT02 (corr 0.62), DD 15-22%, mai un anno negativo. Robusto (36/36 config OOS+) ma diversificatore, non motore di ritorno (rende meno di ROT02). @@ -175,8 +177,8 @@ grande (`scripts/analysis/combine_v2.py`). **Numeri sobri onesti** (l'OOS singol atteso **~5** (mediana semestrale), ogni anno positivo dal 2021, regge **leva 2x + slippage doppio** (CAGR 36%, Sharpe 5.1). Config robusta raccomandata: **MASTER-esteso equal-weight, leva 2x, cap pairs ~30-35%** (i pairs sono ~57% del rischio; worker live a -2 gambe ora implementato e validato, ma shortabilità alt da verificare in reale). La -confluenza multi-TF è stata SCARTATA (overfit). +2 gambe implementato, validato e con feed live su tutte e 5 le coppie — resta da +verificare liquidità/fill in esecuzione reale). La confluenza multi-TF è stata SCARTATA (overfit). **Metodologia obbligatoria per ogni nuova strategia** (per non ripetere l'errore squeeze): 1. Ingresso eseguibile: direzione e prezzo decisi con dati **fino a `close[i]`**, mai `close[i-1]` con direzione da `i`. diff --git a/scripts/strategies/PR01_pairs_reversion.py b/scripts/strategies/PR01_pairs_reversion.py index a440008..a3d05a4 100644 --- a/scripts/strategies/PR01_pairs_reversion.py +++ b/scripts/strategies/PR01_pairs_reversion.py @@ -30,10 +30,11 @@ WORKER LIVE: implementato `src/live/pairs_worker.py` (2 gambe, fee doppie, stato persistente) e wired in `multi_runner` (sezione `pairs:` in strategies.yml). Validato: - LOGICA: `validate_worker_pairs.py` -> replay storico == backtest pairs_sim ESATTO (ETH/BTC: capitale, n.trade, win% identici). - - LIVE: `live_smoke_pairs.py` (smoke reale Cerbero) -> tradabile live SOLO ETH/BTC. - LTC/ADA-PERPETUAL sono VUOTI sull'endpoint Deribit, SOL ha pochi dati. Le altre 4 - coppie sono valide nel BACKTEST (parquet locali) ma DISABILITATE in strategies.yml - finche' non si aggiunge un feed live per gli alt (Bybit/Hyperliquid via Cerbero). + - LIVE: `live_smoke_pairs.py` (smoke reale Cerbero) -> tutte e 5 le coppie con feed + live fresco. Naming Deribit corretto: BTC/ETH = "-PERPETUAL" (inverse), + alt = "_USDC-PERPETUAL" (lineari USDC, storia dal 2022). Trappola: usare + "LTC-PERPETUAL"/"SOL-PERPETUAL" da' vuoto/dati sbagliati -> SEMPRE _USDC-PERPETUAL. + Resta da verificare in trading reale solo la liquidita'/fill in esecuzione. """ from __future__ import annotations diff --git a/src/live/multi_runner.py b/src/live/multi_runner.py index 0d72aa5..b94a852 100644 --- a/src/live/multi_runner.py +++ b/src/live/multi_runner.py @@ -19,17 +19,20 @@ PROJECT_ROOT = Path(__file__).resolve().parents[2] DATA_DIR = PROJECT_ROOT / "data" / "paper_trades" RESOLUTION_MAP = {"15m": "15", "1h": "60", "5m": "5"} -# Deribit ha perp per i major; per gli alt il fallback "{X}-PERPETUAL" passa da Cerbero -# (Bybit/Hyperliquid). La shortabilita'/liquidita' degli alt va verificata in live. +# Convenzione Deribit (verificata via Cerbero, 2026-05-29): +# - BTC/ETH = perpetui INVERSE (margine coin): "-PERPETUAL" +# - altcoin = perpetui LINEARI USDC (margine USDC): "_USDC-PERPETUAL", storia dal 2022 +# Trappola: "LTC-PERPETUAL"/"ADA-PERPETUAL" = 0 candele; "SOL-PERPETUAL" = contratto vecchio +# con dati sbagliati. Per gli alt usare SEMPRE la forma _USDC-PERPETUAL. INSTRUMENT_MAP = { "BTC": "BTC-PERPETUAL", "ETH": "ETH-PERPETUAL", - "SOL": "SOL-PERPETUAL", - "LTC": "LTC-PERPETUAL", - "ADA": "ADA-PERPETUAL", - "XRP": "XRP-PERPETUAL", - "BNB": "BNB-PERPETUAL", - "DOGE": "DOGE-PERPETUAL", + "SOL": "SOL_USDC-PERPETUAL", + "LTC": "LTC_USDC-PERPETUAL", + "ADA": "ADA_USDC-PERPETUAL", + "XRP": "XRP_USDC-PERPETUAL", + "BNB": "BNB_USDC-PERPETUAL", + "DOGE": "DOGE_USDC-PERPETUAL", } diff --git a/strategies.yml b/strategies.yml index 98f95b0..024e8c7 100644 --- a/strategies.yml +++ b/strategies.yml @@ -95,39 +95,38 @@ strategies: # PR01 — PAIRS market-neutral spread reversion (worker a 2 GAMBE: src/live/pairs_worker.py) # Config UNIVERSALE n50 z2 zx0.75 mb72 (anti-overfit, validata walk-forward). # fee_rt 0.001/gamba -> 0.20% RT/coppia. -# SMOKE TEST LIVE (scripts/analysis/live_smoke_pairs.py, 2026-05-29): l'endpoint -# Cerbero/Deribit serve solo BTC/ETH freschi; LTC/ADA-PERPETUAL sono VUOTI e SOL ha -# pochi dati. Quindi LIVE e' tradabile SOLO ETH/BTC. Le altre coppie restano valide nel -# backtest (parquet locali completi) ma DISABILITATE finche' non si aggiunge un feed live -# per gli alt (Bybit/Hyperliquid via Cerbero). Il runner comunque salta i pair senza feed. +# FEED LIVE (verificato 2026-05-29): tutti i leg disponibili su Deribit via Cerbero con +# il naming corretto -> BTC/ETH = "-PERPETUAL" (inverse), alt = "_USDC-PERPETUAL" +# (lineari USDC, storia dal 2022). Tutte e 5 le coppie tradabili live. ETH/SOL la piu' +# debole (DD ~63%, storia SOL piu' corta) -> peso ridotto consigliato. pairs: - - name: PR01_pairs_reversion # UNICA tradabile live (feed Cerbero OK) + - name: PR01_pairs_reversion a: ETH b: BTC tf: 1h enabled: true params: {n: 50, z_in: 2.0, z_exit: 0.75, max_bars: 72, jump_max: 0.08} - - name: PR01_pairs_reversion # feed alt assente su Deribit -> off + - name: PR01_pairs_reversion a: LTC b: ETH tf: 1h - enabled: false + enabled: true params: {n: 50, z_in: 2.0, z_exit: 0.75, max_bars: 72, jump_max: 0.08} - - name: PR01_pairs_reversion # feed alt assente su Deribit -> off + - name: PR01_pairs_reversion a: ADA b: ETH tf: 1h - enabled: false + enabled: true params: {n: 50, z_in: 2.0, z_exit: 0.75, max_bars: 72, jump_max: 0.08} - - name: PR01_pairs_reversion # LTC assente su Deribit -> off + - name: PR01_pairs_reversion a: BTC b: LTC tf: 1h - enabled: false + enabled: true params: {n: 50, z_in: 2.0, z_exit: 0.75, max_bars: 72, jump_max: 0.08} - - name: PR01_pairs_reversion # SOL pochi dati su Deribit; la piu' debole -> off + - name: PR01_pairs_reversion # la piu' debole (peso ridotto) a: ETH b: SOL tf: 1h - enabled: false + enabled: true params: {n: 50, z_in: 2.0, z_exit: 0.75, max_bars: 72, jump_max: 0.08}