diff --git a/CLAUDE.md b/CLAUDE.md index 63c906e..821f075 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -152,15 +152,17 @@ Come `PORT01`, sono meta-portafogli (script `run()` di report), non `Strategy` c cross-sectional reversal, opening-range breakout, lead-lag BTC→alt, continuation intraday — quest'ultima riconferma la dominanza mean-reversion). Due edge reali: - **PR01 Pairs** (`scripts/strategies/PR01_pairs_reversion.py`): spread reversion - market-neutral sul log-ratio z-score di coppie cripto (ETH/BTC, LTC/ETH, ADA/ETH). - ETH/BTC: CAGR 144%, Sharpe 4.04, OOS DD 17%, 8/9 anni; corr col mercato ~0.02. Fee su + market-neutral sul log-ratio z-score. **6 coppie robuste**: ETH/BTC (Sharpe 4.04), + LTC/ETH, ADA/ETH, BTC/LTC (robusta anche 4h), ETH/SOL, BNB/ETH (Sharpe 2.2-2.5). + Pattern: sempre alt-liquido vs major (mai alt/alt). Corr col mercato ~0.02-0.08. Fee su **2 gambe** (worker da estendere prima del live). Verifica: `pairs_research.py`. - **TSM01** (`scripts/analysis/tsmom_research.py`): TSMOM multi-orizzonte 3/6/12m + risk-off, marginale ma distinto (corr 0.53 con ROT02), DD 22%/12% OOS, mai un anno negativo. -Aggiungere i **pairs** al MASTER (quasi scorrelati, ~0.05) è il free-lunch più grande: -MASTER+pairs (12 sleeve) → CAGR 47→66%, DD 5.2→3.8% full / 4.7→3.3% OOS, Sharpe OOS -4.33→**6.86** (`scripts/analysis/combine_v2.py`). Caveat: backtest leva 3x, OOS ~1.6 anni. +Aggiungere i **6 pairs** al MASTER (quasi scorrelati, ~0.02-0.08) è il free-lunch più +grande: MASTER+6pairs (15 sleeve) → CAGR 47→71%, **OOS DD 4.7→2.3%**, Sharpe OOS +4.33→**7.71**, tutti gli anni positivi (`scripts/analysis/combine_v2.py`). Caveat: +backtest leva 3x, OOS ~1.6 anni, 2024 cripto eccezionale; i pairs richiedono 2 gambe. **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/docs/diary/2026-05-29-exploration.md b/docs/diary/2026-05-29-exploration.md index 91f1ed7..0e26aa6 100644 --- a/docs/diary/2026-05-29-exploration.md +++ b/docs/diary/2026-05-29-exploration.md @@ -82,6 +82,37 @@ poco (diluisce il ritorno) ma abbassa lievemente il DD. - TSMOM e le strategie honest condividono l'overlay risk-off SMA100: parte della loro difensività è comune (non perfettamente indipendente). +## Terza ondata — espansione dei meccanismi provati + 2 nuovi sondaggi + +Esplorate altre 4 direzioni con agenti paralleli: +- **Fade su 6 nuovi alt (ADA/BNB/DOGE/LTC/SOL/XRP)**: 0 robuste. La mean-reversion + fade vive solo su BTC/ETH (liquidi); sugli alt sparisce o è artefatto di pochi pump + (DOGE). Coerente con la lezione del progetto. +- **Espansione PAIRS** (tutte le 28 coppie): trovate **3 nuove coppie robuste** → + BTC/LTC (robusta 1h *e* 4h, Sharpe 2.21, DD 24-34%, concentrazione PnL 9%), ETH/SOL + e BNB/ETH (Sharpe 2.4+, solo 1h). Pattern: sempre alt-liquido vs major, mai alt/alt. + PR01 ora ha **6 coppie**. +- **Low-volatility anomaly**: ❌ in cripto è INVERTITA (vince l'alta vol = alta beta), + ridondante con EW+risk-off/ROT02. L'anti-test high-vol stravince. +- **Confluenza multi-timeframe (fade 1h confermato da 4h)**: non crea edge nuovo e non + migliora lo Sharpe, ma **dimezza il DD** di MR01 (ETH: stesso Sharpe 3.17 a DD 38% vs + 63%) e stabilizza l'OOS → utile variante low-DD, non strategia indipendente. + +## Bilancio finale e MASTER esteso (6 pairs) + +Robusti deployabili: **famiglia PAIRS (6 coppie) + TSM01** (+ confluenza MTF come variante +low-DD di MR01, + tilt stagionale mercoledì marginale). I 6 pairs sono quasi scorrelati col +MASTER (corr 0.02-0.08). MASTER + 6 pairs: + +| Portafoglio | CAGR | DD% | Sharpe | OOS DD% | OOS Sharpe | +|---|--:|--:|--:|--:|--:| +| MASTER-9 (base) | 47 | 5.2 | 4.23 | 4.7 | 4.33 | +| **MASTER + 6 pairs (15)** | **71** | 5.7 | **5.93** | **2.3** | **7.71** | +| MASTER esteso +TSM01 (16) | 67 | 5.4 | 5.95 | **2.2** | 7.67 | + +Aggiungere i 6 pairs porta l'**OOS DD a 2.2-2.3%** (da 4.7%) con Sharpe OOS ~7.7 e tutti +gli anni positivi: il guadagno di diversificazione da fonti market-neutral scorrelate. + ## File creati (branch strategy_explore) `scripts/analysis/explore_lab.py` (harness onesto condiviso), `pairs_research.py` diff --git a/scripts/analysis/combine_v2.py b/scripts/analysis/combine_v2.py index 0bf75c0..8693770 100644 --- a/scripts/analysis/combine_v2.py +++ b/scripts/analysis/combine_v2.py @@ -34,10 +34,11 @@ def main(): print("Costruzione equity (puo' richiedere ~1-2 min)...\n") S = build_all_sleeves() # 9 sleeve esistenti - # nuove sleeve + # nuove sleeve: i 6 pairs robusti di PR01 + TSM01 + from scripts.strategies.PR01_pairs_reversion import PAIRS new = {} - for a, b in [("ETH", "BTC"), ("LTC", "ETH"), ("ADA", "ETH")]: - r = pairs_sim(a, b, n=50, z_in=2.0, z_exit=0.5, max_bars=72) + for a, b, p in PAIRS: + r = pairs_sim(a, b, **p) new[f"PR_{a}{b}"] = daily_from(r["eq_ts"], r["eq_v"]) t = tsmom_sim() new["TSM01"] = daily_from(t["eq_ts"], t["eq_v"]) @@ -70,10 +71,11 @@ def main(): print(f" {'portafoglio':<26s}{'Ret%':>9s}{'CAGR':>7s}{'DD%':>7s}{'Shrp':>7s}" f" | {'oRet%':>9s}{'oDD%':>7s}{'oShrp':>7s}") print(" " + "-" * 92) - line("MASTER-9 (base)", S) - line("MASTER +pairs (12)", {**S, **{k: v for k, v in new.items() if k.startswith('PR_')}}) - line("MASTER +TSM01 (10)", {**S, "TSM01": new["TSM01"]}) - pr_all = line("MASTER-esteso (13)", allS) + pairs_only = {k: v for k, v in new.items() if k.startswith('PR_')} + line(f"MASTER-9 (base)", S) + line(f"MASTER +pairs ({len(S)+len(pairs_only)})", {**S, **pairs_only}) + line(f"MASTER +TSM01 ({len(S)+1})", {**S, "TSM01": new["TSM01"]}) + pr_all = line(f"MASTER-esteso ({len(allS)})", allS) print(" " + "-" * 92) pa = yearly_returns(pr_all) print(" MASTER-esteso per-anno: " + " ".join(f"{y}:{v:+.0f}%" for y, v in pa.items())) diff --git a/scripts/strategies/PR01_pairs_reversion.py b/scripts/strategies/PR01_pairs_reversion.py index 81ffb62..79f476b 100644 --- a/scripts/strategies/PR01_pairs_reversion.py +++ b/scripts/strategies/PR01_pairs_reversion.py @@ -34,8 +34,16 @@ sys.path.insert(0, str(PROJECT_ROOT)) from scripts.analysis.pairs_research import pairs_sim, OOS_FRAC # noqa: E402 -PAIRS = [("ETH", "BTC"), ("LTC", "ETH"), ("ADA", "ETH")] -PARAMS = dict(n=50, z_in=2.0, z_exit=0.5, max_bars=72) +# Coppie robuste (config migliore per ognuna). Sempre alt-liquido vs major (mai alt/alt). +# Le prime 3 dal primo lotto; BTC/LTC (anche 4h), ETH/SOL, BNB/ETH dall'espansione. +PAIRS = [ + ("ETH", "BTC", dict(n=50, z_in=2.0, z_exit=0.5, max_bars=72)), + ("LTC", "ETH", dict(n=50, z_in=2.0, z_exit=0.5, max_bars=72)), + ("ADA", "ETH", dict(n=50, z_in=2.0, z_exit=0.5, max_bars=72)), + ("BTC", "LTC", dict(n=50, z_in=2.0, z_exit=0.5, max_bars=72)), # NUOVA: robusta 1h E 4h + ("ETH", "SOL", dict(n=50, z_in=2.0, z_exit=1.0, max_bars=72)), # NUOVA: solo 1h + ("BNB", "ETH", dict(n=30, z_in=2.0, z_exit=1.0, max_bars=72)), # NUOVA: solo 1h +] def run(): @@ -43,13 +51,14 @@ def run(): print(" PR01 — PAIRS spread reversion (market-neutral) | netto fee 0.20% RT/coppia, leva 3x") print("=" * 92) print(f" {'coppia':<10s}{'trd':>5s}{'win%':>6s}{'CAGR%':>7s}{'OOS DD%':>8s}{'DD%':>6s}{'Shrp':>6s}{'anni+':>7s}") - for a, b in PAIRS: - f = pairs_sim(a, b, **PARAMS) - o = pairs_sim(a, b, **PARAMS, split_frac=1 - OOS_FRAC) + for a, b, p in PAIRS: + f = pairs_sim(a, b, **p) + o = pairs_sim(a, b, **p, split_frac=1 - OOS_FRAC) yrs = f["yearly"]; pos_y = sum(1 for v in yrs.values() if v > 0) print(f" {a+'/'+b:<10s}{f['trades']:>5d}{f['win']:>6.1f}{f['cagr']:>7.0f}{o['dd']:>8.0f}" f"{f['dd']:>6.0f}{f['sharpe']:>6.2f}{f'{pos_y}/{len(yrs)}':>7s}") - print("\n Market-neutral (corr ~0.02 col mercato) -> ottimo diversificatore di portafoglio.") + print("\n Market-neutral (corr ~0.02-0.08 col mercato) -> ottimo diversificatore di portafoglio.") + print(" Pattern: solo alt-liquido vs major (BTC/ETH); alt-vs-alt e' rumore.") print(" NB: 2 gambe (long A / short B), fee doppie. Worker live da estendere prima del live.")