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>
8.2 KiB
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
- Ingresso eseguibile: direzione e prezzo decisi con dati fino a
close[i], maiclose[i-1]con direzione presa dai; mai entry sull'estremo (high/low) di una candela. - Backtest NETTO dopo fee realistiche Deribit (0.10% RT taker; maker ~0%) + leva.
- 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).
- 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.
- Strategia in
scripts/strategies/(codice univoco), test intests/, 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
ima entrava aclose[i-1]. Con ingresso onesto: lancio di moneta. (Dettagli nei diari inOld/.) - Entry sugli estremi di candela. Strategie che entrano a
closequandocloseè 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])usaclose[k+1]. I feature devono fermarsi areturns[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).
.enve.env.mainnetsono gitignored. - Versionamento:
VERSION(semver) +scripts/bump_version.py.src/version.pylo 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.