code wiki / (root) / nx_fin_assets_gate.nx

nx_fin_assets_gate.nx source

↩ module page · 44 lines · 2474 B

1// nx_fin_assets_gate.nx -- GATE for multi-asset forward pricing (tolerance, since exp is approximate). 2// Gold-like future: spot $100, r 5%, no carry, 1y -> F = 100*e^.05 = $105.13. FX: 1.10, dom 5% / for 3%, 1y 3// -> F = 1.10*e^.02 = 1.1222. Exits 0 iff all pass. license_tier: ORIGINAL 4import "nx_gate.nx" 5import "nx_fin_bs.nx" 6import "nx_fin_assets.nx" 7 8func chk_near(name: *u8, got: i64, want: i64, tol: i64, st: *i64) -> i64 { 9 var d: i64 = got - want; if d < 0 { d = 0 - d } 10 if d <= tol { st[0] = st[0] + 1; gw(" PASS " as *u8); gw(name); gw(" (" as *u8); gn(got); gw(")\n" as *u8) } 11 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) } 12 return 0 13} 14func chk(name: *u8, got: i64, want: i64, st: *i64) -> i64 { 15 if got == want { st[0] = st[0] + 1; gw(" PASS " as *u8); gw(name); gw("\n" as *u8) } 16 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) } 17 return 0 18} 19 20func main() -> i64 { 21 let st: *i64 = sys_mmap(16) as *i64 22 st[0] = 0; st[1] = 0 23 24 // futures cost-of-carry: $100 spot, 5% rate, no carry, 1y -> ~$105.13 25 let f1: i64 = af_futures_fwd(100000000, 50000, 0, 1000000) 26 chk_near("gold future F = $105.13" as *u8, f1, 105127100, 5000, st) 27 // carry splits the same rate: r 3% + carry 2% == 5% -> same forward 28 chk_near("carry+rate == combined rate" as *u8, af_futures_fwd(100000000, 30000, 20000, 1000000), 105127100, 5000, st) 29 // basis + contango 30 chk_near("futures basis = +$5.13" as *u8, af_basis(f1, 100000000), 5127100, 5000, st) 31 chk("future in contango" as *u8, af_contango(f1, 100000000), 1, st) 32 chk("backwardation detected" as *u8, af_contango(95000000, 100000000), 0, st) 33 34 // FX covered interest parity: 1.10, dom 5% / for 3%, 1y -> ~1.1222 35 let fx: i64 = af_fx_fwd(1100000, 50000, 30000, 1000000) 36 chk_near("EURUSD 1y fwd = 1.1222" as *u8, fx, 1122221, 800, st) 37 // lower domestic rate -> forward discount (F < S) 38 chk("low-dom-rate -> fwd discount" as *u8, af_contango(af_fx_fwd(1100000, 30000, 50000, 1000000), 1100000), 0, st) 39 40 gw("nx_fin_assets_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_assets: GREEN (futures cost-of-carry + FX interest-parity forwards)\n" as *u8); return 0 } 42 gw("nx_fin_assets: RED\n" as *u8) 43 return 1 44}