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>
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
# 2026-06-13 — Equity gonfiata dal ribilancio: +4.77 fantasma (causa + fix)
|
||||
|
||||
## Sintomo
|
||||
|
||||
Report "dall'ultimo reset": equity 2020.53 → 2025.80 (+5.27), ma un solo trade
|
||||
chiuso (MR02_BTC 15m, reale +0.50). Il +4.77 residuo è comparso di colpo a
|
||||
00:01:52 (primo poll dopo mezzanotte UTC = ribilancio giornaliero), senza alcuna
|
||||
chiusura dietro.
|
||||
|
||||
## Causa — doppio conteggio del capitale degli in-position al ribilancio
|
||||
|
||||
`rebalance_allocations` faceva:
|
||||
1. `total_capital = Σ capital di tutti i worker`
|
||||
2. `alloc[sid] = peso × total_capital` per OGNI sid
|
||||
3. ai worker in posizione NON applicava l'alloc (la posizione tiene il suo notional)
|
||||
4. ai flat: `capital = alloc[sid]`
|
||||
|
||||
`update_equity` (ogni poll) = Σ capital. Dopo il ribilancio la somma diventa:
|
||||
|
||||
Σcapital = Σ(peso_i × total) [flat] + Σ(capital_j) [in-pos]
|
||||
= total − Σalloc_j + Σcapital_j
|
||||
= total + Σ(capital_j − alloc_j) ← inflazione
|
||||
|
||||
Cioè i flat si dividevano l'INTERO total (che includeva anche il capitale degli
|
||||
in-position), e gli in-position lo tenevano in più → doppio conteggio.
|
||||
|
||||
Al ribilancio delle 00:01, **MR02_BTC 15m era in posizione** col capitale seedato
|
||||
**181.19** (eredità del gemello 1h, INIT_LINEAGE di ieri) mentre la sua allocazione
|
||||
era ~176.42 → **+4.77** di equity dal nulla. Lo scatenante è stato il seed (capitale
|
||||
ben sopra l'allocazione media) combinato con la posizione aperta al ribilancio; ma
|
||||
il bug era latente da sempre (ogni worker in-pos che devia dall'alloc gonfiava/sgonfiava
|
||||
l'equity al ribilancio successivo).
|
||||
|
||||
## Fix — conservazione (ledger.allocate `reserved`)
|
||||
|
||||
`allocate(weights, reserved={sid: capitale})`: i worker in posizione TRATTENGONO il
|
||||
loro capitale (deployato, non spostabile); i flat si dividono `total − Σreserved`
|
||||
per peso **rinormalizzato sui soli flat**. Così `Σalloc == total_capital` sempre →
|
||||
**l'equity è conservata dal ribilancio** (un ribilancio sposta capitale fra sleeve,
|
||||
non crea valore). `runner.rebalance_allocations` calcola `reserved` dai worker
|
||||
`in_position` e lo passa. Senza `reserved` (default) = comportamento storico
|
||||
(corretto solo a worker tutti flat, es. allocazione iniziale).
|
||||
Test: `tests/portfolio/test_ledger.py::test_alloc_conserves_total_with_reserved`.
|
||||
|
||||
## Correzione dello stato (rimozione del +4.77 già accumulato)
|
||||
|
||||
Equity riportata a **2021.03** = baseline post-seed verificata (2020.53) + unico
|
||||
trade reale (MR02_BTC 15m +0.50). Capitali dei worker del pool scalati ×
|
||||
(2021.03/2025.79) e peak del ledger resettato a 2021.03 (il 2025.80 non è mai
|
||||
stato un massimo legittimo → niente DD fantasma). L'orfano MR02_BTC 1h chiuso a
|
||||
parte (+0.85) resta sul worker ritirato, fuori dal pool.
|
||||
|
||||
## Esito
|
||||
|
||||
Equity = soldi veri: dal reset il trading ha prodotto **+0.50** (1 trade), non +5.27.
|
||||
Deploy con codice fixato (rebuild) così il prossimo ribilancio conserva.
|
||||
Reference in New Issue
Block a user