diff --git a/docs/diary/2026-06-08-mr02eth-replace-search.md b/docs/diary/2026-06-08-mr02eth-replace-search.md index 02af22f..5798471 100644 --- a/docs/diary/2026-06-08-mr02eth-replace-search.md +++ b/docs/diary/2026-06-08-mr02eth-replace-search.md @@ -107,6 +107,21 @@ Gate PORT06 (`eth_collar_gate.py`, BS calibrato skew_put 1.12 / skew_call 1.0, s −4% aggregato). La cap auto-finanziata era giusta sul *costo* (~break-even) ma la protezione non vale il costo Sharpe/OOS-DD. Le opzioni si chiudono come **NO-GO empirico su prezzi reali**. +## Deploy della miglioria (2026-06-09): MR02/ETH stop-largo sl_atr 3.0 +Nessun SOSTITUTO batte il live; la MIGLIORIA deployabile e' allargare lo stop EXIT-16. +Gate stop-width (EXIT-16 close-confirm, swap solo MR02_ETH): +| sl_atr | FULL Sh | FULL DD | OOS Sh | OOS DD | worst-trade | +|---|---|---|---|---|---| +| 2.0 (LIVE) | 6.73 | 3.67 | 8.80 | 1.23 | -48% | +| **3.0** | **6.77** | **3.30** | **8.82** | 1.23 | **-50%** | +| 4.0 | 6.78 | 3.49 | 8.82 | 1.23 | -62% | +| no-SL (sl=0) | 6.76 | 3.68 | 8.87 | 1.23 | -65% (vietato) | +`sl_atr=3.0` domina il live (FULL DD -0.37pp, Sh +0.04/+0.02) e cattura il beneficio del no-SL +(gli stop di meta'-discesa sono falsi negativi) MANTENENDO lo stop di catastrofe (worst -50%, non +-65%) -> regola "mai sl=0" rispettata; 4.0 inizia a perdere la coda. Plateau 2.5-4.0 (tutti > live +su Sharpe). Override SCOPED a MR02/ETH in `_defs.py` (`_fade_params`); gli altri 5 fade non +ri-gateati -> invariati. 93/93 test passano. Deploy: `./scripts/deploy.sh` (cambio live). + ## Artefatti riusabili - `scripts/analysis/option_overlay_lab.py` — overlay opzioni (pricing BS sintetico su DVOL). - `scripts/analysis/options_fetcher.py` — import storico opzioni reale da cerbero-bite → data/options/. diff --git a/scripts/portfolios/_defs.py b/scripts/portfolios/_defs.py index 820157c..df76c41 100644 --- a/scripts/portfolios/_defs.py +++ b/scripts/portfolios/_defs.py @@ -40,9 +40,29 @@ EMA_LONG = 200 # esce nei crash veri tipo FTX). Vedi docs/diary/2026-06-04-exit-lab.md. SL_CONFIRM_ATR = 0.5 + +# Override stop-largo su MR02/ETH (2026-06-09). Lo sleeve a DD piu' alto e peggior performer reale +# (whipsaw: fada un downtrend in long, poi shorta il rimbalzo). Ricerca 127 strategie + verifica +# avversariale + gate PORT06: nessun SOSTITUTO batte il live EXIT-16; la miglioria e' ALLARGARE lo +# stop (sl_atr 2.0->3.0) mantenendo il close-confirm. Cattura il beneficio del no-SL (gli stop di +# meta'-discesa sono falsi negativi) SENZA la coda da sl=0 (worst-trade -50% vs -65% del no-SL; la +# rete di catastrofe resta -> regola "mai sl=0" rispettata). Gate PORT06 (swap del solo MR02_ETH): +# FULL Sh 6.73->6.77 DD 3.67->3.30, OOS Sh 8.80->8.82 DD 1.23 (domina il live, FULL DD -0.37pp). +# Scoped a MR02/ETH: gli altri 5 fade (logica diversa) NON sono stati ri-gateati -> invariati. +# Diario docs/diary/2026-06-08-mr02eth-replace-search.md (addendum 2026-06-09). +SL_ATR_WIDE_MR02ETH = 3.0 + + +def _fade_params(c: str, a: str) -> dict: + p = {"min_tp_frac": MIN_TP_FRAC, "trend_max": TREND_MAX, + "ema_long": EMA_LONG, "sl_confirm_atr": SL_CONFIRM_ATR} + if (c, a) == ("MR02", "ETH"): + p["sl_atr"] = SL_ATR_WIDE_MR02ETH + return p + + FADE = [SleeveSpec(kind="single", name=c, sid=f"{c}_{a}", asset=a, cluster=f"{a}-rev", - params={"min_tp_frac": MIN_TP_FRAC, "trend_max": TREND_MAX, - "ema_long": EMA_LONG, "sl_confirm_atr": SL_CONFIRM_ATR}) + params=_fade_params(c, a)) for a in ("BTC", "ETH") for c in ("MR01", "MR02", "MR07")] HONEST = [ # DIP01: single-asset 1h -> StrategyWorker (Strategy DIP01_dip_buy). TR01/ROT02: multi-asset.