import lab, rules as Q, rotmap as R, math R.INDEX_NEED = 1 R.RISK_MA = 50 # baseline; the script sets its own risk series where it matters M = lab.load(); label, runs = lab.oracle(M) base_risk = list(M._risk) btc = M.idx["BTC"] def risk_series(n, band): return Q.trend_state(btc, n, band) def ens(ns=(20, 50, 100, 200), band=0.01): ss = [risk_series(n, band) for n in ns] return [sum(s[i] for s in ss) / len(ss) for i in range(M.N)] def wrap(rulef, frac): r = rulef() return lambda i: {k: v * frac[i] for k, v in r(i).items()} P = [("HOLD", "2020-06-01", "2024-06-30"), ("RECENT", "2024-07-01", None)] def show(name, mk): cells = [] for _, a, z in P: s = lab.score(M, mk(), a, z, label=label, runs=runs) st = R.stats(M.backtest(mk(), M.pos[a], M.pos[z] if z else M.N - 1)[0]) cells.append("cap %3d%% maj %d/%d ret %+6d%% dd %4.0f%% sw %3d" % (s["capture"], s["caught"], s["major"], st["total"], st["maxdd"], s["switches"])) print("%-34s" % name + " ".join(cells)) for n in (20, 30, 50, 100, 200): for band in (0.0, 0.01, 0.03): M._risk = risk_series(n, band) show("BTC>%dd b%d%% | trend" % (n, band*100), lambda: (lambda i: {"BTC": 1.0} if M._risk[i] else {})) show("BTC>%dd b%d%% | book G" % (n, band*100), lambda: M.book_rule()[0]) for ns in ((20, 50, 100, 200), (50, 100, 200), (20, 50, 100)): f = ens(ns) M._risk = [x >= 0.5 for x in f] show("ENS %s | trend" % (ns,), lambda: (lambda i: {"BTC": f[i]} if f[i] else {})) show("ENS %s | book G" % (ns,), lambda: wrap(lambda: M.book_rule()[0], f)) M._risk = base_risk