Files
siloqy/prod/docs/VIOLET_FINDING__MODULATION_LAYER_VS_UNDERUTILIZATION.md

78 lines
4.1 KiB
Markdown
Raw Normal View History

# 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 `VioletBetSizer`
reproduces 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:
1. **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.
2. **"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 recorded `leverage`.
## 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`).