Files
PythagorasGoal/docs/diary/2026-07-24-skh-live-weight.md
T
Adriano Dal Pastro 636be89b2b 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>
2026-07-24 23:08:23 +00:00

133 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.200.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 = (1w)·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.300.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: barclosehourly Δ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
050 min del cron orario è **rumore, non un costo sistematico**. Il vero gap è il
**fill-al-livello** (canonicalbarclose: Δ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.200.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.