import lab, rules as Q, rotmap as R, math import sys R.INDEX_NEED = 1 R.RISK_MA = int(sys.argv[1]) if len(sys.argv) > 1 else 50 print('RISK_MA', R.RISK_MA) M = lab.load(); label, runs = lab.oracle(M) C = {"risk switch": lambda: (lambda i: {"BTC": 1.0} if M.risk_on(i) else {}), "book G": lambda: M.book_rule()[0], "alts when risk on": lambda: (lambda i: Q.alts_w(M, i) if M.risk_on(i) else {})} for n in (30, 50, 100): for band in (0.0, 0.02, 0.05): C["RS gate ALTS/BTC %dd b%.0f%%" % (n, band*100)] = (lambda n=n, band=band: Q.rs_gate(M, n, band)) C["RS gate ETH/BTC 50d b2%"] = lambda: Q.rs_gate(M, 50, 0.02, "ETH") for on, off in ((0.5, 0.3), (0.55, 0.4), (0.6, 0.45), (0.7, 0.5)): C["breadth gate %.0f/%.0f" % (on*100, off*100)] = (lambda on=on, off=off: Q.breadth_gate(M, on, off)) for n in (50, 100): C["book G + RS %dd" % n] = (lambda n=n: Q.book_plus_rs(M, n, 0.02)) C["basket RS %dd all" % n] = (lambda n=n: Q.basket_rs(M, n, 0.02)) C["basket RS %dd top2" % n] = (lambda n=n: Q.basket_rs(M, n, 0.02, 2)) P = [("HOLD", "2020-06-01", "2024-06-30"), ("RECENT", "2024-07-01", None)] print("%-30s" % "" + "".join("%-46s" % p[0] for p in P)) for name, mk in C.items(): cells = [] for _, a, z in P: s = lab.score(M, mk(), a, z, label=label, runs=runs) c, dd = M.backtest(mk(), M.pos[a], M.pos[z] if z else M.N - 1)[0], None st = R.stats(c) 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("%-30s" % name + " ".join(cells))