research(ortho): caccia all'ortogonale a TP01 — relative-value BTC/ETH reale ma NON deployabile (hedge mono-regime)

18 agenti su book market-neutral a 2 gambe BTC/ETH (eseguibili a $600, a differenza di XS01),
giudicati sul MARGINALE vs TP01 (altlib.marginal_vs_tp01), non sullo Sharpe assoluto.

Lab: ortholib.py (eval_book leak-free a 2 gambe + causalità + eseguibilità@600), ortho_score.py
(giudice), meta_ortho.py (corr mutua + persistenza multi-cut), sleeve_rv.py (curated, SELECTION-
BIASED, non deployare).

Esito: 17/18 "ADDS" -> gonfiato dall'hold-out corto fisso-2025 (finestra ETH-bleed dove TP01 è
debole). Diagnosi orchestratore: collassano a 8 bet (corr 0.43); persistenza multi-cut e selezione
walk-forward smascherano i 2025-only (kalman/xs2). Scettico indipendente: basket selection-free ha
uplift pre-2025 +0.027 = 49° percentile di asset-rumore corr-zero (matematica di diversificazione,
non segnale); corr(Sharpe-TP01, uplift) -0.87 (è un HEDGE dei drawdown di TP01); muore a 0.30% RT.

Verdetto: NIENTE in live. Resta solo TP01. Lezione: lo scorer marginale va indurito (multi-cut +
null-asset-rumore + distinguere hedge da alpha). Diario 2026-06-21-ortho-tp01-relative-value.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Adriano Dal Pastro
2026-06-21 12:35:48 +00:00
parent 1afb1014c9
commit 0adc69a357
27 changed files with 3539 additions and 0 deletions
+51
View File
@@ -0,0 +1,51 @@
"""sleeve_rv — CURATED relative-value sleeve: equal-weight of the 4 ortho books whose
marginal uplift to TP01 is POSITIVE AT EVERY hold-out cut (2022/23/24/25), i.e. persistent
rather than the 2025 ETH/BTC-bleed artifact. Two price-based + two implied-vol-based, so
the legs are mechanism-diverse (mutual corr < 0.6).
This is ONE executable 2-leg BTC/ETH book (the averaged legs stay within the $300/asset
cap because each sub-book is capped 0.5/leg and the mean of capped weights is capped).
book(btc, eth) -> (w_btc, w_eth)
Use it as a small market-neutral satellite alongside TP01 (forward-monitor first).
"""
from __future__ import annotations
import importlib.util
import sys
from pathlib import Path
import numpy as np
HERE = Path(__file__).resolve().parent
sys.path.insert(0, str(HERE))
# the persistent-at-every-cut representatives (mechanism-diverse)
MEMBERS = [
"agent_14_dvol_spread",
"agent_04_ratio_donchian",
"agent_03_relstrength_gated",
"agent_15_vol_premium_tilt",
]
def _load(name: str):
p = HERE / "agents" / f"{name}.py"
spec = importlib.util.spec_from_file_location(name, p)
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)
return mod.book
_BOOKS = [_load(n) for n in MEMBERS]
def book(btc, eth):
wbs, wes = [], []
for b in _BOOKS:
wb, we = b(btc, eth)
wbs.append(np.nan_to_num(np.asarray(wb, float)))
wes.append(np.nan_to_num(np.asarray(we, float)))
wb = np.mean(wbs, axis=0)
we = np.mean(wes, axis=0)
return np.clip(wb, -0.5, 0.5), np.clip(we, -0.5, 0.5)