parity_harness.py: median-curve parity of V3a VioletBetSizer vs recorded dolphin.trade_events (vel_div->leverage), restricted to short-signal domain. GATE PASSES on prod host: pearson 0.9998, max_abs_err 0.238 (budget 1.0) over 23 bins -> base conviction sizer reproduces BLUE's central tendency. Per-trade scatter is the deferred SC/ACB/OB/gold modulation layer (separate finding doc). 3 unit + 1 gate green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4.1 KiB
VIOLET Finding — The Sizing-Modulation Layer vs. the Capital-Under-Utilization Result
Status: Finding / caveat, 2026-06-13. Separate doc by operator request. Qualifies
(does NOT overturn) the blue_margin_envelope_study and constrains the
VIOLET_STUDY_SPEC__BASE_FRACTION_SIZING.md (#3) and any pre-V4 sizing work.
TL;DR
The newly-isolated downstream sizing-modulation layer (SC-haircut / ACB / OB-cascade / "gold" — the organs that ride along ACBv6) does not counter the margin study: that study used actual recorded notionals, which are already post-modulation. But it sharpens what "under-utilized capital" means, and makes the modulation layer a required pre-execution component for VIOLET — not optional.
1. Why the margin study is NOT contradicted
The margin/viability study computed our_leverage = entry_price·quantity / capital_before
from dolphin.trade_events — i.e. from the notionals BLUE actually traded, haircuts
and boosts already baked in. The modulation is therefore inside the measured numbers,
not a missed factor. Conclusions stand on the as-traded data:
- max realized
our_leverage≈ 1.81 - 100% of trades margin-feasible at 2× exchange leverage
- +$47k clean deduped edge
2. How recorded leverage decomposes (the discovery)
Recorded conviction leverage is NOT the base bet-sizer output alone:
recorded_leverage(trade) = base_sizer(vel_div) ± modulation(SC, ACB, OB, gold)
- base_sizer(vel_div) — cubic-convex strength³ curve; VIOLET's V3a
VioletBetSizerreproduces it (validated on binned MEDIANS: vd −0.03→0.83, −0.04→2.78, −0.05→9.0 with max_leverage=9 / thr −0.02 / extreme −0.05 / convexity 3). - modulation — mostly downward haircuts (mins far below the median per vel_div bin), with some upward boosts to the 9 cap. This is the per-trade scatter that drops exact per-trade parity to ~34% while the median curve matches.
3. The sharpening (this is the load-bearing part)
The study's median wallet utilization was ~6.8% (our_leverage p50 ≈ 0.068). That
low median is largely the haircut layer at work — BLUE deliberately sized most trades
far below the base curve. The max 1.81 is the un-haircut, base-saturated tail.
Consequences:
- Margin feasibility is robust even if the haircuts are later dropped: the study's worst case (1.81) already equals the base-saturated value, and 2× covers it. Sizing at full base does not break margin.
- "Under-utilized ⇒ free ROI" is now GUARDED. Much of the idle ~93% is not waste — it is the modulation layer deliberately de-risking (cutting size on lower-conviction / higher-risk setups). It is risk knowledge encoded as size.
4. Binding implications
- #3 base-fraction study MUST NOT read the 6.8% median as free headroom. A large part of it is risk-management. Any base-fraction increase must be evaluated with the modulation layer modeled, conditioned on the regime-robustness work — never by naively reclaiming the idle capital.
- The modulation layer is REQUIRED before live execution (V4). VIOLET running the base sizer alone would size bigger than BLUE did on exactly the trades BLUE chose to haircut → utilization jumps from ~7% median toward the base, and realized risk/return diverges from the recorded +$47k (more variance, possibly worse risk-adjusted). Median-curve base parity (V3d) is necessary but not sufficient for faithful BLUE replication.
- New deferred task (pre-V4): wrap the SC-haircut / ACB / OB-cascade / "gold"
modulation organs as a VIOLET sizing-modulation layer on top of the base
VioletBetSizer, with its own per-trade parity gate vs recordedleverage.
5. Related
blue_margin_envelope_study · violet_v3_alpha_doctrine (#9 keystone, #11 parity
finding) · VIOLET_STUDY_SPEC__BASE_FRACTION_SIZING.md · prod/clean_arch/violet/alpha_wrappers.py
(base sizer) · live organs in prod/nautilus_event_trader.py
(_apply_sc_entry_size_multiplier, _record_sc_haircut, AdaptiveCircuitBreaker).