research: Arc 4 — breadth and beta controls; momentum candidate on FRA40

Runs the two surviving threads (H1 breakout, vol-normalized H1 momentum)
across the 21-instrument gapless universe under the wide-stop regimes,
beside an always-long beta control on the same matrix. The breakout dies
everywhere (beta on trending assets, significantly negative on FX);
momentum shows a one-sided positive cross-sectional tail with five
double-regime flags, of which FRA40 (both regimes) and NatGas (k6) beat
the no-signal baseline outright — the only control-beating cells of the
whole program. Includes the engine performance envelope (single run 2.97 s
vs Arc-0 ~3 s; 11-13 s/cell; executor fan-out findings refs
Brummel/Aura#268, data-gap abort refs Brummel/Aura#264).
This commit is contained in:
2026-07-13 18:36:57 +02:00
parent de92b4283d
commit ee1c15885b
4 changed files with 371 additions and 0 deletions
+96
View File
@@ -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 23 — the H1 breakout (XAUUSD cell) and
vol-normalized H1 momentum (US500 cell) — run across every archive instrument
with gapless 20182026 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.780.81 at P 0.0020.003 vs candidate +0.120.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) | 1113 s | Arc 1: 9.5 s/cell (no cost nodes) — +1525 % 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 | 493495 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.
+95
View File
@@ -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"
]
}
}
@@ -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"
]
}
}
@@ -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"
]
}
}