# 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.