research: Arc 1 — trend regime vs H1 breakout, campaign path, results page

Two std-vocabulary blueprints (bo_h1 donchian-style H1 breakout; bo_h1_trend
adds a post-latch EMA 12/48 regime gate). First real use of the campaign
path: process + campaign documents registered and run as executable intent
(screen 490d14df.., curves da886931.. with persisted taps).

Finding: the gate reshapes the R-distribution per instrument (GER40 flips
sign, EURUSD deteriorates); no deployable edge (best P(E[R]<=0)=0.08,
generalization floor negative, sign agreement 0/4, all gross of costs).

site/: build.py bakes a fully static index.html from the runs/ registry
(aura.css embedded verbatim, inline SVG, zero external requests);
adversarially verified — all baked figures re-derived from the registry.
This commit is contained in:
2026-07-13 16:23:51 +02:00
parent 221c408ac7
commit cdd4503164
10 changed files with 1414 additions and 0 deletions
+63
View File
@@ -0,0 +1,63 @@
# Arc 1 — does a trend regime reshape the H1 breakout's R-distribution?
**Date:** 2026-07-13
**Engine:** aura @ `1ebb94c` (release build)
**Results page:** `site/index.html` (build: `python3 site/build.py`)
## Hypothesis
Following the orthogonal confirm/refute research model: a lone signal is not
expected to be profitable; the question is whether a *conditioner* B reshapes
the R-distribution of a base signal A. Here A = an H1 donchian-style breakout
(`blueprints/bo_h1.json`), B = an EMA(12)/EMA(48) trend regime that gates the
held breakout state post-latch (`blueprints/bo_h1_trend.json`) — a held
breakout is cut the moment the regime flips against it.
## Method (campaign path, first real use)
Everything ran as registered research documents — no ad-hoc verb flags:
- `research/process-screen.json` — sweep (deflated argmax on sqn_normalized)
→ 90/30-day rolling walk-forward refit → 1000-resample block-5 R-bootstrap
pooled over WF OOS trades → cross-instrument generalize (expectancy_r).
- `research/campaign-arc1.json` (id `490d14df…`) — both variants × 4
instruments (GER40, US500, EURUSD, XAUUSD) × window 2018-01-01..2026-06-30,
channel axes {24,48,96}², risk Vol{3, 2.0}, seed 0. 8 cells, 76 s wall.
- `research/campaign-arc1-curves.json` (id `da886931…`) — both variants at
default params, taps persisted (equity, exposure, r_equity) for the page.
No cost block: all R figures are **gross** (net == gross).
## Findings
1. **The gate reshapes the R-distribution, instrument-dependently** (pooled
WF-OOS bootstrap, mean E[R] and P(E[R] ≤ 0)):
- GER40 **flips sign**: 0.151 (P≤0 = 0.90) → +0.139 (P≤0 = 0.18)
- US500 improves: +0.193 (0.10) → +0.205 (0.08)
- EURUSD deteriorates sharply: 0.150 (0.88) → 0.204 (0.99)
- XAUUSD roughly flat: +0.170 (0.14) → +0.124 (0.15)
This is the conditional effect the research model looks for: B is not a
uniform improvement, it is a per-instrument reshaping.
2. **No deployable edge.** Best cell P(E[R] ≤ 0) ≈ 0.08 (US500 gated) — not
significant against 8 comparisons; generalization worst-case is deeply
negative for both variants with sign agreement 0/4; and all of it is
gross of costs.
3. **Selection instability.** The full-window IS argmax picks asymmetric
channels (e.g. hi=96/lo=24) that wander across WF windows — the deflation
and param-stability records show the screen overfitting the grid, which
the WF/MC stages correctly deflate.
## Verdict
Honest null on deployability; positive on the machinery and on the research
question's shape: the conditional framing (B reshapes A) is measurable with
the recorded artifacts alone (MC quantile bands per cell). Arc 2 candidates:
a costed rerun (constant + vol-slippage cost blocks) to see what survives
gross-to-net, an orthogonal conditioner (time-of-day / volatility tercile),
or the same pair on coarser bars (H4).
## Engine friction
None. The campaign path (process/campaign documents, three-tier validate,
`aura campaign run` as executor, persist_taps traces) carried the whole arc
on its first real use.