Why composite cap
The $25 MVP cap was a development-only safeguard: it bounded paper-trade exposure during the build phase. In production, a flat $25 cap leaves yield on the table when the model is confident AND oversizes when the model is uncertain. The composite cap framework replaces the flat number with a five-primitive product that scales with empirical evidence.
Activated via CORRIDOR_POSITION_CAP_MODE=composite. The previous modes (legacy_fixed, kelly_ramp) remain available behind the same env-flag for incremental rollout and emergency rollback.
The 5 primitives
1. Drawdown-aware effective bankroll
B_eff = B_nominal × clip(1 + R_30d, 0.30, 1.50)
Per MacLean-Thorp-Ziemba (2010). The effective bankroll shrinks during drawdown windows and expands cautiously during winning streaks. Clip floor 0.30 prevents zero-sizing on a one-month skid; ceiling 1.50 prevents over-extension on a one-month streak.
2. Tier ceiling
tier_max ∈ { T1: $100, T2: $400, T3: $1,000+ } by resolved-trade countThorp 1969 + Markowitz 5%: cap any single position to a tier-bound fraction of effective bankroll. T1 (≤30 resolved trades) is the most conservative — empirical track record is too thin to justify size.
3. Confidence scale
scale = composite_margin = clip(p_central - p_breach, 0, 1)
Brier-proxy via composite margin. The wider the gap between modeled central-scenario probability and worst-branch probability, the larger the position. Applied multiplicatively to the tier ceiling.
4. Risk-parity share
parity_size = B_eff / N_active_positions
Maillard equal-risk allocation. Caps any single corridor to its fair share of bankroll given the count of concurrently active corridors. Prevents over-concentration even when one corridor scores favorably on every other primitive.
5. Safeguard step-down
multiplier = 0.5^k_consec_loss × 0.5^k_dd_breach
Halve sizing on each consecutive paper-loss and on each drawdown threshold breach. Compounds: 2 consec losses + 1 dd breach = 0.125× sizing. Resets after one resolved win.
Composite formula
composite_cap = min(
tier_max(resolved_count),
confidence_scale × tier_max,
risk_parity_share(N_active),
safeguard_multiplier × B_eff,
)The minimum across the four primitives binds the position. When composite is the smallest of the 6 sizing candidates (policy target, risk budget, entry VWAP, exit VWAP, Kelly conservative, composite), the Sizing Breakdown table marks it with the "◀ binding" chip and the 4-component sub-box appears.
Production replay results
Backtest over 28,000 historical managed_signals rows: median binding size $40 under composite mode vs the flat $25 MVP cap. Composite mode adapted to context: smaller during the March drawdown (median $12), larger during April recovery (median $78). 0 over-sizing events; 1 forced step-down on the May 8 sequence.
Migration path
- Set
CORRIDOR_POSITION_CAP_MODE=compositein Helm values. - Monitor the composite_cap binding rate via the
corridor_dashboard_sizing_binding_totalcounter for 24h. - Roll back to
legacy_fixedvia env-flag without code deploy if the binding rate exceeds the safeguard threshold.