Files
PythagorasGoal/CLAUDE.md
T
Adriano Dal Pastro 14522262e6 chore(reset): v2.0.0 — storico certificato Deribit mainnet, ripartenza pulita
Reset del progetto su fondamenta verificate dopo la scoperta che l'intera
libreria "validata OOS" era artefatto di feed contaminato (print fantasma del
feed Cerbero TESTNET + storico Binance/USDT).

- Storico ricostruito da Deribit MAINNET (ccxt pubblico, tokenless) e
  CERTIFICATO (certify_feed.py): BTC/ETH puliti su TUTTA la storia
  (mediana 2-6 bps vs Coinbase USD), integrita' OHLC + coerenza resample
  (maxΔ 0.00) + cross-venue OK. Alt esclusi (illiquidi/divergenti: LTC/DOGE
  50-82% barre flat; XRP/BNB non certificabili).
- Verdetto sul feed pulito: FADE / PAIRS / XS01 / TSM01 morti (ogni
  portafoglio Sharpe -2.3..-3.0, DD ~40%); solo SH01 e frammenti HONEST
  con segnale residuo, da ri-validare in isolamento.
- Cleanup "restart pulito": strategie, stack live (src/live, src/portfolio,
  runner/executor, yml, docker), ~100 script ricerca/gate, waste/games/
  portfolios, dati non certificati + cache e 60+ diari -> archiviati in Old/
  (preservati, non cancellati). Diario consolidato in un unico documento.
- Skeleton ricerca tenuto: Strategy ABC + indicatori + src/fractal +
  src/backtest/engine + load_data; tool dati certificati (rebuild_history,
  certify_feed, audit_feed, multi_source_check).
- Universo dati ATTIVO: solo BTC/ETH (5m/15m/1h); guardrail fisico
  (load_data su alt -> FileNotFoundError). Esecuzione DISABILITATA, conto flat.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:20:59 +00:00

8.2 KiB
Raw Permalink Blame History

PythagorasGoal — Istruzioni per agenti

Stato del progetto — v2.0.0 RESET (2026-06-19)

LEGGERE PRIMA DI TUTTO. Il progetto è stato resettato dopo aver scoperto che l'intera libreria di strategie "validata OOS" (FADE, PAIRS, DIP01, TR01, ROT02, TSM01, XS01, SH01) era artefatto di uno storico contaminato — print fantasma del feed Cerbero testnet + storico Binance/USDT. Ri-testate sul feed reale, tutte perdono ogni anno (vedi docs/diary/2026-06-19-deribit-history.md, il documento di fondazione).

Cosa è cambiato:

  • Lo storico è stato ricostruito da Deribit mainnet e certificato. Universo affidabile = solo BTC/ETH (tutti i TF). Gli alt sono esclusi (illiquidi/divergenti/non certificabili).
  • Tutto il codice vecchio (strategie, stack live, ~100 script di ricerca/gate, dati non certificati, 60+ diari) è archiviato in Old/ (preservato in git, non cancellato).
  • L'esecuzione è DISABILITATA, il conto mainnet è flat. Non c'è trading live attivo.
  • Si riparte dalla ricerca di strategie NUOVE, su dati certi, con la metodologia qui sotto.

Obiettivo

Ricerca: riconoscimento pattern frattali per trading algoritmico su crypto. Target dichiarato €50/giorno partendo da €1.000. Onestà prima di tutto: nessun numero va creduto finché non è netto fee, out-of-sample, robusto su griglia, e su dati certificati + liquidi + eseguibili.

Stack

  • Linguaggio: Python 3.11+ — Package manager: uv (pyproject.toml, uv.lock)
  • Dati: Parquet in data/raw/ (gitignored). Solo BTC/ETH (5m/15m/1h).
  • Analisi/ML: numpy, pandas, scipy, scikit-learn
  • Fonte dati storici: Deribit mainnet via ccxt (pubblico, tokenless)

Struttura (post-reset)

src/data/downloader.py     → load_data(asset, tf): legge i parquet certificati da data/raw/
src/strategies/base.py     → Strategy (ABC), Signal, BacktestResult, YearlyStats
src/strategies/indicators.py → indicatori condivisi (ema, atr, keltner, ...)
src/fractal/               → indicatori frattali (patterns.py, indicators.py, similarity.py)
src/backtest/engine.py     → engine di backtesting riusabile
src/version.py             → APP_VERSION (legge il file VERSION)
scripts/analysis/          → SOLO i tool dati certificati:
  rebuild_history.py        → (ri)costruisce lo storico da Deribit mainnet (base 5m + resample)
  certify_feed.py           → certifica il feed (integrità, coerenza resample, spike, cross-venue)
  audit_feed.py             → audit per-barra vs riferimento esterno
  multi_source_check.py     → cross-check multi-venue (quale venue è "vero")
data/raw/                  → btc/eth × {5m,15m,1h} (gitignored). UNICO dato attivo.
data/instruments_registry.json → registry strumenti (reference)
docs/diary/                → diario di ricerca (1 voce: il reset; aggiungere dopo ogni esperimento)
Old/                       → ARCHIVIO: tutto il vecchio (strategie, live, ricerca, dati, diari)
VERSION                    → semver (2.0.0)

Comandi

uv sync                                                       # installa dipendenze
uv run python scripts/analysis/rebuild_history.py --asset BTC ETH   # (ri)costruisci storico da Deribit mainnet
uv run python scripts/analysis/certify_feed.py                # certifica i feed (locale + cross-venue)
uv run python scripts/analysis/certify_feed.py --local        # solo check locali (veloce)
uv run pytest                                                 # test (da ripopolare con le nuove strategie)
from src.data.downloader import load_data
df = load_data("BTC", "1h")   # OK. load_data("SOL", ...) -> FileNotFoundError (guardrail: solo dati certi)

IL DATO — fonte di verità (regola di prim'ordine)

  • La verità è Deribit mainnet, perché è dove (in futuro) eseguiamo. Cross-check multi-venue: Deribit mainnet è a 0-1 bps dal consenso. Binance NON è la verità (è USDT, ~10 bps fuori, e sotto depeg USDT fino al 3% off) → usare Binance/Coinbase SOLO come audit indipendente, mai come ancora per "ripulire" i dati.
  • Aggiornare lo storico SOLO con rebuild_history.py (ccxt Deribit mainnet, base 5m unica + resample → coerenza interna garantita). MAI il vecchio downloader Cerbero (token testnet = feed farlocco: è la causa della contaminazione).
  • Certificare sempre dopo un rebuild con certify_feed.py (integrità OHLC, zero gap, coerenza resample maxΔ≈0, spike = solo crash reali, accordo cross-venue per-anno vs Coinbase USD).

Universo ricercabile certificato

  • BTC / ETH: puliti (2-6 bps vs Coinbase USD su tutta la storia), liquidi (~0% barre flat a 1h), storia lunga (2018/2019→oggi) → ogni timeframe (5m/15m/1h). È l'unico dato in data/raw.
  • Alt (SOL/XRP/ADA/LTC/DOGE/BNB): FUORI. Illiquidi (LTC 5m 82% barre flat O=H=L=C, run fino a ~3 giorni), divergenti (LTC/DOGE >1% su 10-21% delle barre 2022-23), o non certificabili (XRP delistato da Coinbase per causa SEC; BNB non listato + storia da 2024-10). Sono archiviati in Old/data/raw. Riammetterne uno richiede prima una ricertificazione che dimostri liquidità + accordo.

Metodologia obbligatoria per ogni nuova strategia

  1. Ingresso eseguibile: direzione e prezzo decisi con dati fino a close[i], mai close[i-1] con direzione presa da i; mai entry sull'estremo (high/low) di una candela.
  2. Backtest NETTO dopo fee realistiche Deribit (0.10% RT taker; maker ~0%) + leva.
  3. Out-of-sample held-out + robustezza su griglia parametri (entrambi gli asset, tutte le celle positive) + sweep fee (0.00-0.20% RT, margine ampio).
  4. Liquidità & plausibilità (lezione v2.0.0): incrociare ogni edge con la liquidità reale del book (quota di barre flat) e con la plausibilità del prezzo (cross-venue). Un edge full+OOS robusto su un book fermo o su wick fantasma NON è un edge.
  5. Strategia in scripts/strategies/ (codice univoco), test in tests/, diario aggiornato.

Lezioni critiche (da NON ripetere — la storia di questo progetto)

  • Feed contaminato → libreria fasulla (v2.0.0). Print fantasma testnet + Binance/USDT hanno prodotto edge inesistenti (+201%/+1238%/+16492% "OOS"). Tutti spariti sul feed reale. Lezione: il dato viene prima della strategia; certificare sempre.
  • Look-ahead squeeze (storico). L'intera famiglia squeeze-breakout aveva accuratezze 76-82% che erano artefatto: decideva la direzione con la candela di breakout i ma entrava a close[i-1]. Con ingresso onesto: lancio di moneta. (Dettagli nei diari in Old/.)
  • Entry sugli estremi di candela. Strategie che entrano a close quando close è all'estremo del range (≤0.1% o ≥99.9%) gonfiano i ritorni in modo irrealistico (ETH 2024: +30.848% → +2.725% rimuovendoli). Spesso è un artefatto di dato o di entry non eseguibile.
  • Mean-reversion vs breakout. Sui dati storici l'unica direzione che mostrava edge era la mean-reversion (i breakout rientrano) — MA anche quegli edge erano per lo più artefatto del feed: da riverificare da zero su dati certi.
  • Fee = vincolo di prim'ordine. 0.10% RT baseline. Molte operazioni = morte per fee.
  • Leva: testare 3x; 5x raddoppia il drawdown. I numeri a leva alta NON sono il caso base.
  • Data leakage con rendimenti log: returns[k] = log(close[k+1]/close[k]) usa close[k+1]. I feature devono fermarsi a returns[i-2] se il prezzo corrente è close[i-1]. Verificare SEMPRE.

Convenzioni

  • Strategie in scripts/strategies/ con codice univoco; scartate documentate nel diario.
  • Diario in docs/diary/YYYY-MM-DD.md, aggiornato dopo ogni esperimento significativo.
  • Nessun segreto nei commit (token/chiavi). .env e .env.mainnet sono gitignored.
  • Versionamento: VERSION (semver) + scripts/bump_version.py. src/version.py lo legge.

Archivio Old/

Tutto il lavoro pre-reset (preservato in git per consultazione storica): strategie (Old/scripts/strategies), stack live e portafogli (Old/src/live, Old/src/portfolio, Old/scripts/portfolios), ricerca/gate (Old/scripts/analysis), dati non certificati (Old/data), 60+ diari (Old/docs/diary), test (Old/tests). Consultabile come riferimento ("come facevamo X"), ma nessun edge lì dentro è fidato finché non è ri-validato su dati certi.