diff --git a/docs/arc-4-breadth-and-controls.md b/docs/arc-4-breadth-and-controls.md new file mode 100644 index 0000000..92e2c39 --- /dev/null +++ b/docs/arc-4-breadth-and-controls.md @@ -0,0 +1,96 @@ +# Arc 4 — breadth and beta controls: what survives 21 instruments and a no-signal baseline? + +**Date:** 2026-07-13 +**Engine:** aura @ `84e1075` (release build) +**Campaigns:** `research/campaign-arc4-breadth-{bo-h1,mom-vnorm}.json`, +`research/campaign-control-always-long{,-breadth}.json` + +## Method + +The two threads that survived Arcs 2–3 — the H1 breakout (XAUUSD cell) and +vol-normalized H1 momentum (US500 cell) — run across every archive instrument +with gapless 2018–2026 m1 coverage (21 instruments: 4 Arc-1 originals + US30, +NAS100, UK100, JPN225, HK50, FRA40, GBPUSD, USDJPY, AUDUSD, USDCAD, USDCHF, +NZDUSD, EURAUD, XAGUSD, NatGas, BTCUSD, ETHUSD; Copper dropped — its archive +is missing 2018-01..2018-10), under the two wide-stop regimes (vol{60, k6}, +vol{60, k12}), slippage cost, Arc-1 pipeline. + +Beside them ran the **beta control**: a constant bias=+1 blueprint (no signal +at all) on the same matrix. Every candidate cell is read against always-long +on the same (instrument, regime): a "positive" that does not beat the +no-signal baseline is long-beta in a trending market, not signal. + +## Findings + +1. **The breakout does not survive the control anywhere.** Its breadth flags + (pooled WF-OOS gross, P(E[R]≤0) < 0.15: ETHUSD, JPN225, XAUUSD both + regimes; XAGUSD, BTCUSD, US30 at k12) are all on assets that trended — + and on the metals and crypto the always-long baseline crushes it + (XAUUSD: control +0.78–0.81 at P 0.002–0.003 vs candidate +0.12–0.14 at + P 0.08). FX is the mirror image: the breakout is significantly *negative* + on EURUSD and EURAUD (P(≤0) up to 0.995). Verdict: the H1 channel + breakout, in every variant this project has tried (trend gate, vol gate, + H4 port, four stop regimes, costed and gross), is beta at best and + anti-signal on FX. This thread is closed. + +2. **Vol-normalized momentum shows a real cross-sectional lean.** 12 of 42 + cells flag at P < 0.15 — five instruments flag at P < 0.05 in *both* + regimes (USDJPY 0.000/0.010, ETHUSD 0.000/0.019, NatGas 0.017/0.020, + FRA40 0.018/0.024, US500 0.036/0.044) — while the negative tail is empty + (worst cell P = 0.845). Chance at this threshold across ~21 effective + tries produces roughly one such pair, not five with a one-sided tail. + +3. **Two momentum cells beat the no-signal baseline outright** — the only + ones in the whole program: + - **FRA40, both regimes:** candidate +0.140 (P 0.018) / +0.099 (P 0.024) + vs always-long −0.065 (P 0.670) / +0.051 (P 0.368). On an index whose + buy-and-hold R-stream is flat, the timing itself generates the + expectancy. + - **NatGas at k6:** +0.131 (P 0.017) vs +0.073 (P 0.338). + The other flags (USDJPY, ETHUSD, US500, NatGas k12) are "mixed": more + consistent than beta (lower P) but smaller per trade — with no + benchmark-relative stage in the pipeline (Brummel/Aura#263) they are not + distinguishable from diluted beta plus short-side noise. + +4. **Classification: candidate, not edge.** The FRA40/NatGas result is + gross of constant spread costs (slippage-only; per-instrument constant + costs on a 21-instrument matrix are inexpressible, Brummel/Aura#260), the + OOS bootstrap is gross-only (Brummel/Aura#259), and the effect is two + instruments out of 21. What it has earned is a focused follow-up arc: + per-instrument costed campaigns for the five double-flagged instruments, + a long-only vs long-short decomposition (does the short side contribute?), + and sensitivity outside the {24,72,120} grid. + +## Performance (is the engine in its expected envelope?) + +All numbers from this session's serial campaign loops on a 24-core box, +engine `84e1075` release: + +| workload | measured | baseline / expectation | +|---|---|---| +| single `aura run`, 8.5 y m1, GER40 | 2.97 s | Arc 0: "~3 s" ✓ | +| campaign cell (9-member grid + 90/30 WF + 1000-resample MC) | 11–13 s | Arc 1: 9.5 s/cell (no cost nodes) — +15–25 % with cost model, linear across 16 campaigns ✓ | +| FX cells vs index cells | ~2× | matches ~1.6× larger m1 files (tick density) ✓ | +| 42-cell breadth campaign | 493–495 s | linear ✓ | +| 42-cell one-member control | 98 s | streaming+WF dominates over member count | + +Not in the expected envelope, filed as engine findings: the executor +averages ~14 of 24 cores with a thread count oscillating 1 ↔ 240 +(unbounded per-sim fan-out bursts, multi-second 10-thread plateaus, +single-threaded valleys — Brummel/Aura#268, with NFS/page-cache +re-paging measured and ruled out: ~15 MB/s syscall reads vs ~73 KB/s on +the wire, 1.4 GB archive in ~12 GB page cache). A 21-instrument campaign +also aborts wholesale minutes into the run when one instrument has a data +gap (Copper), which the data-free validate cannot catch — +evidence attached to Brummel/Aura#264. + +## Verdict + +The exploration closes honest: every breakout variant is dead (beta or +anti-signal), four of six new families are nulls, and one family — +vol-normalized H1 momentum — leaves with a genuine, replicated, +control-beating candidate on FRA40 (and NatGas at k6) plus a one-sided +positive tail across the universe. Next work, in order of information per +compute: costed per-instrument reruns of the five double-flagged momentum +cells; a short-side decomposition; then, only if both hold, parameter +robustness beyond the coarse grid. diff --git a/research/campaign-arc4-breadth-bo-h1.json b/research/campaign-arc4-breadth-bo-h1.json new file mode 100644 index 0000000..faf09d8 --- /dev/null +++ b/research/campaign-arc4-breadth-bo-h1.json @@ -0,0 +1,95 @@ +{ + "format_version": 1, + "kind": "campaign", + "name": "arc4-breadth-bo-h1", + "description": "Arc 4 breadth test of the H1 breakout: the arc2c survivor question asked across the whole archive universe with gapless 2018-2026 m1 coverage (21 instruments: indices, FX majors and crosses, metals, energy, crypto; Copper dropped \u2014 its archive is missing 2018-01..2018-10). Wide-stop regimes only (vol{60,k6}, vol{60,k12}) where the XAUUSD cell survived deflation and costs; vol slippage cost. If the XAUUSD result is signal rather than gold-specific luck, related instruments (XAGUSD, other trending assets) should lean the same way; if it is isolated, the generalize floor and sign-agreement will say so.", + "seed": 0, + "data": { + "instruments": [ + "GER40", + "US500", + "EURUSD", + "XAUUSD", + "US30", + "NAS100", + "UK100", + "JPN225", + "HK50", + "FRA40", + "GBPUSD", + "USDJPY", + "AUDUSD", + "USDCAD", + "USDCHF", + "NZDUSD", + "EURAUD", + "XAGUSD", + "NatGas", + "BTCUSD", + "ETHUSD" + ], + "windows": [ + { + "from_ms": 1514764800000, + "to_ms": 1782863999999 + } + ] + }, + "risk": [ + { + "vol": { + "length": 60, + "k": 6.0 + } + }, + { + "vol": { + "length": 60, + "k": 12.0 + } + } + ], + "cost": [ + { + "vol_slippage": { + "slip_vol_mult": 0.1 + } + } + ], + "strategies": [ + { + "ref": { + "content_id": "82515a31bfe58ae087b4bd09eb4adb032cc2cabddd71a2761c543066bd237d3d" + }, + "axes": { + "channel_hi.length": { + "kind": "I64", + "values": [ + 24, + 48, + 96 + ] + }, + "channel_lo.length": { + "kind": "I64", + "values": [ + 24, + 48, + 96 + ] + } + } + } + ], + "process": { + "ref": { + "content_id": "41863fcae9300b334056c6f2a899e8c2672ecb29387d294e9a6e58f159ef51b4" + } + }, + "presentation": { + "persist_taps": [], + "emit": [ + "selection_report" + ] + } +} \ No newline at end of file diff --git a/research/campaign-arc4-breadth-mom-vnorm.json b/research/campaign-arc4-breadth-mom-vnorm.json new file mode 100644 index 0000000..8c29f8f --- /dev/null +++ b/research/campaign-arc4-breadth-mom-vnorm.json @@ -0,0 +1,95 @@ +{ + "format_version": 1, + "kind": "campaign", + "name": "arc4-breadth-mom-vnorm", + "description": "Arc 4 breadth test of vol-normalized H1 momentum: the only family with a regime-robust WF-OOS positive (US500, P(E[R]<=0) < 0.05 in all three arc3 regimes) asked across the 21-instrument universe. Wide-stop regimes (vol{60,k6}, vol{60,k12}), vol slippage cost. If risk-adjusted momentum is a genuine cross-asset effect, the index family should lean positive together; a lone US500 flag with 0-sign-agreement elsewhere reads as selection luck across the arc3 program.", + "seed": 0, + "data": { + "instruments": [ + "GER40", + "US500", + "EURUSD", + "XAUUSD", + "US30", + "NAS100", + "UK100", + "JPN225", + "HK50", + "FRA40", + "GBPUSD", + "USDJPY", + "AUDUSD", + "USDCAD", + "USDCHF", + "NZDUSD", + "EURAUD", + "XAGUSD", + "NatGas", + "BTCUSD", + "ETHUSD" + ], + "windows": [ + { + "from_ms": 1514764800000, + "to_ms": 1782863999999 + } + ] + }, + "risk": [ + { + "vol": { + "length": 60, + "k": 6.0 + } + }, + { + "vol": { + "length": 60, + "k": 12.0 + } + } + ], + "cost": [ + { + "vol_slippage": { + "slip_vol_mult": 0.1 + } + } + ], + "strategies": [ + { + "ref": { + "content_id": "05045dfaa1e399c12505e21dc87c36a61b7bbfda75c0bebc2e95a9be5bfd9e42" + }, + "axes": { + "mom_lag.lag": { + "kind": "I64", + "values": [ + 24, + 72, + 120 + ] + }, + "vol_avg.length": { + "kind": "I64", + "values": [ + 24, + 72, + 120 + ] + } + } + } + ], + "process": { + "ref": { + "content_id": "41863fcae9300b334056c6f2a899e8c2672ecb29387d294e9a6e58f159ef51b4" + } + }, + "presentation": { + "persist_taps": [], + "emit": [ + "selection_report" + ] + } +} \ No newline at end of file diff --git a/research/campaign-control-always-long-breadth.json b/research/campaign-control-always-long-breadth.json new file mode 100644 index 0000000..dbab076 --- /dev/null +++ b/research/campaign-control-always-long-breadth.json @@ -0,0 +1,85 @@ +{ + "format_version": 1, + "kind": "campaign", + "name": "control-always-long-breadth", + "description": "Beta control for the arc4 breadth tests: the constant bias=+1 strategy on the full 21-instrument universe under the arc4 regimes (vol{60,k6}, vol{60,k12}) and slippage cost. Every arc4 candidate cell is read against this baseline: a candidate whose pooled-OOS statistics do not clearly beat always-long on the same instrument and regime is long-beta, not signal.", + "seed": 0, + "data": { + "instruments": [ + "GER40", + "US500", + "EURUSD", + "XAUUSD", + "US30", + "NAS100", + "UK100", + "JPN225", + "HK50", + "FRA40", + "GBPUSD", + "USDJPY", + "AUDUSD", + "USDCAD", + "USDCHF", + "NZDUSD", + "EURAUD", + "XAGUSD", + "NatGas", + "BTCUSD", + "ETHUSD" + ], + "windows": [ + { + "from_ms": 1514764800000, + "to_ms": 1782863999999 + } + ] + }, + "risk": [ + { + "vol": { + "length": 60, + "k": 6.0 + } + }, + { + "vol": { + "length": 60, + "k": 12.0 + } + } + ], + "cost": [ + { + "vol_slippage": { + "slip_vol_mult": 0.1 + } + } + ], + "strategies": [ + { + "ref": { + "content_id": "198ca420039925af330f120376836d9c49a167b26e81324cb4857f5c20f81a44" + }, + "axes": { + "always_long.value": { + "kind": "F64", + "values": [ + 1.0 + ] + } + } + } + ], + "process": { + "ref": { + "content_id": "41863fcae9300b334056c6f2a899e8c2672ecb29387d294e9a6e58f159ef51b4" + } + }, + "presentation": { + "persist_taps": [], + "emit": [ + "selection_report" + ] + } +} \ No newline at end of file