feat(data): discovery + validazione strumenti con gate nel downloader

src/data/instruments.py: enumera i perpetui per exchange (Deribit, Hyperliquid;
esclusi Alpaca/stocks e Bybit per feed testnet farlocco) e valida ogni strumento
sui DATI STORICI realmente raccoglibili:
  - esistenza, congruenza OHLC, not-flat (scarta contratti morti)
  - liquidita' (volume daily) e congruenza prezzo cross-exchange via mediana
    del base-coin (scarta outlier come Deribit SOL-PERPETUAL=9.6 vs SOL ~82)
Produce data/instruments_registry.json con strumenti validi, timeframe e start-date.

Gate: _download_cerbero_range rifiuta strumenti non validati (override esplicito
allow_unvalidated). La raccolta dati e' possibile solo per strumenti validati.

Registry attuale (testnet): Deribit 18/106 validi (BTC dal 2018, alt dal 2022),
Hyperliquid 66/74. I major liquidi (BTC,ETH,SOL,LTC,ADA,XRP,DOGE,AVAX,BNB,...) passano.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Adriano Dal Pastro
2026-05-29 07:49:57 +00:00
parent 9a066eb76f
commit 1561005d41
3 changed files with 2457 additions and 1 deletions
+12 -1
View File
@@ -69,8 +69,19 @@ def _fetch_binance(symbol: str, tf: str, since_ms: int, limit: int = 1000) -> li
def _download_cerbero_range(
instrument: str, resolution: str, tf: str, start_date: str, end_date: str
instrument: str, resolution: str, tf: str, start_date: str, end_date: str,
allow_unvalidated: bool = False,
) -> pd.DataFrame:
# Gate: si raccolgono dati SOLO per strumenti validati nel registry.
# Esegui `python -m src.data.instruments` per (ri)costruirlo.
if not allow_unvalidated:
from src.data.instruments import is_validated
if not is_validated(instrument, tf, "deribit"):
raise ValueError(
f"Strumento non validato: {instrument} @ {tf}. "
f"Costruisci il registry (python -m src.data.instruments) o passa "
f"allow_unvalidated=True per forzare."
)
all_candles: list[dict] = []
max_days = MAX_DAYS_PER_REQUEST[tf]
current = datetime.fromisoformat(start_date)