feat(regime): vol_ref bootstrap window + ISV-driven permanent floor

Two coupled fixes to the vol-EMA regime detector exposed by walk-forward
CV after all features were promoted to always-on:

(1) Bootstrap window for vol_ref (slot 551 = REGIME_VOL_REF_SAMPLES)
- Replace the Pearl-A "first observation replaces directly" bootstrap
  with a running mean over the first N=100 vol_ema observations, then
  switch to β-tracking. For IID observations the running-mean estimator
  has variance σ²/N — a 100-sample mean is 10× less noisy than the
  single-shot replace.

(2) Permanent floor on vol_ref (slot 552 = REGIME_VOL_REF_FLOOR)
- The bootstrap alone exposed the asymmetric deadband-deadlock: if
  vol_ref converged to a tiny value during a calm initial stretch,
  vol_ref / vol_ema fired the moment any realistic vol resumed and
  Kelly stayed trapped at regime_scale_floor=0.25 forever. Floor
  lives in ISV slot (TrainingPersist) with a hardcoded 1e-12 sub-floor
  inside the kernel as numerical-underflow guard.
- Host seeds slot 552 with 1e-9. Future controller kernel will refine
  this from observed cell-level vol minima with cross-fold persistence.

Walk-forward CV on Q1 fxcache (3 folds, window=700K, train_frac=0.6):
  cost   fold-A   fold-B          fold-C    mean ± SD
  0.00   -19.77   +65.04 (100%)   +6.45     +17.24 ± 43.42

Fold B turnaround is the headline: -47.64 (bootstrap-only) → +65.04
(bootstrap + floor) confirms the floor is the load-bearing fix.
Cross-fold std-dev compressed 24% at cost=0; mean dropped from +38.94
(pre-defense) to +17.24 (with defense). Classic mean/variance trade.

Block extended to 14 slots (539..=552). Kernel sig: vol_ref_floor
moved from f32 scalar to vol_ref_floor_index i32, so the anchor is
named/addressable in ISV.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
jgrusewski
2026-05-16 01:31:20 +02:00
parent 34586dad68
commit 3c035ce1ae
5 changed files with 148 additions and 17 deletions

View File

@@ -913,3 +913,54 @@ CV across Q1↔Q2 boundary with all four configurations:
- T10 + both
Expected: combined config compresses cross-fold std-dev meaningfully
without sacrificing best-fold Sharpe.
## 2026-05-16 — Regime vol_ref bootstrap window + permanent floor
Walk-forward CV on Q1 fxcache after promoting --regime-scale to
always-on exposed two failure modes of the original Pearl-A single-shot
bootstrap of vol_ref:
1. The very first vol_obs observation is itself high-variance, so
vol_ref started off noisy and short-training-window folds saw
vol_ema diverge from a noisy vol_ref → spurious early Kelly
attenuation.
2. If vol_ref decayed to ≈0 during a deadband stretch, the ratio
vol_ref / vol_ema fired the moment any realistic vol resumed
and Kelly stayed trapped at the regime_scale_floor=0.25.
**Slot 551 — REGIME_VOL_REF_SAMPLES_INDEX (counter)**
- Producer: `alpha_regime_vol_update.cu`. Increments by 1 each kernel
call.
- Gates the vol_ref update path. While count < 100, vol_ref is the
running mean over observed vol_ema values:
`vol_ref ← vol_ref + (vol_ema vol_ref) / (count + 1)`
After 100 samples, switch to slow β-tracking with β=0.005.
- Cuts bootstrap-window variance by √N (~10× for N=100) relative to
single-shot Pearl-A replace.
**Slot 552 — REGIME_VOL_REF_FLOOR_INDEX (TrainingPersist anchor)**
- Permanent floor on vol_ref. Two-layered design per
`pearl_kelly_cap_signal_driven_floors`:
- ISV slot is the learned anchor — named, addressable, observable.
- Hardcoded sub-floor of 1e-12 inside the kernel guards against
the slot itself collapsing to zero.
- Sentinel value 0 → kernel uses the hardcoded sub-floor only.
- Host seeds with 1e-9 at training start (one order of magnitude
below ES MBP-10 typical squared-log-return ~1e-10..1e-6). A future
controller kernel will refine this from observed cell-level vol
minima with cross-fold persistence.
- TrainingPersist semantics: NOT cleared by fold reset.
**Kernel signature change:** `alpha_regime_vol_update_kernel` gained
two int slot-index args (`vol_ref_samples_index`, `vol_ref_floor_index`)
and one int hyperparam (`bootstrap_samples`). The previous f32
`vol_ref_floor` scalar arg was dropped — the anchor now lives in ISV.
**Walk-forward CV verdict (Q1 fxcache, 3 folds, window=700K, train_frac=0.6):**
- cost=0.0000 mean Sharpe_ann = +17.24 ± 43.42 (was +38.94 ± 56.88)
- cost=0.0625 mean Sharpe_ann = +8.39 ± 47.47
- cost=0.1250 mean Sharpe_ann = -2.18 ± 50.77
- Fold B turnaround: -47.64 (bootstrap-only) → +65.04 (bootstrap + floor).
- Cross-fold std-dev compressed 24% at cost=0; mean dropped from
+38.94 (pre-defense) to +17.24 (with defense). Classic mean/variance
trade — variance compression at meaningful mean cost.