b65f067f69
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>
51 lines
2.1 KiB
Python
51 lines
2.1 KiB
Python
"""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}")
|