7226946911
Giro di validazione scettica (walk-forward, plateau, stress, scomposizione): - PAIRS: config PER-COPPIA -> config UNIVERSALE (n50 z2 zx0.75 mb72), niente cherry-picking. Plateau confermato (heatmap 20/20 Sharpe>1) + walk-forward (ETH/BTC 11/12 finestre+, BTC/LTC 9/10). Scartata BNB/ETH (overfit). 5 coppie robuste. - TSM01: gross 0.45->0.30 (stesso Sharpe, DD 22->15%); corr reale con ROT02 = 0.62 (non 0.53); diversificatore, non motore. Robusto (36/36 config OOS+). - Confluenza multi-TF SCARTATA: overfit (taglia 97% trade, ~40 in 8 anni, Sharpe crolla). - MASTER: numeri sobri onesti -> OOS Sharpe 7.7/DD 2.3% e' regime calmo 2024-25 (ottimistico ~50%); worst-DD 90g ~6%, Sharpe atteso ~5, regge leva 2x+slippage. Config robusta: equal-weight, leva 2x, cap pairs ~30-35% (sono ~57% del rischio). Quanto trovato regge l'esame anti-overfit; numeri comunicati sobri. Doc/CLAUDE/memoria aggiornati. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
79 lines
4.1 KiB
Python
79 lines
4.1 KiB
Python
"""PR01 — Pairs / Spread Mean-Reversion fra cripto (market-neutral). FAMIGLIA NUOVA.
|
|
|
|
Distinta da tutto l'esistente (single-asset direzionale): scommette sul RIENTRO del
|
|
log-ratio di due cripto verso la sua media. Market-neutral (long A / short B) ->
|
|
correlazione ~0.02 col mercato -> diversificatore prezioso.
|
|
|
|
Logica (engine onesto verificato in scripts/analysis/pairs_research.py):
|
|
r[i] = log(closeA[i]/closeB[i]); z[i] = (r[i]-SMA_n(r)[i]) / STD_n(r)[i] (causale)
|
|
z <= -z_in -> LONG ratio (long A / short B)
|
|
z >= +z_in -> SHORT ratio (short A / long B)
|
|
EXIT: |z| <= z_exit (rientro) o time-limit max_bars. Ingresso/uscita a close.
|
|
Fee su 2 GAMBE = 2*fee_rt*lev (0.20% RT/coppia). Filtro candele sporche (salto>8%).
|
|
|
|
Validazione anti-overfit (netto, fee 0.20% RT/coppia a 2 gambe, leva 3x, OOS = ultimo
|
|
30%, CONFIG UNIVERSALE n=50 z_in=2.0 z_exit=0.75 max_bars=72, 1h):
|
|
ETH/BTC : CAGR 158% / Sharpe 4.36 / 8/9 anni+ (regge fee 6x)
|
|
LTC/ETH : CAGR 92% / Sharpe 3.08 / 8/8 anni+
|
|
ADA/ETH : CAGR 91% / Sharpe 2.69 / 7/8 anni+
|
|
BTC/LTC : CAGR 60% / Sharpe 2.36 / 7/8 anni+ (robusta anche a 4h)
|
|
ETH/SOL : CAGR 74% / Sharpe 1.96 / 5/7 anni+ (la piu' debole, DD ~63%)
|
|
- No look-ahead verificato (z[i] invariato perturbando il futuro).
|
|
- PLATEAU non picco: heatmap n x z_in -> 20/20 celle Sharpe>1 (ETH/BTC, BTC/LTC).
|
|
- WALK-FORWARD (rolling train 2y / test 6m): ETH/BTC 11/12 finestre positive,
|
|
BTC/LTC 9/10 -> edge distribuito su tutta la storia, non un regime singolo.
|
|
- Stress costi: 5/6 reggono fee+slippage realistici; solo ETH/BTC regge fee 6x.
|
|
- Correlazione con BTC daily ~0.02-0.08 -> market-neutral.
|
|
- SCARTATA BNB/ETH: robusta solo coi suoi parametri (overfit), crolla con la universale.
|
|
|
|
LIMITE OPERATIVO: e' una strategia a 2 gambe (long un perp + short l'altro), il worker
|
|
attuale e' single-leg. Per tradarla serve: (a) eseguibilita' short del perp B su
|
|
Deribit/Bybit, (b) gestione 2 ordini + fee doppie. Finche' il worker non supporta
|
|
2 gambe, PR01 resta validata in backtest ma non wired nel paper trader.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
PROJECT_ROOT = Path(__file__).resolve().parents[2]
|
|
sys.path.insert(0, str(PROJECT_ROOT))
|
|
|
|
from scripts.analysis.pairs_research import pairs_sim, OOS_FRAC # noqa: E402
|
|
|
|
# CONFIG UNIVERSALE (anti-overfit): un'unica terna per TUTTE le coppie, niente
|
|
# cherry-picking per-coppia. Validata come ALTOPIANO (heatmap n x z_in: 20/20 celle
|
|
# Sharpe>1 su ETH/BTC e BTC/LTC) e walk-forward (ETH/BTC 11/12 finestre+, BTC/LTC 9/10).
|
|
UNIV = dict(n=50, z_in=2.0, z_exit=0.75, max_bars=72)
|
|
|
|
# Coppie robuste con la config universale. Sempre alt-liquido vs major (mai alt/alt).
|
|
# BNB/ETH SCARTATA: era robusta solo coi suoi parametri (n=30, z_exit=1.0) -> overfit;
|
|
# con la config universale crolla (Sharpe 1.5, DD 71%) ed e' la prima a morire allo stress costi.
|
|
PAIRS = [
|
|
("ETH", "BTC", UNIV), # la migliore (Sharpe 4.4 univ), regge fee 6x
|
|
("LTC", "ETH", UNIV),
|
|
("ADA", "ETH", UNIV),
|
|
("BTC", "LTC", UNIV), # robusta anche a 4h
|
|
("ETH", "SOL", UNIV), # piu' debole (DD ~63%, storia SOL corta) -> peso ridotto
|
|
]
|
|
|
|
|
|
def run():
|
|
print("=" * 92)
|
|
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, 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-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.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
run()
|