feat(explore): 3a ondata - PAIRS a 6 coppie + verdetti su 4 nuove famiglie
Espansione dei meccanismi provati + 2 nuovi sondaggi (agenti paralleli, honest): - PAIRS espansa a 6 coppie robuste: + BTC/LTC (robusta 1h E 4h, Sharpe 2.21, DD 24-34%), ETH/SOL e BNB/ETH (Sharpe 2.4+, solo 1h). Pattern: alt-liquido vs major. - Fade su 6 alt: 0 robuste (mean-reversion vive solo su BTC/ETH; DOGE = artefatto). - Low-vol anomaly: invertita in cripto (vince alta vol), ridondante -> scartata. - Confluenza multi-TF: dimezza il DD di MR01 (ETH same Sharpe a DD 38% vs 63%) -> variante low-DD utile, non edge nuovo. MASTER + 6 pairs (15 sleeve): CAGR 47->71%, OOS DD 4.7->2.3%, Sharpe OOS 4.33->7.71, tutti gli anni positivi. Bilancio robusti: famiglia PAIRS (6) + TSM01 = 7 strategie nuove. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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`.
|
||||
|
||||
@@ -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`
|
||||
|
||||
@@ -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()))
|
||||
|
||||
@@ -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.")
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user