Continuation of phase 10's two documented candidate probes, executed with the
same cal/held-out protocol. Both fail. Full artifacts:
data/processed/alpaca/pipeline_extended/probes_phase11.json; engine change:
backtest_long_flat(..., signal_mask=) (regression-tested, 12 → 16 tests in
test_alpaca_backtest.py + new tests/test_alpaca_pairs.py, data/alpaca/pairs.py).
Probe A — regime-conditional entry (volatility filter)
Gate day-horizon cells' entries on a trailing 20-bar realized-vol percentile band (calm-only or elevated-only), band calibrated on the CAL half, applied to the held-out half; model quantile FIXED at 0.90 (no re-selection).
ETH/USD 1Hour h24 (the phase-10 champion cell):
| filter | cal net (bps) | held-out net (bps) | held-out n | held-out Sharpe |
|---|---|---|---|---|
| none (q0.90) | −25,704 | −109,987 | 653 | −10.7 |
| calm < p30 | +1,203 | −104,288 | 38 | −95.3 |
| calm < p50 | +8,268 | −108,958 | 167 | −22.4 |
| calm < p70 | −19,463 | −123,815 | 447 | −16.7 |
| elevated > p30 | −50,642 | −134,155 | 590 | −14.4 |
| elevated > p70 | −7,353 | −190,603 | 181 | −63.8 |
SOL/USD 4Hour h6: only 10 held-out signals at fixed q0.90 (pred mass sits in the first half of OOS), every row with n ≥ 3 is negative on hold-out (e.g. elevated > p30: cal +12,578 → held-out −24,128).
Conclusion: no volatility-regime band converts the day-horizon model into a held-out-validated profit. The phase-10 gradient was 2025-specific; regime gating does not restore it.
Probe B — cross-sectional SOL-vs-ETH ratio mean reversion
ratio = log(SOL/USD) − log(ETH/USD) on aligned 1Day bars (1,636 shared
days, 2021-01-01 → 2026-08-16); z = (ratio − trailing mean_w)/std_w;
z ≤ −z_thr → long SOL; z ≥ +z_thr → long ETH; else flat. Both legs long/flat,
never simultaneously (no shorting). h = 1 day, maker costs, entries at next
open. Calibrated on the first half, validated on the second.
| window | z_thr | cal n (SOL, ETH) | cal net (bps) | val n (SOL, ETH) | val net (bps) |
|---|---|---|---|---|---|
| 20 | 1.0 | 262, 181 | −3,734 | 248, 174 | −6,901 |
| 20 | 1.5 | 146, 100 | −4,769 | 123, 101 | −6,853 |
| 20 | 2.0 | 60, 40 | −2,556 | 42, 50 | −3,707 |
| 20 | 2.5 | 21, 16 | +2,077 | 13, 22 | −1,685 |
| 60 | 1.0 | 240, 224 | −4,470 | 271, 167 | −4,813 |
| 60 | 1.5 | 111, 111 | −2,450 | 158, 95 | −2,132 |
| 60 | 2.0 | 42, 55 | −1,374 | 62, 50 | −1,712 |
| 60 | 2.5 | 18, 20 | +1,686 | 18, 27 | −290 |
| 90 | 1.0 | 222, 187 | −9,504 | 267, 122 | −2,600 |
| 90 | 1.5 | 120, 80 | −3,692 | 151, 67 | +129 |
| 90 | 2.0 | 61, 45 | −2,665 | 54, 39 | +861 |
| 90 | 2.5 | 26, 27 | −831 | 26, 19 | −694 |
Only 2 of 12 cells are cal-positive (both at z=2.5) and both invert on the held-out half; the best held-out cell (w90 z2.0) is negative on calibration. No (window, threshold) cell is positive on both halves — no tradeable pair reversion at 1-day horizon.
Overall conclusion — stay flat (unchanged)
Both untested probes are now tested and rejected under the held-out protocol. Cumulative evidence across phases 9-11 (≈120 evaluated configurations):
| evidence family | result |
|---|---|
| 1Min/5Min quote-era models (8 cells) | IC ≈ 0, net = −fees exactly |
| 1H/4H/1Day + bar-only full-history (16+ cells) | gross ↑ with horizon, still < fee floor |
| Quantile calibration (day cells) | fake gradient, 2025-regime artifact |
| Regime-conditional entry | fails held-out at every band |
| SOL-vs-ETH ratio mean reversion (12 cells) | negative both halves everywhere |
The system remains flat, by evidence rather than by default. New durable
capabilities added: signal_mask engine hook, data/alpaca/pairs.py
(pair z-score machinery, offline-testable), and the cal/held-out evaluation
protocol applied to every new claim. Full suite: 312 passed, 2 skipped +
new pairs tests (16 in backtest+pairs modules) — run pytest to confirm.