# Positioning sleeve — capacity-aware realized returns — Design

**Status:** draft for review
**Date:** 2026-07-07

## Goal

Make the positioning sleeve's booked return **honest about capacity AND robust to tail-concentration**,
via two adaptive, gains-only haircuts in `_book_breakdown` (the SSOT engine for the positioning
forward track, the reconciliation-gate reference, and the 4-edge book's positioning sleeve):

1. **Capacity haircut** — cap each coin's realized GAIN by a market-impact fraction driven by the
   coin's liquidity (turnover) and the fund's capital, so the number is honest as capital scales.
2. **Tail-concentration cap** — cap each coin's per-day CONTRIBUTION to the book at an ISV-driven
   multiple of the book's own daily-return scale, so no single coin/day can dominate the book (the
   +15% "anomaly" days are ~one coin), reducing the fat-right-tail dependence.

**Framing correction (from the OHLC/spot investigation):** the +150% microcap days are NOT data
glitches and NOT uncapturable at $100k — HUSDT +154% is spot-corroborated (spot +153.8%) on $214M
turnover; a ~$9k position is <0.01% of volume → capturable. So the issue is not bad prints; it is
(a) capacity at LARGE capital and (b) tail-concentration (28% of return from 10 days). Both haircuts
can only LOWER measured P&L (gains-only), the safe direction for a real-capital gate reference. A
data-glitch guard is deliberately NOT built — it would suppress real, spot-confirmed gains.

## Why (the investigation, 2026-07-07)

Decomposing positioning's returns (in-cluster, 1283 days, liquid-64 universe):
- **28% of total return (+103% of +371%) comes from 10 days (0.8%)**, each driven by ONE microcap
  doubling: HUSDT +153.7%, HUSDT +156%, LAB +162%, 1000BONK +57%.
- These are sub-dollar tokens; +150% single-day closes are uncapturable at large size.
- The +15% forward day (2026-06-27) does NOT reproduce on recompute (net −0.09%) — its driver coin
  dropped out of the current universe: a transient, uncapturable name.
- **The edge survives winsorization** (flat ±20% cap → Sharpe 2.46 / CAGR +75% vs raw 3.19 / 172%),
  so positioning is a REAL contrarian edge whose HEADLINE is inflated by uncapturable tails — not a
  fake edge.

**Key capital insight:** capturability is size-dependent. At the configured `paper_capital`
($100k), a ~9% weight in a ≥$10M-turnover coin is a ~$9k position = <0.1% of daily volume →
capturable. The overstatement bites only at large capital ($10M+). So the honest fix is
**capacity-aware** (attenuates by position/turnover), not a flat cap: at $100k it barely binds
(confirming the edge is real at fund scale); as capital scales it caps thin names automatically.

## Design

### The capacity haircut (in `_book_breakdown`)

For each coin `s` on day `d`, replace the booked per-coin return with a capacity-attenuated one:

```
position_notionalₛ = capital · |wₛ|                 # unit-gross weight → dollars in coin s
executable_notionalₛ = π · med_turnoverₛ            # what you can trade w/o prohibitive impact
capture_fractionₛ = min(1, executable_notionalₛ / position_notionalₛ)   # ∈ (0, 1]
realized_retₛ = retₛ            if retₛ ≤ 0          # losses kept IN FULL (conservative — you're stuck)
             = retₛ · capture_fractionₛ  if retₛ > 0 # GAINS capped: can't bank more than you can exit
```

- **`med_turnoverₛ`** = the coin's MEDIAN turnover over a trailing window (the SAME robust measure
  `liquid_universe` uses — median, not the squeeze-day spike, so a normally-thin coin cannot rely
  on squeeze-day volume to bail out its position). Adaptive per-coin (the ISV-style bound), read
  from the existing `turnover` feature.
- **`π`** = max participation = **0.10** (you can trade up to ~10% of a coin's daily $ volume in a
  day without prohibitive impact). A documented, conservative CAPACITY assumption — like a cost
  assumption, NOT a return-maximising fit. Held constant; the adaptivity is in `med_turnoverₛ`.
- **Gains-only, conservative:** capping only favourable moves (never reducing losses) guarantees
  the haircut can only LOWER measured P&L — the safe direction for a real-capital gate reference
  ([[feedback_adaptive_not_tuned]]: caps are adaptive-liquidity-driven, not tuned magic numbers).

`capacity_capital=None` ⇒ no haircut (current behaviour) so the change is backward-compatible and
unit-testable with explicit capital.

### The tail-concentration cap (in `_book_breakdown`)

After the capacity haircut, cap each coin's per-day CONTRIBUTION so no single coin can dominate the
book beyond a multiple of the book's own normal daily move:

```
cₛ = wₛ · realized_retₛ / gross          # the coin's contribution to the book return that day
σ_book = trailing std of the RAW (pre-cap) book daily returns over a window (bootstrapped:
         first-observation → expanding until the window fills, then rolling)     # the ISV scale
capped_cₛ = min(cₛ, K · σ_book)  if cₛ > 0   # GAINS-only: clip a dominating positive contribution
         = cₛ                     if cₛ ≤ 0   # losses kept in full (conservative)
book_return_d = Σ capped_cₛ
```

- **`σ_book`** is the ADAPTIVE, ISV-style scale — the book's OWN trailing daily-return volatility,
  computed from the RAW (pre-cap) contributions so the cap does not feed back on its own reference
  ([[feedback_isv_for_adaptive_bounds]], [[pearl_wiener_optimal_adaptive_alpha]]: bootstrap the
  estimator on first observation, no hardcoded seed). A single coin contributing +14% when σ_book ≈
  1.5% is a ~9σ dominator → clipped to `K·σ_book`.
- **`K`** = z-multiple = **4.0** (a 4σ single-coin contribution ceiling). A documented robustness
  constant — the adaptivity is in `σ_book`, NOT in K ([[feedback_adaptive_not_tuned]]). Not fitted
  to a return target; gate 6 (below) checks it behaves sensibly.
- **Gains-only** (never clip a negative contribution): the cap can only reduce the fat RIGHT tail,
  never flatter a loss — same conservative direction as the capacity haircut.

The two haircuts compose: capacity first (models "can I exit this size"), then tail-cap (models "no
single name should carry the book"). Both are off when `capacity_capital=None` AND the tail-cap is
disabled — controlled by one `capacity_capital` gate plus a `tail_cap_sigma=None` opt-out for
backward-compatible byte-reproduction in tests.

### SSOT threading (one engine, forward + ref + book all fixed)

The forward track, the reconciliation-gate reference, AND the 4-edge book's positioning sleeve all
resolve to `positioning_returns_from_store → _book_breakdown`. Thread one optional param down that
single chain so all three are fixed identically (basis-matched):

```
_book_breakdown(store, *, universe, cost_bps, direction, capacity_capital=None, participation=0.10)
positioning_returns_from_store(..., capacity_capital=None)
bybit_book_eval._positioning_series(store, *, universe, cost_bps, capacity_capital=None)
bybit_book_eval.sleeve_returns_from_store(..., capacity_capital=None)      # positioning branch only
bybit_forward_track.BybitFourEdgeStrategy(..., capacity_capital=None)      # passes through
```

Wiring passes `s.paper_capital`:
- `build_positioning_forward_nav` / `positioning_nav` (the standalone forward track),
- `bybit_4edge_backtest_summary(sleeves=["positioning"], ...)` (the gate ref, persist Job),
- `build_bybit_4edge_forward_nav` + `bybit_4edge_backtest_summary` (the FULL book — its positioning
  sleeve is capacity-honest too, so the deploy book's number matches).

Turnover panel read is universe-bounded (memory-safe), mirroring the existing `long_ratio`/`close`
reads in `_book_breakdown`.

## Validation gates

1. **Capacity curve (the core check).** Sweep `capacity_capital` ∈ {$100k, $1M, $10M, $100M} and
   report positioning Sharpe/CAGR. Expect: ≈unchanged at $100k (edge is capturable at fund scale),
   monotonically degrading as capital grows, the top-10 spike days attenuating at high capital. A
   flat/no degradation at high capital means the haircut isn't binding (bug); a big drop at $100k
   means the participation π is too tight (re-examine).
2. **Conservative direction.** For every (capital, day), the capacity-booked return ≤ the raw
   booked return (gains-only haircut never raises P&L). Assert on a seeded microcap-squeeze day.
3. **SSOT basis-match.** With the same `capacity_capital`, the standalone positioning forward
   series == the book's positioning-sleeve series == the gate ref's series (one engine).
4. **Backward-compat.** `capacity_capital=None` reproduces today's `_book_breakdown` byte-for-byte.
5. **Tail-concentration reduction.** Report the share of cumulative return from the top-10 |days|
   before vs after the tail-cap. Expect it to fall materially from the current 28%; the per-day
   book std should shrink and the daily-return kurtosis drop (fewer extreme days). Sharpe should
   stay in the winsorization-test ballpark (~2.5–2.9), NOT collapse — if it collapses, K is too
   tight (the cap is eating the edge, not just the tail).
6. **K/σ_book sanity.** On a seeded day with one dominating coin, the capped book return equals
   `K·σ_book + Σ(other contributions)`, and with `tail_cap_sigma=None` it equals the raw book. σ_book
   bootstraps on the first observations (no NaN, no hardcoded seed).
7. Full suite green.

## Non-goals

- **Data-glitch / wick filtering — deliberately NOT built.** The investigation showed the +150%
  days are REAL (HUSDT +154% spot-corroborated at +153.8%, $214M turnover), so a glitch guard would
  suppress genuine, spot-confirmed gains. The tail-concentration cap handles the RISK (one coin
  dominating) without falsely branding a real move as an error.
- **Other sleeves.** tstrend/unlock/carry may have their own capacity/tail limits; this spec is
  positioning-only (the sleeve the investigation implicated). Extending to other sleeves is later.
- No change to the contrarian SIGNAL (weights) — both haircuts cap realized RETURN / CONTRIBUTION,
  not sizing (the chosen approach; sizing-based capacity was the rejected alternative).

## Risks

- **At $100k the numbers barely change** — because positioning IS largely capturable at fund scale.
  This is the honest outcome, not a weak fix: the value is a capacity-honest reference + automatic
  protection as capital scales, and it removes the overstatement that would mislead at growth.
- **π and the median-turnover window are modelling assumptions.** Documented + conservative; the
  capacity curve (gate 1) is the sanity check that they behave sensibly, not fitted to a target.
- The gate ref becomes slightly lower (gains capped) → the band centre drops → forward reconciles
  more easily. Still false-WAIT-safe (a lower expected return only makes shortfall less likely, and
  the min-band floor keeps the band from collapsing).
