import lab, math, sys, rotmap as R R.INDEX_NEED = int(sys.argv[1]) if len(sys.argv) > 1 else 1 R.RISK_MA = int(sys.argv[2]) if len(sys.argv) > 2 else 50 print('RISK_MA', R.RISK_MA) M = lab.load() label, runs = lab.oracle(M) print("INDEX_NEED", R.INDEX_NEED, "| ORACLE RUNS (45d best of CASH/BTC/ALTS, min run 21d), MAJOR = edge >= 20%") for s, e, l, edge, r in runs: tag = "MAJOR" if edge >= math.log(1.2) else "" print(" %s .. %s %-4s %4dd edge %+5.0f%% BTC %+5.0f%% ALTS %+5.0f%% %s" % (M.days[s], M.days[e], l, e - s + 1, 100 * (math.exp(edge) - 1), 100 * (math.exp(r["BTC"]) - 1), 100 * (math.exp(r["ALTS"]) - 1), tag)) rules = {"hold BTC": lambda M: (lambda i: {"BTC": 1.0}), "BTC risk switch": lambda M: (lambda i: {"BTC": 1.0} if M.risk_on(i) else {}), "book G (live)": lambda M: M.book_rule()[0], "alts when risk on": lambda M: (lambda i: {b: 1/6 for b in R.ALT_BASKETS if M.idx[b][i]} if M.risk_on(i) else {})} for per in [("2020-06-01", "2024-06-30"), ("2024-07-01", None)]: print("\nPERIOD", per) for n, f in rules.items(): s = lab.score(M, f(M), per[0], per[1], label=label, runs=runs) print(" %-18s acc %3d%% capture %3d%% majors caught %d/%d median lag %s d switches %d ret %+d%%" % ( n, s["acc"], s["capture"], s["caught"], s["major"], s["med_lag"], s["switches"], s["ret"])) s = lab.score(M, M.book_rule()[0], "2020-06-01", None, label=label, runs=runs) print("\nBOOK G, every major rotation (start, end, bucket, edge%, lag to hold it, % of run held):") for x in s["events"]: print(" ", x)