diff --git a/CLAUDE.md b/CLAUDE.md index 496ba5b..81f2f48 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -68,7 +68,7 @@ lorda massima 1,0x**, e nessun livello di capitale cambia il profilo di rischio 2 giorni (blocca) · `skh_feed_max_age_min` 30 (allerta, **non** blocca) · alert Telegram. 📌 **Dal 2026-08-26 l'equity del book e' il TOTALE cross-collateral** (USDC + USDE valutato -all'indice pubblico `usde_usdc`): il conto tiene **644 USDE** (**IDONEO** dal 28/08; portati da 500 a +all'indice pubblico `usde_usdc`): il conto tiene **643 USDE** (**IDONEO** dal 28/08; portati da 500 a 644 il 30/08 su decisione dell'operatore, **quota 31,21%** — e li' si e' fermato: 🚨 **il venue ha un TETTO sull'USDE** e ogni acquisto oltre quel livello e' rifiutato. GATE USDE-01 in §4). Autorita' dei parametri: sezione `usde` di `config/live.json` (haircut 10%, tetto ALLERTA quota 50%, soglie depeg 0,99/0,95 coi criteri in `_nota_usde`), letta @@ -172,7 +172,7 @@ sull'hold-out; cambiarne le soglie guardando l'esito, pure. | gate | data | criterio | stato | |---|---|---|---| -| **USDE-01 (eligibilita' reward)** | 2026-08-29 | ≥1 reward entro il 29/08 → IDONEO e si apre la decisione di QUOTA (dell'operatore; tetto allerta 50%, mai 100% — R1 emittente non recuperabile); zero → si riconverte e la pista si chiude | ✅ **CHIUSO IDONEO** il 2026-08-28 12:35Z: primo reward **+0,052055 USDE** rilevato per delta al netto dei trade, coi criteri pre-registrati il 26/08 PRIMA dell'esito. **QUOTA DECISA il 30/08** (l'operatore ha anticipato il rinvio: *"porta in usde tutto il capitale che non viene usato"*): bersaglio **70%**, `usde.quota_target` in config. Tasso a 4 finestre (30/08): **3,26% annuo, banda bootstrap [1,13% – 4,51%]** — 3/4 hanno pagato (0,00 · 3,80 · 4,51 · 4,51%), e la banda larga 3,4 punti **e' il risultato**: a n=4 il tasso non e' misurato. `usde_watch.rendimento()` lo stampa **col suo n**; `quota_da_decidere()` lo chiede ogni giorno da lunedi'. 🚨 **L'EV non puo' scegliere la quota** — e' lineare in q, quindi il suo argmax e' sempre un angolo (0% o 100%): ogni quota interna nasce da un criterio sulla **coda**, dichiarato non ottimizzato (M8). Il resto e' misurato (`r0830_usde_quota.py`, diario 30/08): **hazard di pareggio = l'APR** (EV-positiva sse Ethena sta sotto il 3,3%/anno, numero **assunto** come il `p` di Deribit) · l'haircut **non morde a nessuna quota** fino al 90%, nemmeno a leva 1,50x con USDE marcato a 0,95 (29× di cuscino): **il vincolo non e' il margine** · la resa di oggi vale **$16/anno**, meno di UN mese di versamento ⇒ la leva binding resta il **bonifico** · gia' a 24,2% l'evento emittente vale **3,1× il maxDD dell'intero libro**. 📌 **Aspettare costa $1,33**: alzare a 50% fra 4 settimane invece che subito lascia sul tavolo $1,33 di resa (conversione reversibile a ~6 bps) e porta il campione da **4 a 32 finestre**, stringendo la banda ~2,8×. 🚨 **DUE FATTI DEL 30/08 CHE CAMBIANO IL GATE** (diario `2026-08-30-usde-quota-tetto-venue`). **(a) TETTO DEL VENUE: la quota si ferma al 31,21%** (644,175691 USDE) e il 70% **non e' raggiungibile** — nemmeno il 50%. Provato a saldo neutro: BUY 20 rifiutato → SELL 20 OK → BUY 20 OK → BUY 5 rifiutato, con **$1.408 disponibili**. E' un tetto sul **livello**, non taglia/prezzo/liquidita'/cadenza; il messaggio del venue (`not_enough_funds_in_currency`) e' **fuorviante** e ha fatto inseguire tre ipotesi sbagliate. Formula non leggibile (debito #11: il gateway non espone book ne' `available_withdrawal_funds`). **(b) L'USDC NON frutta SUL NOSTRO CONTO — misurato, e la premessa del gate e' RESTAURATA.** `public/get_currencies` dice USDC 3,4000% (USDE 4,1071%) e per qualche ora quel numero e' stato scritto qui come se fosse nostro: **era un listino del venue, non un accredito**. Deribit paga i reward USDC **una volta al MESE** («paid out as a single monthly payment early in the following month», accrual 00:00 UTC sulla **minima equity**) — non ogni giorno come l'USDE, ed e' per questo che una sorveglianza giornaliera non poteva vederli. Verificato sui **due confini di mese a libro FLAT**, dove `equity == balance == USDC` e ogni scalino sarebbe un accredito: **29/06→08/07 equity 598,06 costante, 237/237 ore ferme, 0 scalini** (attesi $0,45) e **31/07→03/08 equity 596,92 costante per 4 giorni** (attesi **$1,72 contro una risoluzione di $0,01, 172×**). **Zero misurato, non zero sotto soglia.** ⇒ il guadagno di tenere USDE e' il **tasso pieno ~4,1%**, non uno spread: **~$26/anno** sui $644. Spiegazione plausibile e **non verificata** dell'esclusione: MiCA (USDC e' un e-money token, USDe no) — Deribit dice solo «eligibility […] is based on their location»; **il fatto misurato e' lo zero, non il suo motivo**. 📌 **Un tasso pubblicato non e' un tasso incassato: si verifica sul CONTO** — ed e' costato una query su una serie che avevamo gia'. Strumento: **`scripts/live/balance_watch.py`** + `cron_balance.sh` (orario :42, sola lettura) registra il **balance a 8 decimali**, la serie che mancava. 📌 **Il vincolo che l'analisi del margine non aveva guardato**: P&L e funding dei perp USDC-lineari **si regolano in USDC**, quindi la quota massima difendibile non e' data dall'haircut ma dal **cuscino di regolamento** = disaster-SL sulla massima esposizione lorda (`n_asset × frac × disaster_sl_pct` = **30% dell'equity**), che lascia esattamente il **70%** — coincidenza per costruzione, zero slack (M8: non e' un argmax). Attrezzo: **`scripts/live/usde_convert.py`** (dry-run di default, guardie proprie; NON passa da `execution.ALLOWED`, che resta ai soli due perp) | +| **USDE-01 (eligibilita' reward)** | 2026-08-29 | ≥1 reward entro il 29/08 → IDONEO e si apre la decisione di QUOTA (dell'operatore; tetto allerta 50%, mai 100% — R1 emittente non recuperabile); zero → si riconverte e la pista si chiude | ✅ **CHIUSO IDONEO** il 2026-08-28 12:35Z: primo reward **+0,052055 USDE** rilevato per delta al netto dei trade, coi criteri pre-registrati il 26/08 PRIMA dell'esito. **QUOTA DECISA il 30/08** (l'operatore ha anticipato il rinvio: *"porta in usde tutto il capitale che non viene usato"*): bersaglio **70%**, `usde.quota_target` in config. Tasso a 4 finestre (30/08): **3,26% annuo, banda bootstrap [1,13% – 4,51%]** — 3/4 hanno pagato (0,00 · 3,80 · 4,51 · 4,51%), e la banda larga 3,4 punti **e' il risultato**: a n=4 il tasso non e' misurato. `usde_watch.rendimento()` lo stampa **col suo n**; `quota_da_decidere()` lo chiede ogni giorno da lunedi'. 🚨 **L'EV non puo' scegliere la quota** — e' lineare in q, quindi il suo argmax e' sempre un angolo (0% o 100%): ogni quota interna nasce da un criterio sulla **coda**, dichiarato non ottimizzato (M8). Il resto e' misurato (`r0830_usde_quota.py`, diario 30/08): **hazard di pareggio = l'APR** (EV-positiva sse Ethena sta sotto il 3,3%/anno, numero **assunto** come il `p` di Deribit) · l'haircut **non morde a nessuna quota** fino al 90%, nemmeno a leva 1,50x con USDE marcato a 0,95 (29× di cuscino): **il vincolo non e' il margine** · la resa di oggi vale **$16/anno**, meno di UN mese di versamento ⇒ la leva binding resta il **bonifico** · gia' a 24,2% l'evento emittente vale **3,1× il maxDD dell'intero libro**. 📌 **Aspettare costa $1,33**: alzare a 50% fra 4 settimane invece che subito lascia sul tavolo $1,33 di resa (conversione reversibile a ~6 bps) e porta il campione da **4 a 32 finestre**, stringendo la banda ~2,8×. 🚨 **DUE FATTI DEL 30/08 CHE CAMBIANO IL GATE** (diario `2026-08-30-usde-quota-tetto-venue`). **(a) TETTO DEL VENUE ≈31,2% dell'equity — e' una FRAZIONE, non un livello.** Ogni acquisto oltre il tetto e' rifiutato con `not_enough_funds_in_currency` pur avendo **$1.400 disponibili**: messaggio **fuorviante**, che ha fatto inseguire tre ipotesi sbagliate (taglia, cadenza, prezzo). Che sia un tetto e non un problema d'ordine e' provato a saldo neutro (BUY rifiutato → SELL OK → BUY riaccettato → BUY rifiutato); che sia una **frazione** e' provato il 31/08 lasciando scendere l'equity di $8: **il tetto e' sceso con lei** — 30/08 in [644,18·645,18) con equity $2.063,79 = **31,21-31,26%**, 31/08 in [643,18·644,18) con equity $2.055,56 = **31,29-31,34%** (0,05pp di scarto, dentro il rumore dell'equity che oscilla ±$2-8/ora). ⇒ **il tetto SCALA col conto**: la quota resta ~31% e il valore in dollari cresce col capitale, ma **il 70% non e' raggiungibile ne' ora ne' mai**. 🚨 **Deribit non lo documenta**: l'articolo ufficiale *Yield/reward bearing coins* descrive un **Cap ETHENA** che diluisce il **TASSO** a livello di exchange (`User APR = min(bal_exchange, cap)/bal_exchange × Ethena APR`) e **nessun limite sulle quantita' detenibili** da un conto. Ora e' in config (`usde.venue_cap_frac` 0.312, bordo basso dei bracket) e `usde_convert` **rifiuta il piano prima di sparare** invece di scoprirlo dal venue. **(b) L'USDC NON frutta SUL NOSTRO CONTO — misurato, e la premessa del gate e' RESTAURATA.** `public/get_currencies` dice USDC 3,4000% (USDE 4,1071%) e per qualche ora quel numero e' stato scritto qui come se fosse nostro: **era un listino del venue, non un accredito**. Deribit paga i reward USDC **una volta al MESE** («paid out as a single monthly payment early in the following month», accrual 00:00 UTC sulla **minima equity**) — non ogni giorno come l'USDE, ed e' per questo che una sorveglianza giornaliera non poteva vederli. Verificato sui **due confini di mese a libro FLAT**, dove `equity == balance == USDC` e ogni scalino sarebbe un accredito: **29/06→08/07 equity 598,06 costante, 237/237 ore ferme, 0 scalini** (attesi $0,45) e **31/07→03/08 equity 596,92 costante per 4 giorni** (attesi **$1,72 contro una risoluzione di $0,01, 172×**). **Zero misurato, non zero sotto soglia.** ⇒ il guadagno di tenere USDE e' il **tasso pieno ~4,1%**, non uno spread: **~$26/anno** sui $644. 🚨 **Il motivo ora e' DOCUMENTATO, e non e' MiCA come avevo ipotizzato**: l'articolo ufficiale elenca le giurisdizioni escluse dai reward USDC e **l'ITALIA c'e'** (con Canada e Giappone: non e' una lista MiCA, e' policy di giurisdizione Deribit). ⚠️ **E la finestra di pagamento e' piu' larga di quella che avevo controllato**: «within the **first two weeks** of the following month». Rifatta la verifica sulle due settimane vere: **luglio e' conclusivo** (atteso $1,72 contro un'escursione TOTALE dell'equity di **$0,48** in 1-16/08, zero scalini compatibili), **giugno NO** (il libro ha iniziato a operare a meta' mese e il rumore e' della taglia del segnale). Quindi: **una finestra conclusiva piu' la lista ufficiale**, non due finestre — il «172× la risoluzione» del 30/08 era sovra-affermato. 📌 **Un tasso pubblicato non e' un tasso incassato: si verifica sul CONTO** — ed e' costato una query su una serie che avevamo gia'. Strumento: **`scripts/live/balance_watch.py`** + `cron_balance.sh` (orario :42, sola lettura) registra il **balance a 8 decimali**, la serie che mancava. 📌 **Il vincolo che l'analisi del margine non aveva guardato**: P&L e funding dei perp USDC-lineari **si regolano in USDC**, quindi la quota massima difendibile non e' data dall'haircut ma dal **cuscino di regolamento** = disaster-SL sulla massima esposizione lorda (`n_asset × frac × disaster_sl_pct` = **30% dell'equity**), che lascia esattamente il **70%** — coincidenza per costruzione, zero slack (M8: non e' un argmax). Attrezzo: **`scripts/live/usde_convert.py`** (dry-run di default, guardie proprie; NON passa da `execution.ALLOWED`, che resta ai soli due perp) | | **STATARB** | 2026-09-27 | soglie 24/07 (non toccate) + diagnostica statica sempre-short | ✅ monitor riparato e rigenerato il 26/08: la serie vera da' Sharpe **−1,61** a oggi → coi criteri invariati punta al **RITIRO**. Si legge il 27/09, non prima | | **XSR01** | 2026-10-23 | Sharpe ≥1,0 **E** haircut ≤40% — dal 26/08 il numero decisivo e' `r0826_xsr_haircut.py` a **pavimento $10**, citato con la frazione di ordini eseguiti — poi `weights_tilt_null` e **capitale ≥$20k** | ✅ **riscritto il 26/08 su decisione dell'operatore** (dichiarato prima dell'esito, stringe: diario `2026-08-26-xsr01-gate-riscritto`): capitale allineato a "100% Deribit fino a $20k"; serie forward rigenerata (31 barre vere, Sharpe −2,72). Sotto la lente RENDITA il sleeve resta **eguagliato da un conto remunerato** (📌 sotto) | | **DVOLSPREAD** | kill 2026-10-24 se Sh<−0,50; decisione 2027-01-24 | (a) Sharpe>0 (b) marginale ADDS+robust_oos+insample_edge (c) **DSR ≥0,95** (d) `weights_tilt_null`; **veto** se barre attive <80% → si estende, non si decide | ✅ serie rigenerata il 26/08 (−4,41 a oggi, era −14,73 sulla serie rotta); il veto barre-attive ora conta barre VERE e la guardia PREMATURO sorveglia il monitor | diff --git a/config/live.json b/config/live.json index b704b6e..748b3cc 100644 --- a/config/live.json +++ b/config/live.json @@ -10,11 +10,13 @@ "max_data_age_days": 2, "_nota_skh_feed": "Freschezza del feed 5m usato per il segnale SKH01 (2026-07-26). fresh_5m ricade sul feed certificato IN SILENZIO se il fetch pubblico Deribit fallisce, e il certificato si rigenera 1x/giorno: senza controllo la latenza d'uscita di SKH01 passa da ~1h a ~1 giorno senza segnalazione. Sopra soglia book_execute ALLERTA e NON blocca (bloccare fermerebbe anche TP01, nettato sullo stesso strumento, per un guasto di rete). Diario 2026-07-26-t1-esecuzione-skh-live.md.", "skh_feed_max_age_min": 30, - "_nota_usde": "Collaterale USDE a rendimento (test di eligibilita' 2026-08-26: 500 USDE, verdetto entro il 29/08 — diario 2026-08-26-usde-analisi). L'autorita' che LEGGE questa sezione e' src/live/usde.py; la usano shadow._collaterale_usde (equity oraria del book) e scripts/live/usde_watch.py (sorveglianza giornaliera 12:35 UTC). Criteri delle soglie, dichiarati (P6): depeg_warn 0.99 = fuori dalla banda operativa dello spot (~3 bps) e oltre il clamp +-0.5% per fonte dell'indice usde_usdc — a quel prezzo non e' rumore di book; depeg_crit 0.95 = meta' del buffer di haircut (10%) consumata. quota_target 0.70 = la quota DECISA dall'operatore il 2026-08-30 (la decisione di quota che il gate USDE-01 apriva; anticipata di un giorno sul rinvio al 31/08, su richiesta esplicita dell'operatore \"porta in usde tutto il capitale che non viene usato\"). Il 70% NON e' un argmax (M8): e' il massimo compatibile col CUSCINO DI REGOLAMENTO, cioe' il vincolo che r0830_usde_quota non aveva guardato — il P&L e il funding dei perp USDC-lineari si regolano in USDC, non nel collaterale, quindi a quota alta il saldo USDC va negativo alla prima perdita del libro e Deribit lo finanzia a interesse. Il cuscino richiesto e' il disaster-SL sulla massima esposizione lorda: n_asset x frac x disaster_sl_pct = 2 x 0.5 x 0.30 = 30% dell'equity, che lascia esattamente il 70%. quota_max_frac 0.50 = tetto di ALLERTA sulla quota USDE/equity totale (N4: la quota e' l'unica leva contro il rischio emittente, -100% = 25 anni di resa, non recuperabile). Alzato a 0.85 il 2026-08-30 in previsione della quota al 70% e RIMESSO A 0.50 lo stesso giorno: il 70% NON e' raggiungibile. 🚨 TETTO DEL VENUE SULL'USDE, misurato il 2026-08-30 e non documentato da nessuna parte: il conto si e' fermato a 644.175691 USDE (31,21% del totale) e ogni acquisto oltre quel livello viene rifiutato con `not_enough_funds_in_currency` AVENDO $1.408 disponibili. Provato a saldo neutro, quattro ordini di fila: BUY 20 rifiutato, SELL 20 accettato, BUY 20 riaccettato, BUY 5 rifiutato — e' un TETTO SUL LIVELLO, non un problema di taglia, prezzo, liquidita' o cadenza. La formula del tetto non e' leggibile da qui (`get_currencies` non espone un cap; il gateway non espone ne' il book ne' available_withdrawal_funds). Con la quota reale al 31% il tetto d'allerta 0.50 e' di nuovo quello giusto e MORDE: allargarlo a 0.85 avrebbe disarmato la guardia per uno scenario che non si e' verificato. Se il tetto del venue si alzera', il criterio per 0.85 e' 'meta' del cuscino di regolamento consumata' (USDC sotto il 15% dell'equity). haircut 0.10 verificato sul venue il 26/08 (USDC 0%): il 90% dell'USDE fa margine.", + "_nota_usde": "Collaterale USDE a rendimento (test di eligibilita' 2026-08-26: 500 USDE, verdetto entro il 29/08 — diario 2026-08-26-usde-analisi). L'autorita' che LEGGE questa sezione e' src/live/usde.py; la usano shadow._collaterale_usde (equity oraria del book) e scripts/live/usde_watch.py (sorveglianza giornaliera 12:35 UTC). Criteri delle soglie, dichiarati (P6): depeg_warn 0.99 = fuori dalla banda operativa dello spot (~3 bps) e oltre il clamp +-0.5% per fonte dell'indice usde_usdc — a quel prezzo non e' rumore di book; depeg_crit 0.95 = meta' del buffer di haircut (10%) consumata. quota_target 0.70 = la quota DECISA dall'operatore il 2026-08-30 (la decisione di quota che il gate USDE-01 apriva; anticipata di un giorno sul rinvio al 31/08, su richiesta esplicita dell'operatore \"porta in usde tutto il capitale che non viene usato\"). Il 70% NON e' un argmax (M8): e' il massimo compatibile col CUSCINO DI REGOLAMENTO, cioe' il vincolo che r0830_usde_quota non aveva guardato — il P&L e il funding dei perp USDC-lineari si regolano in USDC, non nel collaterale, quindi a quota alta il saldo USDC va negativo alla prima perdita del libro e Deribit lo finanzia a interesse. Il cuscino richiesto e' il disaster-SL sulla massima esposizione lorda: n_asset x frac x disaster_sl_pct = 2 x 0.5 x 0.30 = 30% dell'equity, che lascia esattamente il 70%. quota_max_frac 0.50 = tetto di ALLERTA sulla quota USDE/equity totale (N4: la quota e' l'unica leva contro il rischio emittente, -100% = 25 anni di resa, non recuperabile). Alzato a 0.85 il 2026-08-30 in previsione della quota al 70% e RIMESSO A 0.50 lo stesso giorno: il 70% NON e' raggiungibile. 🚨 venue_cap_frac 0.312 = TETTO DEL VENUE sull'USDE, misurato e NON documentato da Deribit (l'articolo ufficiale 'Yield/reward bearing coins' descrive un Cap ETHENA che diluisce il TASSO a livello di exchange, e nessun limite sulle quantita' detenibili da un conto). Ogni acquisto oltre il tetto e' rifiutato con `not_enough_funds_in_currency` pur avendo $1.400 disponibili: messaggio FUORVIANTE, non c'entrano fondi/taglia/prezzo/liquidita'/cadenza. E' una FRAZIONE DELL'EQUITY TOTALE, non un livello fisso — provato il 31/08 facendo scendere l'equity di $8: il tetto e' sceso con lei (30/08 in [644,18·645,18) con equity $2.063,79 = 31,21-31,26%; 31/08 in [643,18·644,18) con equity $2.055,56 = 31,29-31,34%; i due bracket distano 0,05pp, dentro il rumore dell'equity che oscilla +-$2-8/ora). ⇒ **il tetto SCALA col conto**: la quota resta ~31% e il valore in dollari cresce col capitale, e il 70% di quota_target NON e' raggiungibile ne' ora ne' mai. Il valore 0.312 e' il bordo BASSO dei bracket, scelto per far fallire il piano PRIMA dell'ordine invece che dopo il rifiuto; va ri-sondato se cambia qualcosa sul venue. Con la quota reale al 31% il tetto d'allerta 0.50 e' di nuovo quello giusto e MORDE: allargarlo a 0.85 avrebbe disarmato la guardia per uno scenario che non si e' verificato. Se il tetto del venue si alzera', il criterio per 0.85 e' 'meta' del cuscino di regolamento consumata' (USDC sotto il 15% dell'equity). haircut 0.10 verificato sul venue il 26/08 (USDC 0%): il 90% dell'USDE fa margine.", "usde": { "index_name": "usde_usdc", "haircut": 0.1, "quota_target": 0.7, + "venue_cap_frac": 0.312, + "venue_cap_misurato": "2026-08-31", "quota_max_frac": 0.5, "depeg_warn": 0.99, "depeg_crit": 0.95 diff --git a/docs/diary/2026-08-30-usde-quota-tetto-venue.md b/docs/diary/2026-08-30-usde-quota-tetto-venue.md index 430da90..aadaf30 100644 --- a/docs/diary/2026-08-30-usde-quota-tetto-venue.md +++ b/docs/diary/2026-08-30-usde-quota-tetto-venue.md @@ -211,3 +211,101 @@ sporca si riconosce invece di essere mediata dentro. Etichetta PULITA le finestr flat, dove il Δ USDC **è** l'interesse, e ne stampa l'APR implicita accanto a quella attesa. Serve a sorvegliare che lo zero resti zero (o che cambi, se l'idoneità cambia): l'inizio di settembre è il prossimo confine di mese, ed è già strumentato. + +--- + +# APPENDICE 2 (2026-08-31) — la fonte ufficiale: **due correzioni alle mie conclusioni** + +L'operatore ha passato l'articolo `support.deribit.com/.../Yield-reward-bearing-coins`. WebFetch lo +prende 403 (Cloudflare); si legge dall'**API Help Center** in JSON: +`support.deribit.com/api/v2/help_center/en-us/articles/31424939199261.json` → HTTP 200. +*Aggiornato dal venue il 2026-08-20.* Contiene tre cose che il progetto non sapeva. + +## 1. L'ITALIA è nella lista degli esclusi dai reward USDC — e non è MiCA + +> «The following jurisdictions are **not eligible** to receive USDC rewards: Austria, Belarus, +> Belgium, Bulgaria, Canada, […] **Italy**, Japan, […]» + +Lo zero misurato è **confermato dalla fonte**. Ma l'ipotesi che avevo scritto — MiCA, USDC è un +e-money token e USDe no — **è sbagliata**: la lista contiene Canada e Giappone, non è il perimetro +MiCA. È policy di giurisdizione di Deribit. *M27: una fonte normativa citata si verifica come un +numero — e io l'avevo dedotta invece di leggerla.* + +## 2. La finestra di pagamento è di DUE SETTIMANE, non di tre giorni — il «172×» era sovra-affermato + +> «The monthly USDC rewards payment is then made **within the first two weeks** of the following +> month.» + +Avevo verificato su 29/06→08/07 e 31/07→03/08: **8 giorni su 14 e 3 su 14**. Rifatto sulle finestre +vere: + +| accredito | finestra vera | letture | escursione TOTALE equity | scalini ≥70% dell'atteso | esito | +|---|---|---|---|---|---| +| giugno ($0,45) | 01→16/07 | 374 | **$2,74** | 7 | ❌ **NON conclusivo** | +| luglio ($1,72) | 01→16/08 | 382 | **$0,48** | **0** | ✅ **conclusivo** | + +Luglio regge da solo: il credito atteso è **3,6× l'intera escursione dell'equity** su due settimane. +Giugno no — il libro ha iniziato a operare a metà mese e il rumore ha la taglia del segnale. +⇒ La conclusione **non cambia** (una finestra conclusiva + la lista ufficiale), ma l'evidenza è +**una** finestra, non due. *Avevo citato la sotto-finestra piatta e chiamato «zero misurato» ciò che +la finestra completa non copriva: scegliere la sotto-finestra che fa vedere lo zero è la stessa +mossa che il progetto vieta a un backtest.* + +## 3. Il tetto NON è un livello: è una FRAZIONE dell'equity, e scala col conto + +L'articolo documenta un **Cap ETHENA** che diluisce il **tasso** a livello di exchange — +`User APR = min(min_exchange_USDe_balance, Ethena Cap) / min_exchange_USDe_balance × Ethena APR` — +e **nessun limite sulle quantità detenibili da un conto**. Quindi il muro non aveva base +documentale, e andava ri-sondato. Fatto (31/08, giorno UTC nuovo → non è un limite giornaliero): + +``` +BUY 5 -> not_enough_funds_in_currency USDE 644.175691 (muro ancora li') +SELL 10 -> OK USDE 634.175691 +BUY 10 -> not_enough_funds_in_currency USDE 634.175691 <-- ieri 644,18 passava! +BUY 5 -> OK USDE 639.175691 +BUY 3 -> OK USDE 642.175691 +BUY 1 -> OK USDE 643.175691 +BUY 1 -> not_enough_funds_in_currency USDE 643.175691 +``` + +**Ieri si tornava a 644,18 e oggi no**, con l'equity scesa di $8. Il tetto si è mosso con lei: + +| | tetto | equity | frazione | +|---|---|---|---| +| 30/08 | [644,18 · 645,18) | $2.063,79 | 31,21% – 31,26% | +| 31/08 | [643,18 · 644,18) | $2.055,56 | 31,29% – 31,34% | + +I bracket distano **0,05pp**, dentro il rumore dell'equity (±$2-8/ora). Candidato pulito **5/16 = +31,25%**, ma con questa risoluzione non si distingue da una regola sul collaterale scontato +dell'haircut (~29%): **non si sceglie quella che conviene, si cita la banda** (M25). + +⇒ **Il tetto SCALA col conto.** La quota resta ~31% per sempre, il valore in dollari cresce col +capitale, e il 70% non è raggiungibile né ora né mai. Conseguenza che ieri non avevo visto: essendo +pinnati al tetto, **il rischio emittente resta una frazione COSTANTE del conto** — non si diluisce +crescendo, a meno di vendere apposta. + +## 4. E l'USDe ha un fee del 5% che non avevamo mai nominato + +> «Deribit Fee: A percentage deducted from the reward before distribution (**currently 5%**)» +> · reward su **minima equity 00:00→24:00 UTC**, distribuiti **~12:00 UTC**, «visible inside +> Transaction Log» (che il gateway non espone: da lì il metodo per delta). + +Il nostro **misurato** (~4,5%/anno) è già netto del fee: è quello che arriva sul conto, ed è +l'unico numero da citare. La `apr` di `get_currencies` (4,1071%) è un listino, non un incasso — +la stessa confusione che mi era costata la §6. + +## 5. Cablato, così il tetto smette di vivere in prosa + +Alla domanda dell'operatore «dove è scritto il valore del tetto» la risposta era: **in tre note di +testo e in nessun posto che il codice legga**, tanto che `usde_convert --quota 0.70` dichiarava +«piano valido» per un ordine che il venue avrebbe rifiutato. Ora: + +- `config/live.json` → `usde.venue_cap_frac` **0.312** (bordo BASSO dei bracket: fa fallire il + piano *prima* dell'ordine invece che dopo il rifiuto) + `venue_cap_misurato` con la data; +- `src/live/usde.py` lo porta nei default — unica autorità, come tutto il resto della sezione (P1); +- `usde_convert.piano()` rifiuta il bersaglio sopra il tetto e stampa il massimo raggiungibile. + Verificato: `--quota 0.70` → *«TETTO DEL VENUE: bersaglio $1.438,90 sopra $641,34 (31,2% + dell'equity, misurato 2026-08-31)»*, nessun ordine inviato. + +**Stato finale**: USDE **643,175691** (quota **31,29%**, cioè al tetto), USDC $1.412,40, +totale $2.055,57. diff --git a/docs/journal/2026-08-30.md b/docs/journal/2026-08-30.md new file mode 100644 index 0000000..7d72cad --- /dev/null +++ b/docs/journal/2026-08-30.md @@ -0,0 +1,58 @@ +# Giornale di bordo — 2026-08-30 + +*Scritto 2026-08-31T00:36:38+00:00. Numeri misurati; nessuna interpretazione automatica.* + +## Mercato + +| | chiusura | 1g | 7g | 30g | RV30 ann. | TSMOM 30/90/180 | DVOL | +|---|---|---|---|---|---|---|---| +| **BTC** | $77,702.00 | -0.69% | -0.06% | +23.66% | 42.3% | ↑ ↑ ↑ (3/3 su) | 37.0 (15° pctl 1a) | +| **ETH** | $2,417.45 | -1.66% | -1.89% | +29.87% | 68.1% | ↑ ↑ ↑ (3/3 su) | 51.8 (20° pctl 1a) | + +## Libro + +Equity **$2,047.39** · nozionale lordo $553 · leva lorda 0.27x · barra dati 2026-08-30 · 24 giri + +| | TP01 | SKH01 | target | posizione | azione | +|---|---|---|---|---|---| +| **BTC** | +0.463 | flat | $+355 | $+348 | BUY $+8 | +| **ETH** | +0.278 | flat | $+214 | $+205 | BUY $+9 | + +## P&L + +- giorno: **$-9.48** di equity (24 letture) +- realizzato: -0.08 netto su 2 round-trip chiusi · 5 fill · fee 0.0164 +- cumulato dall'arming: **$+1,449.33** di equity — di cui $+1,399.39 versati/prelevati -> trading **$+49.94** + +## Salute + +- giri di `book_execute`: 24/24 +- eta' feed SKH all'ultimo giro: 0 min + +## Lettura + +*Generata da regole dichiarate in `src/live/journal.py` — combina i numeri qui sopra e nient'altro. L'id fra parentesi quadre dice quale regola ha parlato. Non e' un giudizio: quello sta nella Nota.* + +- `[stato]` A mercato su BTC $+348 (TP01 +0.463, SKH01 flat) e ETH $+205 (TP01 +0.278, SKH01 flat). +- `[leva]` Leva lorda **0.27x** su un tetto di 1.00x (`max_notional_per_asset_frac` 0.50 x 2 asset, letto da `config/live.json`): margine 0.73x. +- `[pnl]` Equity $-9.48 con 5 fill e 2 round-trip chiusi (realizzato $-0.08 netto). +- `[drawdown]` 📌 Equity **-1.26%** sotto il picco ($2,073.59). ⚠️ e' un DD su letture ORARIE, non sul minimo intra-giorno. +- `[vol]` BTC: implicita 37.0 contro realizzata 30g 42.3 (sotto); DVOL al 15° pctl di un anno; IV-rank espandente 0.06 sotto la soglia 0.30 del gate di VRP01 (sleeve fermo). +- `[vol]` ETH: implicita 51.8 contro realizzata 30g 68.1 (sotto); DVOL al 20° pctl di un anno; IV-rank espandente 0.13 sotto la soglia 0.30 del gate di VRP01 (sleeve fermo). +- `[evidenza]` 📌 Campione a oggi: **68 giorni, 26 round-trip**. A questa taglia il P&L non distingue l'edge dalla fortuna — il criterio di morte del libro (`edge_watch`) lavora su una finestra di 36 mesi. + +## Analisi (agente) + +*Scritta da `claude-opus-5` il 2026-08-31T00:37:31+00:00. Prosa di un modello: puo' sbagliare, e non e' una misura. Controllo sui numeri: **ok**.* + +Il fatto nuovo non è la perdita ma la sua composizione: $-9.48 di equity contro $-0.08 di realizzato su 2 round-trip. Quasi tutto è mark-to-market su due long in una giornata con BTC -0.69% ed ETH -1.66%; una lettura altrettanto compatibile è che il libro stia semplicemente respirando col beta dei due asset, senza che il segnale abbia detto nulla. È il terzo segno meno da quando l'elenco comincia il 20/08, dopo il 22/08 ($-9.00) e il 28/08 ($-17.87). Insolito è invece il conto dei fill: cinque, con fee 0.0164, per spostare $+8 su BTC e $+9 su ETH, contro l'uno o due dei giorni scorsi. Vale un'occhiata umana a quale giro li abbia generati. + +La posizione ETH scende da $+216 a $+205 mentre BTC sale da $+344 a $+348: se a muoverla sia il segnale TP01 o il prezzo non è separabile da questa pagina. + +L'anomalia di mercato sta nella vol: +23.66% a 30 giorni su BTC e +29.87% su ETH, con DVOL al 15° e al 20° percentile dell'anno e implicita sotto la realizzata su entrambi. Il rally è arrivato senza che le opzioni lo prezzassero. + +Il trading resta $+49.94 su 68 giorni e 26 round-trip: troppo poco per essere altro che rumore. + +## Nota + +*(vuota — campo dell'operatore)* diff --git a/scripts/live/usde_convert.py b/scripts/live/usde_convert.py index 4b11dce..eb44bf7 100644 --- a/scripts/live/usde_convert.py +++ b/scripts/live/usde_convert.py @@ -16,6 +16,12 @@ LE GUARDIE (tutte BLOCCANTI, tutte dichiarate qui): 0.98 e' esattamente il momento in cui NON si compra, e uno a 1.02 non esiste (si clampa a 1.0). * quota bersaglio in [0, QUOTA_HARD_MAX] — il gate USDE-01 dice "mai 100%: R1 emittente non recuperabile". Il tetto e' HARD e non si passa da riga di comando. + * TETTO DEL VENUE (`usde.venue_cap_frac`). Deribit rifiuta gli acquisti oltre una frazione + dell'equity totale — ~31,2%, MISURATA il 30-31/08 e non documentata da nessuna parte, col + messaggio fuorviante `not_enough_funds_in_currency`. E' una frazione, non un livello: fatta + scendere l'equity di $8, il tetto e' sceso con lei. Senza questa guardia il piano si dichiara + VALIDO e poi il venue lo rifiuta a raffica — che e' esattamente il giro di venti minuti costato + il 30/08. Il valore vive in config, non qui (P1: il bersaglio si deriva, non si ridichiara). * CUSCINO DI REGOLAMENTO. Il P&L e il funding dei perp USDC-lineari si regolano in USDC, non nel collaterale: a quota alta il saldo USDC va negativo alla prima perdita del libro e Deribit lo finanzia a interesse. Il margine NON e' il vincolo (r0830_usde_quota: l'haircut non morde fino @@ -140,6 +146,9 @@ def piano(eq_usdc: float, eq_usde: float, px: float, quota_target: float, # dal lato del cuscino di regolamento. Sul lato vendita il difetto va nello stesso verso. amount = float(math.floor(abs(delta_usd) / (px_ord or px))) + cfg = U.cfg() + cap_frac = float(cfg.get("venue_cap_frac") or 0) + cap_usd = cap_frac * equity_tot if cap_frac else None cuscino, come = cuscino_richiesto_usd(equity_tot) usdc_dopo = eq_usdc - delta_usd motivi = [] @@ -156,10 +165,16 @@ def piano(eq_usdc: float, eq_usde: float, px: float, quota_target: float, motivi.append(f"gia' a bersaglio ({quota_ora:.1%} vs {quota_target:.0%}, toll {TOLL:.1%})") if abs(delta_usd) < MIN_ORDER_USD: motivi.append(f"delta ${abs(delta_usd):,.2f} sotto il minimo ${MIN_ORDER_USD:,.2f}") + if cap_usd is not None and val_target > cap_usd + EPS_CUSCINO: + motivi.append( + f"TETTO DEL VENUE: bersaglio ${val_target:,.2f} sopra ${cap_usd:,.2f} " + f"({cap_frac:.1%} dell'equity, misurato {cfg.get('venue_cap_misurato')}). " + f"Massimo raggiungibile: quota {cap_frac:.1%}") if usdc_dopo < cuscino - EPS_CUSCINO: motivi.append(f"cuscino di regolamento: USDC dopo ${usdc_dopo:,.2f} < ${cuscino:,.2f} richiesti ({come})") - return {"quota_ora": quota_ora, "quota_target": quota_target, "val_usde": val_usde, + return {"cap_usd": cap_usd, "cap_frac": cap_frac, + "quota_ora": quota_ora, "quota_target": quota_target, "val_usde": val_usde, "equity_tot": equity_tot, "delta_usd": delta_usd, "side": side, "amount": amount, "px": px, "px_ordine": px_ord, "usdc_dopo": usdc_dopo, "cuscino": cuscino, "cuscino_come": come, "ok": not motivi, "motivi": motivi} @@ -201,7 +216,8 @@ def main() -> int: f" -> ordine @ {p['px_ordine']}, banda [{PX_MIN}, {PX_MAX}]") print(f" equity : USDC ${eq_usdc:,.2f} + USDE {eq_usde:,.4f} (${val_usde:,.2f})" f" = ${equity_tot:,.2f}") - print(f" quota : {p['quota_ora']:.1%} -> {p['quota_target']:.0%}") + print(f" quota : {p['quota_ora']:.1%} -> {p['quota_target']:.0%}" + + (f" · tetto venue {p['cap_frac']:.1%} = ${p['cap_usd']:,.2f}" if p.get("cap_usd") else "")) print(f" ordine : {p['side'].upper()} {p['amount']:,.2f} USDE_USDC @ limit {p['px_ordine']:.4f}" f" (${abs(p['delta_usd']):,.2f})") slack = p["usdc_dopo"] - p["cuscino"] diff --git a/src/live/usde.py b/src/live/usde.py index 204dffa..e1b308d 100644 --- a/src/live/usde.py +++ b/src/live/usde.py @@ -32,6 +32,8 @@ _DEFAULTS = { "index_name": "usde_usdc", "haircut": 0.10, "quota_max_frac": 0.50, + "venue_cap_frac": 0.312, # tetto MISURATO del venue sulla quota USDE (non documentato) + "venue_cap_misurato": "2026-08-31", "depeg_warn": 0.99, "depeg_crit": 0.95, }