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.
| Win rate | 55% |
| Risk:Reward | 1: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% |
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.
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.
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| Win 55%, R:R 1:1 | Kelly = 10% |
| Win 55%, R:R 1.5:1 | Kelly = 25% |
| Win 60%, R:R 1:1 | Kelly = 20% |
| Win 50%, R:R 2:1 | Kelly = 0% (zero edge!) |
| Win 45%, R:R 3:1 | Kelly = 13% |
| Win 40%, R:R 1:1 | Kelly = NEGATIVE (don't bet) |
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:
Define stop first. Where does my thesis break? That's your stop, not ₹X away from entry.
Apply fixed fractional: Size = (1% × Account) / (Entry − Stop). This is your base size.
Volatility check: if σ_stock > 3%/day, cut position by half regardless. High vol means outsized gap risk.
Kelly sanity check: compute f*. If < your fixed fractional %, use f* instead. Never exceed Kelly.
Portfolio heat check: does this push total heat > 5%? If yes, wait for an existing position to close.
Correlation check: do I already have >2 positions in this sector? If yes, treat as one position and halve size.
[ PRACTICE PROBLEMS ]
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.
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?
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?
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?
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.