Position Sizing

SPEC_POSITION_SIZING.md · 2026-04-20

SPEC_POSITION_SIZING.md

CGNT-1 Specification — Position Sizing — Half-Kelly Implementation

Status: SPECIFIED

Version: v1.0

Author: VELA (Thread #13)

Conceived by: NOUS (α.13)

Date: 2026-04-20

Depends on: SPEC_TMM_FORMULA.md, SPEC_YIELD_MANDATE.md, SPEC_TRADING_JOURNAL.md


PURPOSE

How much to bet on each trade. Not "how much can I afford to lose" — that's the stop-loss (8% per SPEC_YIELD_MANDATE). This is: given my edge and my bankroll, what's the mathematically optimal position size?

The answer is the Kelly Criterion, divided by 2 for safety. Half-Kelly. The formula that keeps the Captain in the game long enough for the edge to manifest.


THE KELLY CRITERION

Full Kelly formula:


f* = (bp - q) / b

Where:
  f* = fraction of bankroll to bet
  b  = odds received (ratio of average win to average loss)
  p  = probability of winning
  q  = probability of losing (1 - p)

This gives the OPTIMAL fraction — the bet size that maximizes long-term geometric growth rate.

The problem with full Kelly: It's aggressive. It assumes perfect knowledge of p and b. In reality, our estimates are imperfect — especially in the first 30 days when we have few data points. Full Kelly with imperfect estimates leads to large drawdowns.

The solution: HALF-KELLY


f_actual = f* / 2

Half the optimal bet. This sacrifices ~25% of the growth rate but reduces variance by ~50%. For a solo trader on a Chromebook: smooth ride matters more than maximum growth.


IMPLEMENTATION

Step 1 — Estimate p (win probability)

| Phase | p Value | Rule |

|---|---|---|

| First 30 days | 0.50 | Assume no edge until proven otherwise |

| After 30 trades | Actual win rate from journal | Recalculate every 10 trades |

If p drops below 0.45 for 20+ trades: the system may not have an edge. Review TMM calibration.

Step 2 — Estimate b (win/loss ratio)

| Phase | b Value | Rule |

|---|---|---|

| First 30 days | 1.0 | Assume 1:1 risk/reward until proven otherwise |

| After 30 trades | avg win / avg loss from journal | Recalculate every 10 trades |

If b drops below 0.8: losing more on losses than gained on wins. Review stop-loss discipline.

Step 3 — Calculate f*


f* = (bp - q) / b

Example — early defaults (p=0.50, b=1.0):
  f* = (1.0 × 0.50 - 0.50) / 1.0 = 0.00
  Kelly says: no edge detected, don't bet.
  ✓ Correct for first 30 days — trade minimum while gathering data.

Example — after 50 trades (p=0.58, b=1.3):
  f* = (1.3 × 0.58 - 0.42) / 1.3
     = (0.754 - 0.42) / 1.3
     = 0.257
  Full Kelly: 25.7% of bankroll.
  Half-Kelly: 12.8% — but trading wall caps at 10%.
  Final position: min(12.8%, 10%) = 10%.

Step 4 — Apply Half-Kelly


f_actual = f* / 2
Position size ($) = f_actual × total portfolio value
Units to buy = position size / entry price  [round DOWN to whole units]

Step 5 — Check against trading walls


Is f_actual > 10% of portfolio? → cap at 10%
Is total of all open positions > 30% of portfolio? → don't add
Is the 3% daily halt triggered? → don't trade
Is the 5% weekly halt triggered? → don't trade

THE POSITION SIZING WORKSHEET

Every trade entry in SPEC_TRADING_JOURNAL.md includes this calculation:


Total portfolio:     $[amount]
Win rate (p):        [from last N trades, or 0.50 if <30 trades]
Win/loss ratio (b):  [from last N trades, or 1.0 if <30 trades]
Full Kelly f*:       ([b] × [p] - [q]) / [b] = [value]
Half Kelly f_actual: [f*] / 2 = [value]
Dollar position:     [f_actual] × [portfolio] = $[amount]
Wall check:          [f_actual] vs 10% cap → [which is smaller]
Final position:      $[amount] = [units] × $[price]

EDGE CASES

Negative Kelly (f* < 0)

Kelly is negative when bp < q — expected value is negative. You have no edge.

Correct action: DO NOT TRADE.

Not "trade small." Don't trade. A negative Kelly is the math saying: you will lose money on average. Record it in the journal. Review TMM calibration. Wait for conditions to improve.

Zero Kelly (f* = 0)

No edge detected. Expected value exactly zero. Same as negative: don't trade, or trade minimum position for data collection only.

Very High Kelly (f* > 0.5)

Kelly above 50% means the edge appears enormous — suspiciously so. Either:

Half-Kelly at 25% still exceeds the 10% wall. Cap at 10%. If Kelly consistently shows >50%: the estimates need more data, not bigger bets.


TMM AND KELLY — INTERACTION

TMM provides the qualitative filter. Kelly provides the quantitative sizing. Both must agree.

| TMM Signal | Kelly Output | Action |

|---|---|---|

| RED | Any | DO NOT TRADE — regardless of Kelly |

| AMBER | Negative | DO NOT TRADE |

| AMBER | Positive | Trade at min(Half-Kelly, 5%) — extra conservative |

| GREEN | Negative | DO NOT TRADE |

| GREEN | Positive | Trade at min(Half-Kelly, 10%) |

TMM RED overrides any Kelly signal. No position regardless of Kelly output.


UPDATING ESTIMATES

Every 10 trades, recalculate p and b from the FULL dataset (not just the last 10). This prevents recency bias — a 3-trade losing streak shouldn't dramatically change position sizing if the 50-trade record is positive.

Use ALL available data. Weight recent data slightly higher if desired (exponential moving average), but never discard historical data entirely.

The Kelly estimate gets MORE ACCURATE over time as the dataset grows. This is why the 100-day challenge is 100 days — by Day 100, the Kelly inputs are statistically meaningful.


COMMON MISTAKES

Mistake 1 — Using full Kelly.

Full Kelly is optimal in theory but catastrophic with imperfect estimates. Half-Kelly sacrifices 25% of growth for 50% less variance. Always half.

Mistake 2 — Ignoring negative Kelly.

A negative Kelly is the most important signal the system produces. It means STOP. Not "reduce size" — STOP. Trading more just loses more.

Mistake 3 — Updating estimates too frequently.

Recalculating after every trade creates noisy, oscillating position sizes. Every 10 trades is sufficient.

Mistake 4 — Not capping at the trading wall.

Kelly doesn't know about the 10% position wall. The wall exists for portfolio protection. Kelly is capped by the wall, not the other way around.

Mistake 5 — Emotional override.

Kelly says 3% position. The Captain "feels" confident and goes 8%. The journal catches this:

"Kelly position: 3%. Actual position: 8%. Override reason: gut feeling."

Over 100 days, the data shows whether gut overrides outperform Kelly. Usually they don't.


INVARIANTS

INV-01: Always Half-Kelly. Never full Kelly. The growth sacrifice is worth the variance reduction.

INV-02: Negative Kelly = don't trade. Not "trade small." Don't trade.

INV-03: Position capped at 10% per trading wall. Kelly never overrides the wall.

INV-04: Estimates updated every 10 trades from the FULL dataset. No recency bias.

INV-05: First 30 days: use p=0.50, b=1.0 (no-edge assumptions). Trade minimum positions. Collect data.

INV-06: TMM RED overrides any Kelly signal. No position regardless of Kelly output.

INV-07: Every trade entry shows the full Kelly worksheet. Transparent. Auditable. The math is visible.

INV-08: The 100-day final report includes a Kelly analysis — were the estimates accurate? Did Half-Kelly outperform fixed sizing? Did the edge materialize?


INTEGRATION

| System | Relationship |

|---|---|

| SPEC_TRADING_JOURNAL.md | Every trade entry includes the full Kelly worksheet. Journal provides the historical p and b data for estimate updates. |

| SPEC_YIELD_MANDATE.md | Trading walls (10% cap, halt conditions) are the hard constraints that cap Kelly output. Kelly never overrides the walls. |

| SPEC_TMM_FORMULA.md | TMM provides the qualitative filter. Kelly provides the quantitative size. TMM RED = no position regardless of Kelly. |

| SPEC_GOVERNANCE_LIBRARY.md | TMMRuntime.authorize_trade() governs trade execution. Kelly sizing feeds into the position parameter of the trade authorization call. |


Jeremy Zlabis

Chronogeometer · Visionary · Disruptor · Chief

42 Sisters AI · East York, Toronto

🍁 Φ 0.042