# PythagorasGoal Sistema di riconoscimento pattern frattali e predizione per il trading di criptovalute (BTC, ETH), ispirato al framework teorico di Serleto & Malanga (*Pythagoras Trading Prediction*). ## Obiettivo Partendo da un capitale iniziale di €1.000, raggiungere un profitto medio di €50 al giorno entro 6–8 mesi, tramite strategie algoritmiche che combinano analisi frattale, squeeze di volatilità e machine learning. ## Risultati Oltre 30 strategie testate su dati storici 2018–2026 (BTC e ETH, timeframe 15m / 1h). Le migliori: | Codice | Strategia | Accuracy | Trades | Max DD | €/giorno | Robustezza | |--------|-----------|----------|--------|--------|----------|------------| | SQ02 | Antifake+Vol BTC 15m | **79.7%** | 1250 | 6.5% | €5.23 | ✅ 9/9 anni | | ML01 | Squeeze+GBM BTC 15m | 79.1% | 1929 | 5.5% | €8.45 | ✅ 5/5 anni | | SQ02 | Antifake+Vol ETH 15m | 78.6% | 942 | 3.4% | €4.33 | 8/9 anni | | SQ02 | Antifake+Vol BTC 1h | 78.0% | 473 | 3.5% | €3.85 | ✅ 9/9 anni | | SQ01 | Squeeze Base ETH 15m | 76.4% | 2948 | 6.2% | €10.31 | 9/9 anni | | ML01 | Squeeze+GBM ETH 15m | 76.7% | 1210 | 4.2% | €11.12 | 5/5 anni | La strategia più robusta (SQ02 BTC 15m) mantiene accuracy ≥73% ogni anno dal 2018 con Sharpe 5.01. ## Come funziona ### Volatility Squeeze Breakout Il meccanismo centrale sfrutta i cicli naturali di compressione ed espansione della volatilità: 1. **Compressione** — le Bollinger Bands entrano dentro i Keltner Channel (il prezzo si muove sempre meno, accumulando "energia"). 2. **Breakout** — le bande escono dal canale. Un impulso direzionale parte. 3. **Filtri** — anti-fakeout (scarta breakout con retrace >60%) + volume confirmation (breakout >1.3× media). 4. **ML opzionale** — un modello GradientBoosting (GBM), addestrato walk-forward su feature strutturali, conferma la direzione e filtra i segnali deboli. ### Feature ML (44 dimensioni) - Rapporti body/shadow normalizzati su finestre multiple (12, 24, 48 candele) - Momentum, volatilità, skewness, kurtosis dei rendimenti logaritmici - Autocorrelazione lag-1 e profilo volumetrico - Durata della fase di squeeze e rapporto di espansione Keltner - Posizione del prezzo rispetto al range recente e ATR normalizzato ## Struttura progetto ``` PythagorasGoal/ ├── src/ │ ├── data/ # Download e gestione dati (Cerbero MCP + Binance) │ ├── fractal/ # Indicatori frattali: Hurst, Higuchi FD, self-similarity │ ├── backtest/ # Motore di backtesting con fee e metriche │ ├── strategies/ # Classe base Strategy ABC + indicatori condivisi │ │ ├── base.py # Strategy, Signal, BacktestResult, YearlyStats │ │ └── indicators.py # keltner_ratio, detect_squeezes, ema, atr, rv, corr │ └── live/ # Paper trading live su Deribit testnet │ ├── multi_runner.py # Orchestratore multi-strategia │ ├── strategy_worker.py # Worker indipendente con stato persistente │ ├── strategy_loader.py # Import dinamico classi Strategy │ ├── cerbero_client.py # Client HTTP per Cerbero MCP │ ├── signal_engine.py # Squeeze + ML real-time (per ML01) │ └── telegram_notifier.py ├── scripts/ │ ├── strategies/ # Strategie attive (SQ01-SQ04, ML01) │ ├── waste/ # Strategie scartate (W01-W22) │ └── analysis/ # Script di confronto e report ├── strategies.yml # Config multi-strategy paper trader ├── data/ │ └── raw/ # Parquet OHLCV (gitignored, ~70 MB) ├── docs/ │ ├── diary/ # Diario di ricerca giornaliero │ └── specs/ # Specifiche di design ├── Dockerfile ├── docker-compose.yml └── pyproject.toml ``` ## Strategie attive Tutte le strategie estendono `src.strategies.base.Strategy` con interfaccia comune: `generate_signals() → backtest() → report()`. | Codice | Script | Tipo | Descrizione | |--------|--------|------|-------------| | SQ01 | `SQ01_squeeze_base.py` | Regole | Squeeze breakout puro | | SQ02 | `SQ02_squeeze_antifake_vol.py` | Regole | Squeeze + antifakeout + volume confirm | | SQ03 | `SQ03_squeeze_all_filters.py` | Regole | Squeeze + filtri selezionabili (9 preset) | | SQ04 | `SQ04_squeeze_ultimate.py` | Regole | Combo incrementali con correlazione/trend | | ML01 | `ML01_squeeze_gbm.py` | ML | Squeeze + GBM walk-forward | Per eseguire il backtest di una strategia: ```bash uv run python scripts/strategies/SQ02_squeeze_antifake_vol.py ``` ## Paper Trading Live Il multi-strategy runner esegue N strategie in parallelo su dati live da Cerbero MCP, ognuna con €1000 USDC virtuali indipendenti. ### Avvio ```bash # Locale uv run python -m src.live.multi_runner # Docker docker compose up -d ``` ### Configurazione Le strategie attive sono definite in `strategies.yml`: ```yaml defaults: capital: 1000 position_size: 0.15 leverage: 3 strategies: - name: SQ02_antifake_vol asset: BTC tf: 15m enabled: true ``` Per aggiungere una strategia: nuova riga in `strategies.yml`, poi `docker compose restart`. Lo storico delle strategie esistenti rimane intatto. ### Persistenza Ogni strategia ha la sua directory in `data/paper_trades/`: ``` data/paper_trades/ SQ02_antifake_vol__BTC__15m/ trades.jsonl # Storico trade append-only status.json # Stato corrente (resume al restart) ``` Notifiche Telegram per ogni trade (richiede `TELEGRAM_BOT_TOKEN` e `TELEGRAM_CHAT_ID` in `.env`). ## Setup ```bash # Clona e installa git clone && cd PythagorasGoal uv sync # Scarica dati storici (~70 MB) uv run python -m src.data.downloader # Backtest strategia migliore uv run python scripts/strategies/SQ02_squeeze_antifake_vol.py # Paper trading live uv run python -m src.live.multi_runner ``` ### Requisiti - Python ≥ 3.11 - [uv](https://docs.astral.sh/uv/) come package manager - Accesso a Cerbero MCP (`cerbero-mcp.tielogic.xyz`) per dati Deribit live - Docker (opzionale, per deploy su VPS) ## Dati | Asset | Timeframe | Candele | Copertura | |-------|-----------|---------|-----------| | BTC | 5m / 15m / 1h | 883K / 294K / 74K | 2018-01 → oggi | | ETH | 5m / 15m / 1h | 882K / 294K / 74K | 2018-01 → oggi | Fonte primaria: Deribit perpetual via Cerbero MCP. Fallback: Binance spot via ccxt. Formato: Apache Parquet. ## Riferimenti - Serleto, L. & Malanga, C. — *Pythagoras Trading Prediction* (2024) - Serleto, L. & Malanga, C. — *Libro dei Frattali* (2024) ## Licenza Uso privato. Non destinato alla distribuzione.