AHQAlphaHedgeQuant
← Back to Learn
intermediate14 min · Risk

Position Sizing Before Everything

A brilliant strategy with terrible sizing will blow up. A mediocre strategy with excellent sizing survives and compounds. This is the most important — and most ignored — skill in trading.

1. Why Sizing Is the Real Edge

Most traders obsess over entry signals. Where to buy, which indicator, what pattern. The dirty secret: your entry explains almost none of your long-run outcome. Sizing and risk management explain almost all of it.

Here's why: a strategy with 55% win rate and 1:1 risk-reward is profitable in expectation. But bet 50% of capital on each trade and a 5-loss streak — which happens — wipes you out. That same strategy with 1% risk per trade survives indefinitely.

THE MATH OF RUIN — Same strategy, different sizing
Win rate55%
Risk:Reward1:1
Expected value per trade+10%
Sizing: 50% of capital/trade
P(ruin after 10-loss streak)0.1% → capital down 99.9%
Sizing: 2% of capital/trade
P(ruin after 10-loss streak)0.0% → capital down 18%
🎯Position sizing doesn't improve your strategy. It determines whether you survive long enoughfor the strategy's edge to materialise. Without survival, edge is irrelevant.

2. Fixed Fractional — The Baseline Method

The simplest robust approach. Risk a fixed percentage of your current capital on each trade. As your account grows, your absolute bet size grows. As it shrinks, your bet shrinks automatically — protecting you during drawdowns.

FIXED FRACTIONAL SIZING

Position Size = (Account × Risk%) / (Entry - Stop)

Risk% = typically 1–2% for stocks, 0.5–1% for futures

Example:
  Account:    ₹10,00,000
  Risk%:      1%
  Entry:      ₹2,500
  Stop:       ₹2,425   (₹75 risk per share)

→ Max loss per trade = ₹10,00,000 × 1% = ₹10,000
→ Shares = ₹10,000 / ₹75 = 133 shares
→ Position value = 133 × ₹2,500 = ₹3,32,500 (33% of capital)

Notice the position value (33%) is a consequence of the risk rule, not an input. If your stop is tight, you buy more shares. If your stop is wide, you buy fewer. The risk is constant; the position size adjusts.

Never set your stop based on your desired position size.Set your stop at the price that invalidates your trade thesis, then calculate position size from there.
def fixed_fractional_size(account, risk_pct, entry, stop):
    """
    account  : total portfolio value in ₹
    risk_pct : e.g., 0.01 for 1%
    entry    : entry price per share
    stop     : stop-loss price per share
    """
    max_loss   = account * risk_pct
    risk_per_share = abs(entry - stop)
    
    if risk_per_share == 0:
        raise ValueError("Entry and stop cannot be the same")
    
    shares     = int(max_loss / risk_per_share)
    pos_value  = shares * entry
    pct_capital = (pos_value / account) * 100
    
    return {
        'shares':      shares,
        'pos_value':   pos_value,
        'pct_capital': round(pct_capital, 1),
        'max_loss':    shares * risk_per_share,
    }

3. Volatility Targeting — Sizing to Risk, Not to Dollars

Fixed fractional relies on you setting a stop. But what if you're running a strategy without hard stops — like mean reversion? Or what if two trades both have ₹100 stop, but one stock moves ₹5/day and the other moves ₹50/day?

Volatility targeting solves this by sizing positions so that each one contributes equal realised volatility to the portfolio. Used by every major quant fund (Renaissance, AQR, Two Sigma).

VOLATILITY TARGETING

Daily Vol Target = Portfolio Vol Target / √252

Position Size (₹) = (Portfolio × Daily Vol Target) / σ_stock

where σ_stock = stock's daily volatility (ATR or rolling std of returns)

Example:
  Portfolio:          ₹10,00,000
  Target annual vol:  15%  (modest)
  Daily vol target:   15% / √252 = 0.944%

  Stock A (σ = 2%/day):   Size = ₹10L × 0.944% / 2%   = ₹4,72,000
  Stock B (σ = 0.5%/day): Size = ₹10L × 0.944% / 0.5% = ₹18,88,000

→ Same risk contribution. Different position sizes.
🎯This is why quant funds can hold seemingly huge positions in low-volatility stocks — they're sizing to equalize risk, not dollars. A ₹20L position in a 0.3% daily vol stock is lower risk than a ₹5L position in a 3% daily vol stock.
import numpy as np
import pandas as pd

def vol_target_size(portfolio, annual_vol_target, returns_series, price):
    """
    portfolio         : total portfolio value in ₹
    annual_vol_target : e.g., 0.15 for 15%
    returns_series    : pd.Series of daily % returns (last 20 days)
    price             : current stock price
    """
    daily_vol_target = annual_vol_target / np.sqrt(252)
    
    # Rolling 20-day realised vol
    sigma = returns_series.tail(20).std()
    
    if sigma == 0:
        return 0
    
    position_value = portfolio * (daily_vol_target / sigma)
    shares = int(position_value / price)
    
    return {
        'shares':         shares,
        'position_value': shares * price,
        'stock_daily_vol': f"{sigma*100:.2f}%",
        'pct_capital':    round((shares * price / portfolio) * 100, 1),
    }

4. Kelly Criterion — The Optimal Growth Formula

John Kelly (Bell Labs, 1956) derived the mathematically optimal fraction of capital to risk to maximise long-run geometric growth. It's elegant and dangerous.

KELLY CRITERION

f* = (p·b - q) / b = (p·b - (1-p)) / b

where:
  f*  = optimal fraction of capital to bet
  p   = probability of win
  q   = 1 - p = probability of loss
  b   = reward/risk ratio (e.g., if risk 1 to make 1.5, b = 1.5)

Concrete example:
  Win rate (p):      0.55
  Risk:Reward (b):   1.5
  
  f* = (0.55 × 1.5 - 0.45) / 1.5
     = (0.825 - 0.45) / 1.5
     = 0.375 / 1.5
     = 0.25  → bet 25% of capital
KELLY EXAMPLES — Various edge profiles
Win 55%, R:R 1:1Kelly = 10%
Win 55%, R:R 1.5:1Kelly = 25%
Win 60%, R:R 1:1Kelly = 20%
Win 50%, R:R 2:1Kelly = 0% (zero edge!)
Win 45%, R:R 3:1Kelly = 13%
Win 40%, R:R 1:1Kelly = NEGATIVE (don't bet)
🚫Full Kelly is almost never used in practice. It maximises long-run growth but produces catastrophic drawdowns (often 50%+ even with positive edge). Most professionals use half-Kelly or quarter-Kelly — dramatically smoother equity curve with only marginally lower long-run growth.

The Kelly formula also assumes you know exactly your win rate and R:R in advance. In live trading, you don't. Estimation error makes full Kelly dangerous. If your estimated p is 55% but the true p is 48%, full Kelly is ruinous.

def kelly_fraction(win_rate, reward_risk_ratio, fraction=0.5):
    """
    win_rate          : e.g., 0.55 for 55%
    reward_risk_ratio : e.g., 1.5 means risk 1 to make 1.5
    fraction          : 0.5 = half Kelly (recommended)
    """
    p = win_rate
    q = 1 - p
    b = reward_risk_ratio
    
    full_kelly = (p * b - q) / b
    
    if full_kelly <= 0:
        return {
            'full_kelly': full_kelly,
            'use_fraction': 0,
            'note': "Negative Kelly — no edge, do not trade this setup"
        }
    
    adjusted = full_kelly * fraction
    
    return {
        'full_kelly':      round(full_kelly * 100, 1),  # %
        'half_kelly':      round(adjusted * 100, 1),    # %
        'recommendation':  f"Risk {round(adjusted * 100, 1)}% per trade",
        'note': f"Full Kelly is {round(full_kelly*100,1)}% — use {int(fraction*100)}% of that"
    }

5. Portfolio-Level Controls — Drawdown Circuit Breakers

Individual position sizing is necessary but not sufficient. You need portfolio-level rules that override individual position logic when things go wrong systemically.

Max portfolio heat

Total risk-at-stop across all open positions. Limit to 5–8% of capital max. If 6 positions each risk 1%, you're at 6% heat — approaching limit.

Daily drawdown limit

If portfolio drops X% in one day, stop trading. Period. Common values: 2–3% for discretionary, 1–2% for systematic. Loss recovery is expensive — down 10% needs +11% to recover.

Monthly drawdown circuit

If down 6–8% in a month, cut position sizes in half and do not scale back up until monthly PnL is positive. Prevents 'tilt' cascades.

Correlation constraint

Don't hold 5 IT stocks if they all move together. Treat correlated positions as one fat position. Effective risk = n × size if correlation = 1.

PORTFOLIO HEAT CALCULATION

Portfolio Heat = Σ (position_size_i × stop_distance_i) / Account

Example (3 positions):
  RELIANCE: 100 shares × ₹80 stop = ₹8,000 at risk
  TCS:       40 shares × ₹150 stop = ₹6,000 at risk
  INFY:      60 shares × ₹60 stop  = ₹3,600 at risk

Total heat = ₹17,600 / ₹10,00,000 = 1.76%  → OK

Rule: if heat > 6%, no new positions until existing ones are trimmed.

6. Bringing It Together — A Complete Sizing Framework

Here's the decision tree to use on every trade, in order:

1

Define stop first. Where does my thesis break? That's your stop, not ₹X away from entry.

2

Apply fixed fractional: Size = (1% × Account) / (Entry − Stop). This is your base size.

3

Volatility check: if σ_stock > 3%/day, cut position by half regardless. High vol means outsized gap risk.

4

Kelly sanity check: compute f*. If < your fixed fractional %, use f* instead. Never exceed Kelly.

5

Portfolio heat check: does this push total heat > 5%? If yes, wait for an existing position to close.

6

Correlation check: do I already have >2 positions in this sector? If yes, treat as one position and halve size.

[ PRACTICE PROBLEMS ]

1.

Account: ₹5,00,000. Risk per trade: 1.5%. Entry: ₹1,200. Stop: ₹1,140. Calculate: (a) max loss, (b) shares to buy, (c) position value, (d) % of capital.

2.

A strategy has 58% win rate and 1.2:1 risk-reward. Calculate full Kelly and half-Kelly fractions. If account = ₹10L, what's the rupee size at half-Kelly?

3.

You have 4 open positions: HDFC (₹12k at risk), TCS (₹8k at risk), Infosys (₹9k at risk), Wipro (₹7k at risk). Account = ₹10L. What is your portfolio heat? Can you take a 5th position with ₹6k risk?

4.

Stock X has a daily vol of 3.5%. Using volatility targeting with 12% annual portfolio vol target, what position size (as % of a ₹10L account) would you take?

5.

Design a full circuit-breaker rulebook for a day trader with ₹5L capital: daily loss limit, weekly limit, max concurrent positions, max sector concentration, and position max size. Justify each number.