ID: S028
Slug: short-term-reversion-rsi2-stop-v1
Run date: 2026-06-30
Outcome: FAILED
Headline metric: Arm 1 mean −0.107%/trade (edge half: gate > baseline + 0.15%)
Fail reason: The protective stop caps the intraday tail (CVaR-95 −13.2% → −8.5%) but cannot catch the overnight-gap killers (worst trade still −68.7%, gate −15%), worsens the portfolio drawdown (71% → 79%), and erases the thin edge (mean +0.058% → −0.107%, not significant). Fails both halves of the gate at every K tested. Exactly the pre-registered forecast.
What we tested
A two-arm A/B, one run, identical data and universe. Arm 0 reproduces S027 exactly (a harness sanity check — it matches to the decimal). Arm 1 adds one frozen element: an ATR-normalised protective stop, stop = entry_fill − K × ATR₁₄, static, evaluated intraday with gap-through honoured (open ≤ stop → fill at the open; else low ≤ stop → fill at the stop level), taking precedence over S027's 5-DMA / 10-day exits. Everything else — universe, survivorship-free monthly basket, RSI-2 < 10 & close > 200-DMA signal, T+1 entry, 30 bps friction, matched random-entry baseline, 2010 → 2026-05, 145,880 trades — is frozen identical to S027.
K was frozen by rule, before the level was known (§5): for every S027 trade, the maximum adverse excursion in ATR units. Eventual winners bottom shallow (median 0.46 ATR, P90 1.29 ATR); losers far deeper (median 1.95 ATR). K = the 90th percentile of winners' depth = 1.29 — placing the stop just beyond where ~90% of normal winning dips turn, so by construction it stops out ~10% of would-be winners. This is a rule, not a fit; K-sensitivity is reported below, never optimised.
What we found
Arm 1 must clear both halves — cap the tail and keep the edge. It clears neither.
| Gate (applied to Arm 1) | Required | Observed | Verdict |
|---|---|---|---|
| Tail — CVaR-95 | ≥ −8% | −8.5% (from −13.2%) | FAIL (close) |
| Tail — worst single trade | ≥ −15% | −68.7% | FAIL |
| Tail — portfolio max drawdown | ≤ 25% | 79% (from 71%) | FAIL |
| Edge — magnitude vs baseline | ≥ +0.15%/trade | mean −0.107%, edge ≈ 0 | FAIL |
| Edge — significance | p < 0.05, right sign | p = 0.61 | FAIL |
| Win rate (reported) | — | 55.0% (from 60.6%) | — |
| Arm 0 — no stop (= S027) | Arm 1 — stop (K=1.29) | |
|---|---|---|
| Mean net return / trade | +0.058% | −0.107% |
| Win rate | 60.6% | 55.0% |
| CVaR-95 | −13.2% | −8.5% |
| Worst trade | −80.0% | −68.7% |
| Portfolio max drawdown | 71% | 79% |
The stop did its intraday job (CVaR and worst both improved) and still failed — because what it removed from the tail it took out of the edge, and the deepest losses were overnight gaps it never saw.
Why a stop can't win here (§9 covariates): of 48,175 stop exits, 13% filled at a gapped-down open rather than the stop level — that is the slice of the tail a resting intraday order structurally cannot catch, and it contains the −57% to −69% killers. The stop caught 70% of eventual losers but also 9.3% of eventual winners (≈ the 10% the K-rule budgeted) — and on a +0.06% edge, cutting ~1-in-11 winners is enough to flip the mean negative.
K-sensitivity (reported, not optimised) — the bind is structural:
| K | CVaR-95 | Worst trade | Edge vs baseline |
|---|---|---|---|
| P85 = 1.08 ATR | −7.7% (passes) | −68.7% | −0.044% |
| P90 = 1.29 ATR | −8.5% | −68.7% | −0.022% |
| P95 = 1.63 ATR | −9.5% | −68.7% | +0.020% |
Tighten K and CVaR passes but the edge is more negative; loosen it and the edge recovers toward zero but CVaR worsens. Worst-trade is stuck at −68.7% at every K — the overnight gaps are immune to any stop level. There is no setting that clears both halves.
Why this matters
This is a pre-registered remedy, tested cleanly, and honestly cut — the highest-value kind of negative result. It rules out the most obvious fix and tells us why it fails, which redirects the search precisely. The improvement in CVaR is real and worth remembering; the lesson is that a per-trade stop addresses neither of the two things that actually killed S027 — overnight idiosyncratic gaps and portfolio over-exposure.
What this doesn't tell us yet
- It does not say "stops are useless" — it says an intraday protective stop, at any K, cannot rescue this configuration, because the tail is overnight and the edge is too thin to spend on stopped winners.
- The portfolio-drawdown comparison uses the spec's fully-invested equal-weight book (no exposure cap) — the same conservative definition as S027; the stop making it worse is itself the signal that exposure, not per-trade risk, is the binding problem.
What happens next
No Stage 2. Per the swing-pillar rules each is a new S-NNN, and S028's result points at the two mechanisms a stop cannot address — both already deferred in the ledger:
- Exposure sizing — a concurrency cap or volatility target for the 71–79% drawdown (an exposure problem, not a per-trade one).
- Single-name-collapse avoidance — a pre-specified earnings/event blackout or deterioration screen for the overnight idiosyncratic gaps, never fitted to these losers (the D-001 lesson).
- A market-regime entry filter stays de-prioritised: S027's clustering covariate already showed the tail is idiosyncratic, not market-clustered.
S028 is recorded failed; family B1's cumulative trial count stays at 2.
What we tested — the recipe
Slice & dice
For the specialist — methodology details (click to expand)
- Arm 0 replication: mean +0.058%, CVaR-95 −13.2%, worst −80.0%, DD 71%, n = 145,880 — matches the published S027 result exactly (harness verified).
- Arm 1 (K=1.29 ATR): mean −0.107%, edge vs matched baseline ≈ −0.02% (p = 0.61), CVaR-95 −8.5%, worst −68.7%, DD 79%, win 55.0%, n = 145,880.
- Stop mechanics: 48,175 stop exits (41,971 intraday-touch fill at the stop, 6,204 gap-through fill at the open); 97,705 trades reached the base 5-DMA/time exit unchanged. Overnight-gap-through share 12.9%. Eventual winners stopped 9.3%; eventual losers stopped 69.6%.
- K derivation: winners' MAE depth percentiles (ATR units) P50 0.46 / P75 0.83 / P85 1.08 / P90 1.29 / P95 1.63; losers' P50 1.95 / P75 3.07 / P90 4.62. K = P90 of winners = 1.29.
- Look-ahead controls (delta vs S027): gap-through fills at open(T), never at the stop; ATR₁₄ on adjusted prices through close(T); stop fixed at entry, not trailing. All S027 controls inherited (survivorship-free PIT, split/dividend-adjusted, indicators through close(T)).
- Reproducibility note: strategy metrics are deterministic; the matched random-entry baseline carries small run-to-run sampling variation (bounded, does not affect the verdict — the edge is within noise of zero at every K).
- Artifacts:
trades.parquet(Arm 1),ab_summary.json(both arms, gates, K-sensitivity, covariates),charts.json. Runner:lab/quickkill/short-term-reversion-rsi2-stop-v1/run.py(reuses the S027 engine; Arm 0 = S027).