- 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>
8.6 KiB
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
*/10che esegue solo quandonow % 230min == 0colpirebbe 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)
- 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.
- 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. - 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.