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}