research(live): follow-up SKH chiuso — peso 0.25 e cron orario CONFERMATI de-luckati sul path live; + snapshot point-in-time stablecoin (sblocco WATCH a 12 mesi)
- r0724_skh_live_weight.py: sweep w 0-0.50 sul path hourly x 23 offset; w*=0.25 (argmax mediana-IS di banda, plateau 0.20-0.30); w=0.30 passa weights_tilt_null solo a off0 (ancora fortunata), fallisce a offset mediano -> INVARIATO. Cadenza 230m = rumore (+0.01/+0.02 Sh med); il degrado live e' il fill-al-livello (~+0.35 Sh) che nessun cron recupera. Book e cron INVARIATI. - r0724_stable_snapshot.py: cattura giornaliera point-in-time supply stablecoin (DefiLlama, tokenless, idempotente) -> data/external/stable_snapshots/ (gitignored). Criterio di rivisita del lead STABLE: >=12 mesi di serie propria. - CLAUDE.md: bullet SKH01 aggiornato (follow-up chiuso). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
# 2026-07-24 — SKH01 sul PATH LIVE: peso del book Deribit a 2 sleeve + valore della cadenza 230m
|
||||
|
||||
**Chiude il follow-up aperto dall'audit anchor 2026-07-02** (`2026-07-02-anchor-audit-xs01-skh01.md`:
|
||||
"cadenza 230m, peso live da rivedere"). Il book live Deribit è TP01 0.75 + SKH01 0.25
|
||||
(`sleeves.deribit_book_sleeves`); l'audit aveva mostrato che il path live reale (cron ORARIO
|
||||
`0 * * * *` + exit software, non on-book al livello) degrada SKH01 (50/50: FULL 1.46→1.19,
|
||||
HOLD 1.64→1.15, DD 18→25%) e che l'offset 0 della griglia 230m/690m è best-of-23. Domanda:
|
||||
**dato il path live vero, qual è il peso SKH ottimale, e quanto vale allineare il cron a 230m?**
|
||||
|
||||
**Script:** `scripts/research/r0724_skh_live_weight.py` — riusa la macchineria di
|
||||
`r0702_anchor_skh01.py` (import diretto di `run_asset`/`sim_equity`/`get5m`/`sanity`, non
|
||||
riscritta). Nessun file di produzione toccato (config/sleeves/live/cron INVARIATI).
|
||||
|
||||
## Verdetto in una riga
|
||||
|
||||
**INVARIATO su entrambi i fronti**: il peso SKH ottimale sul path live, scelto onestamente
|
||||
(mediana de-luckata sui 23 offset, IN-SAMPLE, mai su hold-out), è **0.25 = il peso corrente**
|
||||
(plateau 0.20–0.30); e **allineare il cron ai confini 230m non vale nulla** (Δmediana di banda
|
||||
~+0.01/+0.02 Sharpe): il degrado live è quasi tutto **fill-al-livello vs exit software**,
|
||||
che nessuna cadenza recupera.
|
||||
|
||||
## Setup (onestà dichiarata a priori)
|
||||
|
||||
- **Serie SKH live-path**: tutti i **23 offset** a priori della griglia (ogni 30m su [0,690)) ×
|
||||
3 modi di `sim_equity`: `canonical` (fill al livello sl/tp = backtest), `barclose` (fill al
|
||||
close della barra 230m = ciò che otterrebbe un cron allineato ai confini), `hourly` (fill al
|
||||
close 5m del prossimo multiplo orario = **path del cron reale**). Sanity replica bit-exact
|
||||
del canonico prima di ogni numero.
|
||||
- **Sweep peso**: book = (1−w)·TP01 + w·SKH_live, w ∈ {0, .10, .15, .20, .25, .30, .40, .50}
|
||||
(**8 valori = multiple-testing leggero, dichiarato**; nel gate k_seen=8). TP01 =
|
||||
`al.tp01_baseline_daily()` canonico (come nell'audit).
|
||||
- **Regola di selezione dichiarata PRIMA di vedere i numeri**: w* = argmax della **mediana
|
||||
sui 23 offset dello Sharpe IN-SAMPLE** (pre-2025), lente `hourly`; a parità (<0.03) vince
|
||||
il w più vicino al corrente 0.25. **L'hold-out serve solo a verificare, mai a scegliere.**
|
||||
- **Gate**: `weights_tilt_null` (src/portfolio/portfolio.py) adattato al book a 2 sleeve
|
||||
(null = 500 tilt casuali floor 0.05 / cap SKH 0.50 attorno al 75/25, sui daily del path
|
||||
live hourly).
|
||||
|
||||
## Sanity — riconciliazione con l'audit r0702
|
||||
|
||||
Off0 == `_skyhook_returns()` **bit-exact** (max|Δ|=0.0 su 2688 giorni; l'audit ne aveva 2666 —
|
||||
22 giorni di feed in più, deriva-dati attesa). DD harness BTC 21.4% / ETH 27.4% e n. trade
|
||||
identici al diario di ammissione. Book 50/50 off0:
|
||||
|
||||
| modo | ShFULL | ShIS | ShHOLD | maxDD | audit r0702 |
|
||||
|---|---|---|---|---|---|
|
||||
| canonical | 1.447 | 1.418 | 1.578 | 18.1% | 1.46 / — / 1.64 / 18.1% |
|
||||
| barclose | 1.100 | 1.080 | 1.228 | 23.0% | (non riportato) |
|
||||
| hourly | 1.179 | 1.201 | 1.103 | 24.6% | 1.19 / — / 1.15 / 24.6% |
|
||||
|
||||
TP01 baseline: FULL 1.290 / IS 1.488 / HOLD 0.297 / DD 14.3% (audit ~1.30/~0.31). Blend 75/25
|
||||
canonical off0 HOLD 1.125 (audit ~1.16). **Riconcilia** (Δ ≈ deriva-dati).
|
||||
|
||||
## Sweep peso — lente HOURLY (path live, quella della decisione)
|
||||
|
||||
| w | off0 FULL/IS/HOLD/DD | mediana banda FULL/IS/HOLD/DD | HOLD min..max | DD min..max |
|
||||
|---|---|---|---|---|
|
||||
| 0.00 | 1.29 / 1.49 / 0.30 / 14.3% | 1.29 / 1.49 / 0.30 / 14.3% | — | — |
|
||||
| 0.10 | 1.48 / 1.67 / 0.54 / 11.8% | 1.42 / 1.63 / 0.43 / 11.9% | 0.33..0.56 | 11.3..13.1% |
|
||||
| 0.15 | 1.56 / 1.74 / 0.66 / 11.6% | 1.47 / 1.68 / 0.50 / 11.6% | 0.35..0.70 | 10.7..12.6% |
|
||||
| 0.20 | 1.61 / 1.79 / 0.77 / 11.3% | 1.51 / 1.71 / 0.56 / 11.3% | 0.36..0.82 | 10.1..12.7% |
|
||||
| **0.25** | **1.65 / 1.82 / 0.86 / 11.1%** | **1.53 / 1.72 / 0.62 / 11.2%** | 0.36..0.94 | 9.6..13.6% |
|
||||
| 0.30 | 1.67 / 1.82 / 0.94 / 11.0% | 1.53 / 1.71 / 0.67 / 11.0% | 0.37..1.05 | 9.4..14.6% |
|
||||
| 0.40 | 1.65 / 1.78 / 1.04 / 11.9% | 1.48 / 1.65 / 0.73 / 11.9% | 0.35..1.20 | 10.4..17.3% |
|
||||
| 0.50 | 1.58 / 1.69 / 1.09 / 12.9% | 1.39 / 1.53 / 0.76 / 13.4% | 0.33..1.30 | 11.2..19.9% |
|
||||
|
||||
(La tabella `canonical` di riferimento è nell'output dello script: stessa forma, picco a
|
||||
0.30–0.40 su off0 — l'off0 canonico resta la lente gonfiata già nota.)
|
||||
|
||||
- **Mediana-IS (hourly) per w**: 0.00:1.488 · 0.10:1.627 · 0.15:1.678 · 0.20:1.710 ·
|
||||
**0.25:1.721** · 0.30:1.712 · 0.40:1.645 · 0.50:1.534 → argmax = **0.25**, plateau
|
||||
{0.20, 0.25, 0.30} dentro la tolleranza 0.03 → **w\* = 0.25 = corrente**.
|
||||
- Anche sul path live onesto la gamba SKH **paga**: a w=0.25 la mediana di banda migliora
|
||||
TP01-solo su tutto (FULL 1.29→1.53, IS 1.49→1.72, HOLD 0.30→0.62, DD 14.3%→11.2%) —
|
||||
la diversificazione sopravvive al path orario. Il sizing 25%, deciso a suo tempo su numeri
|
||||
best-of-23, **risulta a posteriori difendibile anche de-luckato sul path vero**.
|
||||
- **Tentazione rifiutata per regola**: su off0 l'HOLD cresce monotono fino a w=0.50 (1.09).
|
||||
Sceglierlo sarebbe selezione-sull'hold-out + fortuna d'ancora (off0 = 98° pctl HOLD
|
||||
nell'audit). La banda IS dice 0.25 e il DD di banda peggiora oltre 0.30.
|
||||
|
||||
## Gate `weights_tilt_null`
|
||||
|
||||
w\* == corrente → **nessun cambio proposto: INVARIATO** (gate non necessario). Eseguito
|
||||
comunque, a titolo informativo, sul miglior w ≠ corrente (0.30):
|
||||
|
||||
- **off0 (griglia live)**: delta_insample +0.007, delta_hold +0.076, pctl_hold 53.6 (<88.9
|
||||
best-of-8) → gate_pass **True ma marginale** (frac_random_beat_hold 0.562: più di metà dei
|
||||
tilt casuali batte il 75/25 sull'hold-out — il claim "SKH aiuta l'hold-out" è generico,
|
||||
non specifico di 0.30).
|
||||
- **off30 (offset IS-mediano)**: delta_insample **−0.009** → gate_pass **False**. Il pass di
|
||||
off0 è (di nuovo) figlio dell'ancora fortunata: il tick +0.01 IS a 0.30 non è robusto
|
||||
alla banda. → 0.30 NON supera la barra onesta; **75/25 resta**.
|
||||
|
||||
## Cadenza 230m — barclose vs hourly (a w=0.25)
|
||||
|
||||
- off0: ΔShFULL **−0.040**, ΔShHOLD +0.068, ΔDD −0.9pt. Banda 23 offset: ΔShFULL med
|
||||
**+0.010** [−0.042,+0.105], ΔShHOLD med **+0.020** [−0.109,+0.162], ΔDD med −0.3pt.
|
||||
- SKH standalone 50/50: barclose−hourly ΔShFULL off0 −0.080 (med +0.015), ΔShHOLD off0
|
||||
+0.125 (med +0.041), ΔDD off0 −1.5pt (med −1.3pt).
|
||||
- **Sorpresa onesta**: a off0 il barclose è perfino PEGGIO dell'hourly su FULL — il ritardo
|
||||
0–50 min del cron orario è **rumore, non un costo sistematico**. Il vero gap è il
|
||||
**fill-al-livello** (canonical−barclose: ΔShFULL off0 +0.347, ΔShHOLD +0.350, ΔDD −4.9pt),
|
||||
cioè l'assunzione del backtest che l'exit avvenga esattamente a sl/tp — e quello **nessun
|
||||
cron lo recupera** (l'exit software in una barra che gappa prende il gap comunque; già
|
||||
misurato dall'audit: sl2% → −11/−23% realizzato nei crash).
|
||||
- Fattibilità (SOLO stima, non cablata): 230=23×10 → i confini 230m cadono sempre su multipli
|
||||
di 10 min dall'epoch, quindi un cron `*/10` che esegue solo quando `now % 230min == 0`
|
||||
colpirebbe ogni confine con ritardo ~0. **Ma non vale la pena**: guadagno mediano ~+0.01/+0.02
|
||||
Sharpe, dentro il rumore, contro 6× invocazioni cron e complessità sul path live certificato.
|
||||
|
||||
## Caveat
|
||||
|
||||
- Exit software nei crash = gap reale (la sim `hourly` è già la stima pessimistica giusta);
|
||||
niente slippage/parziali modellati; equity daily-step (lens Sharpe) come canonico e audit.
|
||||
- 8 valori di w provati e dichiarati (k_seen=8 nel gate); selezione mai sull'hold-out.
|
||||
- La banda 23-offset è la lente de-luckata; live gira UNA sola griglia (off 0).
|
||||
- Deriva-dati vs audit (22 giorni di feed in più): riconciliazione "circa", riportata sopra.
|
||||
- A $600 la granularità del peso non vincola (gamba SKH a w=0.10 ≈ $60/trade ≫ min-order $5).
|
||||
|
||||
## Raccomandazione finale (decisione utente per ogni cambio config)
|
||||
|
||||
1. **Peso SKH del book live Deribit: INVARIATO a 0.25.** È l'ottimo di banda sul path live
|
||||
(plateau 0.20–0.30); nessun w alternativo passa il gate in modo robusto.
|
||||
2. **Cadenza cron: INVARIATA (oraria).** L'allineamento 230m vale ~+0.01/+0.02 Sharpe mediano
|
||||
(rumore); il degrado live è strutturale (fill-al-livello), non di cadenza. Non cablare il
|
||||
cron `*/10`.
|
||||
3. L'aspettativa onesta della gamba SKH live resta quella dell'audit: blend ~fase-mediana +
|
||||
path orario (HOLD di banda ~0.62 a w=0.25, non 1.17), con gap-through-stop nei crash.
|
||||
Il **follow-up dell'audit 2026-07-02 è CHIUSO** (entrambi i punti, esito nullo).
|
||||
|
||||
**Stato:** config/live.json, sleeves.py, scripts/live, cron **INVARIATI** — questo è ricerca;
|
||||
ogni eventuale cambio resta una decisione esplicita dell'utente. Script committabile dopo review.
|
||||
Reference in New Issue
Block a user