research(premium): ondata premi cross-venue auto-calcolati — CBPREM morto, KIMCHI d30 ucciso dallo scettico (spike+lag)
CBPREM (Coinbase vs feed cert, 2015->): HEDGE, hold -0.46. KIMCHI (Upbit/ECB, 2017->, ancora 00:00 UTC verificata): EARNS_SLOT=True al marginal scorer (ADDS, robust_oos, uplift + ogni anno) ma DSR 0.891 -> scettico obbligatorio: niente plateau (d15/30/45/60 = 0.44/1.07/0.51/0.24) e lag +1g azzera (hold 0.74->0.14) = parameter luck. Lezione codificata: EARNS_SLOT con DSR<0.95 -> sempre plateau+lag skeptic. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
"""r0724_kimchi_skeptic — scettico sul candidato KIMCHI d30-folLF (2026-07-24).
|
||||
|
||||
Il candidato usciva da r0724_premium_wave con EARNS_SLOT=True al marginal scorer
|
||||
(ADDS, robust_oos, persistente ogni anno) ma DSR 0.891<0.95. Due check obbligatori:
|
||||
(1) PLATEAU: d15/d30/d45/d60 — un edge vero degrada dolcemente, uno spike no;
|
||||
(2) LAG ESECUZIONE +1g: un segnale di flusso a 30g deve sopravvivere a 24h di ritardo.
|
||||
ESITO (run 2026-07-24): d30 e' uno SPIKE isolato (0.44/1.07/0.51/0.24) e il lag +1g
|
||||
lo azzera (hold 0.74->0.14, uplift blend negativo) -> SCARTATO, parameter-luck.
|
||||
"""
|
||||
import sys
|
||||
import pathlib
|
||||
ROOT = str(pathlib.Path(__file__).resolve().parents[2])
|
||||
sys.path.insert(0, ROOT)
|
||||
sys.path.insert(0, ROOT + "/scripts/research/alt")
|
||||
import numpy as np, pandas as pd
|
||||
import altlib
|
||||
from altlib import candidate_daily, tp01_baseline_daily, HOLDOUT
|
||||
sys.path.insert(0, ROOT + "/scripts/research")
|
||||
from r0724_premium_wave import _PREM
|
||||
|
||||
def _sh(s):
|
||||
s = s.dropna()
|
||||
return float(s.mean()/s.std()*np.sqrt(365.25)) if s.std() > 0 else 0.0
|
||||
|
||||
def factory(D, extra_lag=0):
|
||||
def fn(df, asset):
|
||||
p = _PREM[asset]["kimchi"]
|
||||
z = (p - p.shift(D)).shift(extra_lag)
|
||||
pos = (np.sign(z) > 0).astype(float)
|
||||
days = pd.DatetimeIndex(pd.to_datetime(df["datetime"], utc=True)).floor("D")
|
||||
return np.nan_to_num(pos.reindex(days).values.astype(float))
|
||||
return fn
|
||||
|
||||
B = tp01_baseline_daily()
|
||||
def blend_uplift(C, w=0.25):
|
||||
J = pd.concat({"b": B, "c": C}, axis=1, join="inner").fillna(0.0)
|
||||
bl = (1-w)*J["b"] + w*J["c"]
|
||||
hb, hbl = J["b"][J.index >= HOLDOUT], bl[bl.index >= HOLDOUT]
|
||||
return _sh(bl)-_sh(J["b"]), _sh(hbl)-_sh(hb)
|
||||
|
||||
print(f"{'cella':<18}{'Sh full':>9}{'Sh hold':>9}{'upl full':>10}{'upl hold':>10}")
|
||||
for D in (15, 30, 45, 60):
|
||||
C = candidate_daily(factory(D), tf="1d")
|
||||
uf, uh = blend_uplift(C)
|
||||
hold = C[C.index >= HOLDOUT]
|
||||
print(f"d{D:<3} lag0 {_sh(C):>9.2f}{_sh(hold):>9.2f}{uf:>+10.3f}{uh:>+10.3f}")
|
||||
C = candidate_daily(factory(30, extra_lag=1), tf="1d")
|
||||
uf, uh = blend_uplift(C)
|
||||
hold = C[C.index >= HOLDOUT]
|
||||
print(f"d30 lag+1g {_sh(C):>9.2f}{_sh(hold):>9.2f}{uf:>+10.3f}{uh:>+10.3f}")
|
||||
Reference in New Issue
Block a user