From e0257c6c889e613ddc0cc084e438dfa11f766b8f Mon Sep 17 00:00:00 2001 From: Adriano Dal Pastro Date: Fri, 12 Jun 2026 20:21:51 +0000 Subject: [PATCH] =?UTF-8?q?docs(research):=20ACCEL50=20=E2=80=94=20frontie?= =?UTF-8?q?ra=20di=20leva=20PORT06=20+=20probe=20fade=2015m=20verso=20i=20?= =?UTF-8?q?50=20EUR/giorno?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Leva 2->3/4 dimezza i tempi (OOS CAGR 111->206/343%, DD full 3.5->5.2/6.9%). Fade 15m passa il probe (6/6 sleeve OOS+, fee 2x OK, BTC 15m > 1h a meta' DD). Pairs nuove e PAXG bocciati: stale-print illusion (gambe alt 88-98% barre flat). Co-Authored-By: Claude Fable 5 --- docs/diary/2026-06-12-accel50.md | 74 +++++++++++++++++ scripts/analysis/accel50_research.py | 117 +++++++++++++++++++++++++++ 2 files changed, 191 insertions(+) create mode 100644 docs/diary/2026-06-12-accel50.md create mode 100644 scripts/analysis/accel50_research.py diff --git a/docs/diary/2026-06-12-accel50.md b/docs/diary/2026-06-12-accel50.md new file mode 100644 index 0000000..cf3595d --- /dev/null +++ b/docs/diary/2026-06-12-accel50.md @@ -0,0 +1,74 @@ +# 2026-06-12 — ACCEL50: cosa accelera davvero verso €50/giorno + +**Domanda.** Quali strategie/leve accorciano il tempo per arrivare a €50/g da ~€2k? +Script: `scripts/analysis/accel50_research.py`. + +## Il quadro onesto + +A €2k, anche col CAGR OOS del PORT06 (~111% a lev 2), il PnL atteso è ~€4/g: il +collo di bottiglia NON è l'edge (Sharpe OOS 10), è la **taglia**. Le vie testate, +in ordine di impatto: + +## 1. LEVA — l'acceleratore dominante (nessuna ricerca nuova) + +Frontiera su daily return canonici PORT06 (scala lineare, fee pro-quota): + +| lev | CAGR full | DD full | CAGR OOS | DD OOS | anni a €50/g da 2k | +|-----|-----------|---------|----------|--------|--------------------| +| 2 (attuale) | 74% | 3.5% | 111% | 1.5% | 3.3 | +| 3 | 128% | 5.2% | 206% | 2.2% | 1.9 | +| 4 | 200% | 6.9% | 343% | 2.9% | 1.2 | +| 5 | 293% | 8.6% | 539% | 3.7% | 0.9 | + +Anche scontando l'OOS del 50% (regime calmo, caveat noto), lev 3-4 dimezza i +tempi tenendo il DD sotto il 10%. Caveat: il modello è lineare — non cattura +margine, code grasse, slippage che cresce col notional, e gli sleeve senza stop +(PAIRS/SH01) a leva alta hanno code peggiori del modello. Proposta sobria: +**lev 2→3 subito** (DD full 5.2% = ancora metà del PORT02 storico), rivalutare +4 dopo un mese di ledger reale pulito. + +## 2. FADE 15m — la candidata nuova che PASSA il probe + +MR01/02/07 a 15m, parametri live 1h non ri-tunati (anti-overfit), fee 0.10% RT: + +- **Tutti e 6 gli sleeve positivi**, OOS 2025-26 positivo ovunque, fee 2x OK + (Sh 1.6-2.9 — margine ampio). +- **BTC 15m domina il suo 1h**: MR01 Sh 3.37 vs 2.76 con META' del DD + (15.1% vs 31.7%); MR02 3.49 vs 3.29 (DD 10.8 vs 18.7). +- ETH 15m leggermente sotto il 1h in Sharpe ma OOS molto più grande in valore + assoluto (4x trade = compounding più veloce; MR02 +22052 vs +9560). +- Infrastruttura live 15m GIA' esistente (fetch sub-orario del BLEND pairs). + +**Prossimi passi obbligati prima del deploy** (metodologia standard): +gate PORT06 con correlazione 15m↔1h (se ~1 sostituire, se bassa aggiungere), +griglia parametri al 15m, validazione worker, caveat flat ETH 15m (14-30% +storico — per le fade single-leg il fill flat è meno tossico che per i pairs, +ma va guardato con flat-aware engine). + +## 3. PAIRS nuove — BOCCIATE (stale-print illusion, di nuovo) + +Sweep onesto delle 19 coppie mai testate (config universale pre-registrata +n=50 z2.0/0.5 max72): 8 candidate con Sh 1.5-4.3... MA le gambe alt hanno +88-98% barre flat (ADA 98%, LTC 97%, DOGE 91%, XRP 88%, BNB 88%) e con +`flat_skip=True` muoiono quasi tutte (BTC/ADA 4.33→0.17, ETH/DOGE 3.79→0.46; +migliore superstite ETH/XRP 1.34 < le 5 deployate). Identica classe di +illusione del XEX su DOGE/SOL (stessa giornata, `xex_divergence_research.py`). +**PAXG idem**: 92% flat su Deribit → chiuso anche il ramo "oro". + +NB: questo getta anche una luce nuova sulle gambe alt dei pairs GIA' deployati +(ADA/LTC/SOL hanno flat share altissime nel parquet) — il loro ledger reale +shadow è il banco di prova giusto e finora regge, ma teniamolo d'occhio. + +## 4. CAPITALE — domina tutto + +A config attuale: €50/g ≈ €24k di capitale. Ogni € aggiunto accorcia +linearmente; nessuna ricerca batte un deposito. In più, a ~€20k si sbloccano +in esecuzione reale i 4 book multi-asset oggi solo paper (TR01/ROT02/TSM01/XS01). + +## Sintesi operativa + +Ordine d'impatto: **capitale > leva (2→3) > fade 15m (da gateare) >>** tutto il +resto. Le vie "nuova strategia esotica" (pairs nuove, PAXG, XEX) sono tutte +morte oggi sotto il test di esecuzione realistica — la lezione del giorno è che +su questo testnet ogni edge va validato col **book/flat-aware engine** prima di +crederci. diff --git a/scripts/analysis/accel50_research.py b/scripts/analysis/accel50_research.py new file mode 100644 index 0000000..20fdad7 --- /dev/null +++ b/scripts/analysis/accel50_research.py @@ -0,0 +1,117 @@ +"""ACCEL50 — Ricerca acceleratori verso l'obiettivo €50/giorno (2026-06-12). + +Domanda: quali strategie/leve portano PIU' VELOCEMENTE a €50/g partendo da ~€2k? +Diario: docs/diary/2026-06-12-accel50.md. Esiti: + +1. LEVA su PORT06 (acceleratore dominante, zero ricerca nuova). + La frontiera (scala lineare dei daily return canonici, fee pro-quota) mostra + che a Sharpe ~7-10 il vincolo non e' il rischio ma la taglia: lev 2->4 porta + gli anni-a-target da 3.3 a 1.2 con FULL DD 3.5->6.9%. Vedi lev_frontier(). + +2. FADE 15m (candidata NUOVA, validazione preliminare PASSATA). + MR01/MR02/MR07 a 15m con i parametri live 1h (trend_max=3, ema_long=200, + sl_confirm_atr=0.5, fee 0.10% RT): tutti e 6 gli sleeve positivi, OOS + 2025-26 positivo ovunque (spesso > del 1h: 4x trade = compounding piu' + rapido), reggono fee 2x (Sh 1.6-2.9). BTC 15m MIGLIORA il 1h (MR01 Sh + 3.37 vs 2.76 con meta' DD). Prossimo passo obbligato: gate PORT06 + (correlazione col gemello 1h, parita' worker — infra 15m gia' esistente + dal BLEND pairs). Vedi fade15m_probe(). + +3. PAIRS NUOVE: BOCCIATE (stale-print illusion). + Lo sweep delle 19 coppie mai testate (config universale pre-registrata) + dava 8 candidate con Sharpe 1.5-4.3, MA le gambe alt hanno 88-98% di barre + flat (LTC 97%, ADA 98%, DOGE 91%, XRP 88%, BNB 88%) e con flat_skip=True + (fill solo su barre pulite) muoiono quasi tutte (BTC/ADA 4.33->0.17, + ETH/DOGE 3.79->0.46). Migliore superstite ETH/XRP a 1.34: inferiore alle + 5 deployate -> niente. Stessa classe di illusione del XEX su DOGE/SOL + (vedi xex_divergence_research.py). PAXG idem: 92% flat su Deribit. + +4. CAPITALE: a config attuale servono ~€24k per €50/g; ogni € aggiunto + accorcia linearmente (non e' una strategia ma domina ogni altra leva). +""" +from __future__ import annotations + +import sys +from pathlib import Path + +import numpy as np + +PROJECT_ROOT = Path(__file__).resolve().parents[2] +sys.path.insert(0, str(PROJECT_ROOT)) + + +def lev_frontier() -> None: + """Frontiera di leva su PORT06: CAGR/DD/Sharpe e anni-a-€50/g per lev 1-6. + Modello: scala lineare dei daily return del backtest canonico (strumenti + lineari, fee proporzionali al notional). NON modella margine/code grasse.""" + from scripts.portfolios._defs import PORTFOLIOS + from scripts.analysis.combine_portfolio import port_returns, SPLIT + from src.portfolio.sleeves import all_sleeve_equities, sleeve_returns_df + + p = PORTFOLIOS["PORT06"] + eq = all_sleeve_equities() + members = {sid: eq[sid] for sid in p.sleeve_ids} + w = p.weight_vector(sleeve_returns_df(p.sleeve_ids)) + base = port_returns(members, w) # == live a lev 2 (parita' validata) + + def dd(x): + c = (1 + x).cumprod() + return ((c - c.cummax()) / c.cummax()).min() * 100 + + def cagr(x): + c = (1 + x).cumprod() + return ((c.iloc[-1]) ** (365 / len(x)) - 1) * 100 + + print("lev CAGR_full% DD_full% CAGR_oos% DD_oos% K_per_50/g anni_da_2k") + for f, lev in [(0.5, 1), (1.0, 2), (1.5, 3), (2.0, 4), (2.5, 5), (3.0, 6)]: + r = base * f + roos = r.iloc[SPLIT:] + co = cagr(roos) + daily = (1 + co / 100) ** (1 / 365) - 1 + k = 50 / daily if daily > 0 else float("inf") + anni = np.log(k / 2020) / np.log(1 + co / 100) if co > 0 else float("inf") + print(f"{lev:>3} {cagr(r):>11.0f} {dd(r):>9.2f} {co:>10.0f} {dd(roos):>8.2f} " + f"{k:>11,.0f} {max(anni, 0):>11.1f}") + + +def fade15m_probe() -> None: + """MR01/02/07 a 15m vs 1h, parametri live, fee 0.10% e stress 2x.""" + import importlib.util + import inspect + from src.strategies.base import Strategy + + LIVEP = dict(trend_max=3.0, ema_long=200, sl_confirm_atr=0.5) + paths = { + "MR01": "scripts/strategies/MR01_bollinger_fade.py", + "MR02": "scripts/strategies/MR02_donchian_fade.py", + "MR07": "scripts/strategies/MR07_return_reversal.py", + } + for code, rel in paths.items(): + spec = importlib.util.spec_from_file_location(code.lower(), PROJECT_ROOT / rel) + m = importlib.util.module_from_spec(spec) + spec.loader.exec_module(m) + cls = next(o for _, o in vars(m).items() + if inspect.isclass(o) and issubclass(o, Strategy) and o.__module__ == m.__name__) + s = cls() + for asset in ("BTC", "ETH"): + line = f"{code} {asset}: " + for tf in ("1h", "15m"): + r = s.backtest(asset, tf, **LIVEP) + if r is None: + line += f"{tf}: no-sig | " + continue + oos = sum(y.pnl for y in r.yearly if y.year >= 2025) + old = s.fee_rt + s.fee_rt = 0.002 + r2 = s.backtest(asset, tf, **LIVEP) + s.fee_rt = old + line += (f"{tf}: Sh{r.sharpe:5.2f} DD{r.max_dd:5.1f}% n={r.trades:4d} " + f"oos25-26={oos:+8.0f} fee2x_Sh{r2.sharpe:5.2f} | ") + print(line) + + +if __name__ == "__main__": + print("=== 1. Frontiera di leva PORT06 ===") + lev_frontier() + print("\n=== 2. Fade 15m probe ===") + fade15m_probe()