nx_fin_advstats_gate.nx source
↩ module page · 42 lines · 2336 B
1// nx_fin_advstats_gate.nx -- GATE for the deflated-Sharpe / multiple-testing suite, hand-computed. The headline:
2// a Sharpe that looks significant alone (t=5) can FAIL once deflated for having tried 4 strategies -- exactly
3// our tournament's trap. Exits 0 iff all pass. license_tier: ORIGINAL
4import "nx_gate.nx"
5import "nx_fin_metrics.nx"
6import "nx_fin_advstats.nx"
7
8func chk(name: *u8, got: i64, want: i64, st: *i64) -> i64 {
9 if got == want { st[0] = st[0] + 1; gw(" PASS " as *u8); gw(name); gw("\n" as *u8) }
10 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) }
11 return 0
12}
13
14func main() -> i64 {
15 let st: *i64 = sys_mmap(16) as *i64
16 st[0] = 0; st[1] = 0
17
18 // Sharpe t-stat = SR*sqrt(N-1): SR 0.5 over 101 obs -> t 5.0 (5000 milli)
19 chk("t-stat SR0.5 N101 = 5000" as *u8, as_sharpe_tstat_milli(500, 101), 5000, st)
20 chk("t-stat SR0.2 N101 = 2000" as *u8, as_sharpe_tstat_milli(200, 101), 2000, st)
21 chk("t-stat N<=1 = 0" as *u8, as_sharpe_tstat_milli(500, 1), 0, st)
22
23 // multiple-testing expected-max table sqrt(2 ln T) x1000
24 chk("maxZ T=1 = 0" as *u8, as_max_z_milli(1), 0, st)
25 chk("maxZ T=4 = 1665" as *u8, as_max_z_milli(4), 1665, st)
26 chk("maxZ T=8 = 2036" as *u8, as_max_z_milli(8), 2036, st)
27 chk("maxZ T=16 = 2354" as *u8, as_max_z_milli(16), 2354, st)
28 chk("maxZ T=100 = 3035" as *u8, as_max_z_milli(100), 3035, st)
29
30 // deflated SR: best 0.5, trial-std 0.2, 4 trials -> haircut 0.2*1.665=0.333 -> 0.167
31 chk("deflated SR = 167 milli" as *u8, as_deflated_sr_milli(500, 200, 4), 167, st)
32
33 // significance AFTER deflation (the honest tournament gate)
34 chk("strong edge survives deflation (t>2)" as *u8, as_deflated_significant(800, 100, 4, 101, 2000), 1, st)
35 chk("mediocre 0.5 SR FAILS after 4-trial deflation" as *u8, as_deflated_significant(500, 200, 4, 101, 2000), 0, st)
36 chk("weak edge deflates below zero -> fail" as *u8, as_deflated_significant(300, 200, 4, 101, 2000), 0, st)
37
38 gw("nx_fin_advstats_gate: PASS=" as *u8); gn(st[0]); gw(" FAIL=" as *u8); gn(st[1]); gw("\n" as *u8)
39 if st[1] == 0 { gw("nx_fin_advstats: GREEN (deflated-Sharpe multiple-testing correction proven)\n" as *u8); return 0 }
40 gw("nx_fin_advstats: RED\n" as *u8)
41 return 1
42}