nx_fin_paper_gate.nx source
↩ module page · 52 lines · 2872 B
1// nx_fin_paper_gate.nx -- R5 GATE: proves the in-sample/out-of-sample split, the OOS-only backtest run, and the
2// edge-survival test. Reuses the 5-bar fixture: split=0 reproduces the full-series result (net +6250); split=3
3// runs ONLY bars[3,4] (signals 1,0) -> a single losing OOS trade (net -41650). Exits 0 iff all pass.
4// license_tier: ORIGINAL
5import "nx_gate.nx"
6import "nx_fin_marketdata.nx"
7import "nx_fin_backtest.nx"
8import "nx_fin_paper.nx"
9
10func chk(name: *u8, got: i64, want: i64, st: *i64) -> i64 {
11 if got == want { st[0] = st[0] + 1; gw(" PASS " as *u8); gw(name); gw("\n" as *u8) }
12 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) }
13 return 0
14}
15
16func main() -> i64 {
17 let st: *i64 = sys_mmap(16) as *i64
18 st[0] = 0; st[1] = 0
19
20 // -- split arithmetic --
21 chk("split 10 @70% = 7" as *u8, pp_split(10, 7000), 7, st)
22 chk("split 10 @50% = 5" as *u8, pp_split(10, 5000), 5, st)
23 chk("split 100 @25% = 25" as *u8, pp_split(100, 2500), 25, st)
24
25 let csv: *u8 = "Date,Open,High,Low,Close,Volume\n2024-01-02,10.00,10.00,10.00,10.00,1000000\n2024-01-03,11.00,11.00,11.00,11.00,1000000\n2024-01-04,10.50,10.50,10.50,10.50,1000000\n2024-01-05,12.00,12.00,12.00,12.00,1000000\n2024-01-06,11.50,11.50,11.50,11.50,1000000\n" as *u8
26 var n: i64 = 0; while csv[n] != (0 as u8) { n = n + 1 }
27 let bars: *i64 = sys_mmap(8 * MD_FIELDS * 16) as *i64
28 let nbars: i64 = md_parse_csv(csv, n, bars, 16)
29 let sig: *i64 = sys_mmap(8 * 8) as *i64
30 sig[0]=1; sig[1]=1; sig[2]=0; sig[3]=1; sig[4]=0
31 let out: *i64 = sys_mmap(8 * 16) as *i64
32
33 // -- OOS run, split=0 -> whole series (matches R2: 2 trades, net +6250) --
34 pp_oos_run(bars, nbars, sig, 0, 1000000, 0, 0, 0, 0, out)
35 chk("OOS split=0 n_trades = 2" as *u8, out[BT_TRADES], 2, st)
36 chk("OOS split=0 net = +6250" as *u8, out[BT_NET], 6250, st)
37
38 // -- OOS run, split=3 -> only bars[3,4] with signals [1,0]: one losing trade (net -41650) --
39 pp_oos_run(bars, nbars, sig, 3, 1000000, 0, 0, 0, 0, out)
40 chk("OOS split=3 n_trades = 1" as *u8, out[BT_TRADES], 1, st)
41 chk("OOS split=3 net = -41650" as *u8, out[BT_NET], 0 - 41650, st)
42
43 // -- edge survival: in-sample expectancy 3000; needs OOS>0 AND >= 50% of IS (1500) --
44 chk("edge survives (oos 2000 >= 1500)" as *u8, pp_edge_survives(3000, 2000, 5000), 1, st)
45 chk("edge dead (oos negative)" as *u8, pp_edge_survives(3000, 0 - 100, 5000), 0, st)
46 chk("edge decayed (oos 1000 < 1500)" as *u8, pp_edge_survives(3000, 1000, 5000), 0, st)
47
48 gw("nx_fin_paper_gate: PASS=" as *u8); gn(st[0]); gw(" FAIL=" as *u8); gn(st[1]); gw("\n" as *u8)
49 if st[1] == 0 { gw("R5 nx_fin_paper: GREEN (out-of-sample overfit check proven)\n" as *u8); return 0 }
50 gw("R5 nx_fin_paper: RED\n" as *u8)
51 return 1
52}