code wiki / (root) / nx_fin_metrics_gate.nx

nx_fin_metrics_gate.nx source

↩ module page · 44 lines · 2235 B

1// nx_fin_metrics_gate.nx -- GATE for the risk-adjusted metrics on a hand-computed returns series (bps): 2// [100, -50, 200, -100, 150] -> mean=60, stddev=115, Sharpe(x1000)=521, downside_dev(mar=0)=50, 3// Sortino(x1000)=1200. Plus isqrt spot-checks. Exits 0 iff all pass. license_tier: ORIGINAL 4import "nx_gate.nx" 5import "nx_fin_metrics.nx" 6 7func chk(name: *u8, got: i64, want: i64, st: *i64) -> i64 { 8 if got == want { st[0] = st[0] + 1; gw(" PASS " as *u8); gw(name); gw("\n" as *u8) } 9 else { st[1] = st[1] + 1; gw(" FAIL " as *u8); gw(name); gw(" got=" as *u8); gn(got); gw(" want=" as *u8); gn(want); gw("\n" as *u8) } 10 return 0 11} 12 13func main() -> i64 { 14 let st: *i64 = sys_mmap(16) as *i64 15 st[0] = 0; st[1] = 0 16 17 // -- integer sqrt primitive -- 18 chk("isqrt(144) = 12" as *u8, me_isqrt(144), 12, st) 19 chk("isqrt(2500) = 50" as *u8, me_isqrt(2500), 50, st) 20 chk("isqrt(13400) = 115 (floor)" as *u8, me_isqrt(13400), 115, st) 21 chk("isqrt(0) = 0" as *u8, me_isqrt(0), 0, st) 22 chk("isqrt(1000000) = 1000" as *u8, me_isqrt(1000000), 1000, st) 23 24 // -- returns series (bps) -- 25 let r: *i64 = sys_mmap(8 * 8) as *i64 26 r[0]=100; r[1]=0-50; r[2]=200; r[3]=0-100; r[4]=150 27 chk("mean = 60 bps" as *u8, me_mean(r, 5), 60, st) 28 chk("stddev = 115 bps" as *u8, me_stddev(r, 5), 115, st) 29 chk("Sharpe x1000 (rf=0) = 521" as *u8, me_sharpe_milli(r, 5, 0), 521, st) 30 chk("downside_dev (mar=0) = 50 bps" as *u8, me_downside_dev(r, 5, 0), 50, st) 31 chk("Sortino x1000 (mar=0) = 1200" as *u8, me_sortino_milli(r, 5, 0), 1200, st) 32 33 // -- degenerate: zero-variance series -> Sharpe 0 (no risk signal), all-positive -> downside_dev 0 -- 34 let flat: *i64 = sys_mmap(8 * 4) as *i64 35 flat[0]=50; flat[1]=50; flat[2]=50 36 chk("flat series stddev = 0" as *u8, me_stddev(flat, 3), 0, st) 37 chk("flat series Sharpe = 0 (sd guard)" as *u8, me_sharpe_milli(flat, 3, 0), 0, st) 38 chk("all-above-mar downside_dev = 0" as *u8, me_downside_dev(flat, 3, 0), 0, st) 39 40 gw("nx_fin_metrics_gate: PASS=" as *u8); gn(st[0]); gw(" FAIL=" as *u8); gn(st[1]); gw("\n" as *u8) 41 if st[1] == 0 { gw("nx_fin_metrics: GREEN\n" as *u8); return 0 } 42 gw("nx_fin_metrics: RED\n" as *u8) 43 return 1 44}