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() btc = M.idx["BTC"] def rs(n, b): return Q.trend_state(btc, n, b) def ens(ns=(50, 100, 200), band=0.01): ss = [rs(n, band) for n in ns]; return [sum(s[i] for s in ss) / len(ss) for i in range(M.N)] V = {} for n, b in ((50, .01), (100, .0), (100, .01), (100, .03), (75, .01), (150, .01)): V["G on %dd b%d%%" % (n, b*100)] = ("bin", rs(n, b)) V["G on ENS 50/100/200"] = ("frac", ens()) V["hold BTC"] = ("hold", None) yrs = [("2020-06-01", "2020-12-31")] + [("%d-01-01" % y, "%d-12-31" % y) for y in range(2021, 2026)] + [("2026-01-01", M.days[-1])] print("%-22s" % "" + "".join("%-9s" % a[:4] for a, _ in yrs) + " worst-yr beats-hold") for name, (kind, series) in V.items(): row, worst, beats = [], 9e9, 0 for a, z in yrs: def mk(): if kind == "hold": return lambda i: {"BTC": 1.0} M._risk = [x >= 0.5 for x in series] if kind == "frac" else series g = M.book_rule()[0] if kind == "frac": return lambda i: {k: v * series[i] for k, v in g(i).items()} return g r = mk(); c = M.backtest(r, M.pos[a], M.pos[z])[0] t = 100 * (c[-1][1] / c[0][1] - 1) h = M.idx["BTC"][M.pos[z]] / M.idx["BTC"][M.pos[a]] * 100 - 100 row.append("%+7.0f%%" % t); worst = min(worst, t); beats += t > h print("%-22s" % name + " ".join(row) + " %+6.0f%% %d/7" % (worst, beats))