# MLP Hybrid Grouped-Input Experiment — BTC 6H

## Decision

Do not promote the hybrid-grouped architecture. Combining eight semantic specialists with eight dense cross-family units improved the best in-sample Calmar modestly over the fully logical-grouped models, but it remained far below the promoted dense `55→16→8→1` baseline and had materially worse maximum drawdown. It also did not consistently beat the matched random-sparse control.

WFO is internal historical validation, not true out-of-sample evidence. It is reported here as a stability diagnostic only and must not override the in-sample return/drawdown regression.

## Architecture and provenance

`hybrid_grouped` is an opt-in input structure that preserves `55→16→8→1`. Rows 0–7 are hard-routed specialists; rows 8–15 are fully dense across all 55 input columns:

| First-layer rows | Allocation |
|---|---|
| 0–1 | local technical (2) |
| 2 | on-chain (1) |
| 3 | macro (1) |
| 4 | candlesticks (1) |
| 5 | RSID structure (1) |
| 6 | market flow (1) |
| 7 | cross-asset (1) |
| 8–15 | dense cross-family units (8) |

The v1 mask has 508 active and 372 blocked first-layer edges. Its per-row active counts are `[13, 13, 10, 11, 4, 10, 6, 1, 55, 55, 55, 55, 55, 55, 55, 55]`. The two extra specialist edges versus a simple unique-feature hand count come from the established 55-column schema repeating `sopr_norm` and `cvd_norm`; the saved metadata records the ordered feature digest and every row's active feature indices, so the exact mask remains auditable.

Every hybrid artifact stores structure name `hybrid_grouped_first_layer_v1`, version `1`, specialist row-to-family mapping, dense row indices, active/blocked totals, per-row counts, feature-column SHA-256, active feature indices per row, plus normal data/training/seed/Phase-1/Phase-2/recommended-threshold provenance.

The tag `hybrid_grouped_v1` isolates all candidates from dense `bb50`, logical `grouped_v1`, and `random_sparse_v1` artifacts.

## Method and mask verification

- BTC 6H only; normal training window and 55→16→8→1 architecture.
- Fresh training seeds: 9090, 9191, and 9292, run serially.
- Same robust Phase-2 objective, `l2=0.01`, 300 CMA-ES generations, and one CMA-ES worker as the grouped and random-sparse experiments.
- `sync_params.py` passed for all 20 active parameter files. `check_pine.py` exited successfully but reported the pre-existing 64/64 plot budget in `strategy_activation_scores.pine`; this experiment does not modify Pine.
- A hybrid smoke run verified zero nonzero specialist-blocked weights after Phase 1 and again after Phase 2. All dense rows were fully trainable. CMA-ES used 669 parameters compared with 1,041 dense parameters, excluding exactly the 372 blocked specialist connections and no dense-row edge.
- No winner CSV, live `bb50` artifact, Pine preset, or parameter file was changed; no promotion or preset generation was run.
- The direct trainer requires an explicit `--out` for `hybrid_grouped`, and the orchestrator rejects hybrid sweep, promotion, and preset flags to keep future runs in this isolated workflow.

## Canonical replay

Metrics use the canonical simulator and each artifact's own saved Phase-2 recommended thresholds. `WFO mean / min` is the mean and worst qualifying-fold Calmar; valid folds meet the configured minimum trade count.

| Candidate | IS Calmar | IS P&L | Max DD | Trades | WFO mean / min | Valid folds |
|---|---:|---:|---:|---:|---:|---:|
| Promoted dense baseline | 0.483 | 13,839.5% | -33.46% | 56 | 0.654 / 0.609 | 2 |
| Logical grouped 9090 | 0.087 | 482.4% | -63.44% | 138 | 1.143 / 0.098 | 5 |
| Logical grouped 9191 | 0.128 | 629.9% | -48.61% | 136 | 0.966 / 0.002 | 5 |
| Logical grouped 9292 | 0.099 | 901.9% | -73.48% | 178 | 1.399 / 0.082 | 5 |
| Random sparse 9090 | 0.167 | 2,243.5% | -60.24% | 152 | 1.125 / 0.125 | 5 |
| Random sparse 9191 | 0.124 | 934.3% | -59.45% | 130 | 1.893 / 0.410 | 4 |
| Random sparse 9292 | -10.000 | 153.8% | -49.91% | 1 | 0.000 / -99.000 | 0 |
| Hybrid grouped 9090 | 0.078 | 418.9% | -65.50% | 178 | 1.430 / 0.417 | 6 |
| Hybrid grouped 9191 | 0.158 | 2,550.3% | -66.30% | 90 | 1.644 / 0.644 | 4 |
| Hybrid grouped 9292 | 0.049 | 267.5% | -82.65% | 121 | 1.210 / 0.584 | 4 |

`-10.000` Calmar and `-99.000` WFO minimum are canonical insufficient-trade sentinels for random-sparse seed 9292, not successful low-return values.

## Interpretation

The hybrid design improved the fully grouped best IS Calmar from 0.128 to 0.158 and avoided the random control's one-trade collapse. Its WFO minima (`0.417`, `0.644`, and `0.584`) are also much less fragile than the fully grouped candidates. This is evidence that retaining dense first-layer capacity helps relative to forcing every unit to be hard sparse.

That evidence is not enough to support this routing direction as a deployable model. Hybrid's best IS Calmar is still only about one third of dense baseline, and every hybrid drawdown is roughly two to two-and-a-half times the dense baseline drawdown. Random-sparse seed 9090 also has a higher IS Calmar (0.167) than the best hybrid candidate, so the experiment does not isolate a reliable semantic-routing advantage. Do not promote based on the higher WFO means or minima alone.

The result is therefore a qualified negative: full first-layer sparsity is clearly harmful, and hybrid dense capacity reduces some of that harm, but the specified eight-specialist routing direction remains similarly weak versus the dense model and is not supported for promotion.

## Threshold-sweep status

The canonical replay is preliminary. No separate threshold sweep was run because `run_mlp_deep_sweep.py` writes shared canonical `results/sweeps/optimization_sweep_strategy_mlp_scores_*` and summary outputs; it does not provide an isolated experiment namespace. Running it would risk overwriting shared experiment results, so it is deliberately excluded.

## Reproduction

```bash
.venv/bin/python3 tools/run_mlp_train.py \
  --assets COINBASE_BTCUSD --tfs 6H --seeds 3 --seed-start 9090 \
  --tag hybrid_grouped_v1 --input-structure hybrid_grouped \
  --fold-objective robust --l2 0.01 --es-workers 1 --parallel-jobs 1
```
