chartgrade
← Library·Risk & sizing·Ch. 07

Risk & position sizing — the survival math

Kelly criterion, correlation budgets, black-swan defense.

18 min read2,432 words37 sections

Risk Management and Position Sizing for Systematic Retail FX

A rigorous, math-first reference for an AI-assisted Forex trading system. Most retail accounts die from sizing, leverage, or correlation — not from a bad signal. This document is the foundation of the risk layer.


1. Per-Trade Risk: The 1–2% Rule

1.1 The drawdown asymmetry

If equity falls by d (a fraction), the return required to get back to the prior high is:

recovery = d / (1 − d)
Drawdown d Recovery required
5% 5.26%
10% 11.11%
20% 25.00%
30% 42.86%
50% 100.00%
75% 300.00%
90% 900.00%

A 50% drawdown does not need a 50% gain to recover; it needs +100%. This is why capital preservation is non-negotiable: the loss function is convex in your favor when you stay small and brutally convex against you when you don't.

1.2 Probability of ruin under fixed-fractional risk

If you risk fraction f of equity per trade with win probability p and payoff ratio b (avg win / avg loss in R), the probability of an N-trade losing streak destroying X% of equity follows from the binomial / random-walk literature (Van Tharp, Trade Your Way to Financial Freedom; Ralph Vince, The Mathematics of Money Management).

Approximate the probability of an n-loss streak in T trades:

P(streak ≥ n in T trades) ≈ 1 − (1 − (1−p)^n)^(T − n + 1)

With p = 0.45, the probability of seeing a 10-loss streak in 500 trades is ~22%. At f = 0.02 (2% per trade), 10 consecutive losses ≈ 18.3% drawdown (compounding: 1 − 0.98^10). At f = 0.05, it is ~40%. At f = 0.10, it is ~65%.

1.3 The rule

  • 1% per trade = default for systematic retail. Survives 10 losers at ~9.6% drawdown.
  • 2% per trade = aggressive ceiling. Reserve for high-conviction setups with proven edge.
  • >2% = institutional or terminal. Don't.

Deviate downward (0.25–0.5%) during: new strategy validation, news-event holds, correlated open exposure, regime change, post-drawdown recovery (see §5).


2. The Kelly Criterion

2.1 Derivation for binary R-multiple bets

Trade outcome: with probability p, you win b units of risk (R); with probability q = 1−p, you lose 1 unit. Equity after a trade where you bet fraction f:

W₁ = W₀ · (1 + f·b)    [win]
W₁ = W₀ · (1 − f)      [loss]

After N trades, expected log-growth:

G(f) = p · ln(1 + f·b) + q · ln(1 − f)

Maximize by setting dG/df = 0:

p·b / (1 + f·b) − q / (1 − f) = 0

Solve for f:

f* = (p·b − q) / b        ← Kelly fraction
   = p − (1−p)/b           ← equivalent form
   = (edge) / (odds)

Where edge = expected R per trade = p·b − q.

2.2 Worked examples (realistic systematic FX)

Win rate p Payoff b (R) Edge Kelly f* Half-Kelly Quarter-Kelly
0.40 2.0 0.20 10.0% 5.0% 2.5%
0.45 1.5 0.175 11.7% 5.8% 2.9%
0.50 1.5 0.25 16.7% 8.3% 4.2%
0.50 2.0 0.50 25.0% 12.5% 6.25%
0.55 2.0 0.65 32.5% 16.25% 8.1%
0.55 3.0 0.80 36.7% 18.3% 9.2%

2.3 Why full Kelly destroys retail accounts

  1. Inputs are estimated, not known. A 5% overestimate of p can make full-Kelly negative-EV in log-space. Ernie Chan and MacLean/Thorp/Ziemba consistently recommend ½ Kelly or less because parameter uncertainty dominates.
  2. Variance of equity at full Kelly is enormous. Expected geometric growth peaks at f*, but the distribution of paths has fat left tails: probability of a 50% drawdown at full Kelly approaches 50% for many edges.
  3. Half-Kelly captures ~75% of growth with ~25% of the variance (Ziemba). Quarter-Kelly captures ~44% of growth with ~6% of the variance — the right setting for live retail.

Practical rule: size at min(0.01 to 0.02, 0.25·f*). The Kelly answer is a ceiling, not a target.

2.4 Python

import math

def kelly_fraction(p: float, b: float) -> float:
    """Kelly fraction for binary R-multiple bet. p = win prob, b = avg win / avg loss."""
    return (p * b - (1 - p)) / b

def expected_log_growth(p: float, b: float, f: float) -> float:
    return p * math.log(1 + f * b) + (1 - p) * math.log(1 - f)

def safe_risk_fraction(p: float, b: float, kelly_scalar: float = 0.25,
                       hard_cap: float = 0.02) -> float:
    f = kelly_fraction(p, b)
    if f <= 0:
        return 0.0  # no edge, no trade
    return min(hard_cap, kelly_scalar * f)

2.5 Continuous Kelly (Chan formulation)

For strategies with mean return μ and variance σ² per period, the continuous-time Kelly is:

f* = μ / σ²

This is the leverage that maximizes log-growth. Ernie Chan uses this for daily-rebalanced strategies in Quantitative Trading. Sharpe ratio relationship: f* = SR / σ, so growth at optimal f equals SR² / 2. A strategy with Sharpe 1.0 and 15% annualized vol has optimal leverage ≈ 6.7× — and even half of that is too much in live trading.


3. Position Sizing Formulas

3.1 Lot conventions

Lot Units of base currency
Standard 100,000
Mini 10,000
Micro 1,000
Nano 100

3.2 Pip definitions

  • Most pairs (EURUSD, GBPUSD, AUDUSD, USDCAD, USDCHF, etc.): pip = 0.0001
  • JPY pairs (USDJPY, EURJPY, GBPJPY, etc.): pip = 0.01
  • Pipettes = 1/10 of a pip (5-decimal quotes); ignore for sizing.

3.3 Pip value — general formula

For a pair BASE/QUOTE, holding U units of BASE:

pip_value_in_QUOTE = U × pip_size
pip_value_in_ACCT  = pip_value_in_QUOTE × (QUOTE → ACCT rate)

Case A — quote = account currency (USD account, EUR/USD): pip value is fixed at U × 0.0001. One standard lot of EUR/USD = $10/pip. Always.

Case B — base = account currency (USD account, USD/JPY or USD/CAD): pip value depends on the live rate.

pip_value_USD = (pip_size / quote_rate) × U

USD/JPY at 150.50, 1 standard lot: (0.01 / 150.50) × 100,000 = $6.64/pip. USD/CAD at 1.3700, 1 standard lot: (0.0001 / 1.3700) × 100,000 = $7.30/pip.

Case C — cross pair (USD account, EUR/GBP, EUR/AUD, GBP/JPY, etc.): two-step conversion.

pip_value_USD = (pip_size / cross_rate) × U × (BASE/USD rate)

EUR/GBP at 0.8550 with EUR/USD at 1.0900, 1 standard lot: (0.0001 / 0.8550) × 100,000 × 1.0900 = $12.75/pip.

GBP/JPY at 192.00 with GBP/USD at 1.2700, 1 standard lot: (0.01 / 192.00) × 100,000 × 1.2700 = $6.61/pip.

3.4 Lot size from stop distance and risk

The whole point:

position_units = (account_equity × risk_pct) / (stop_distance_pips × pip_value_per_unit)
lots = position_units / 100,000

3.5 Python

def pip_size(symbol: str) -> float:
    return 0.01 if symbol.endswith("JPY") else 0.0001

def pip_value_per_lot(symbol: str, quote_to_acct: float, base_to_acct: float | None = None,
                      acct_ccy: str = "USD") -> float:
    """
    quote_to_acct: rate to convert QUOTE currency into account currency
    base_to_acct:  rate to convert BASE currency into account currency (cross only)
    Returns pip value per 1 standard lot (100,000 units).
    """
    base, quote = symbol[:3], symbol[3:]
    p = pip_size(symbol)
    if quote == acct_ccy:
        return p * 100_000                  # Case A: $10/pip for EURUSD
    if base == acct_ccy:
        return (p / quote_to_acct) * 100_000  # Case B: USDJPY, USDCAD
    # Case C: cross
    return (p * 100_000) * base_to_acct

def position_size_lots(equity: float, risk_pct: float, stop_pips: float,
                       pip_val_per_lot: float) -> float:
    risk_dollars = equity * risk_pct
    return risk_dollars / (stop_pips * pip_val_per_lot)

# Example: $10,000 acct, 1% risk, 25-pip stop on EURUSD
# lots = (10000 * 0.01) / (25 * 10) = 0.40 standard lots = 40,000 EUR

3.6 Leverage interaction

Brokerage leverage (30:1 EU, 50:1 US, 500:1 offshore) is a margin constraint, not a risk metric. The risk metric is notional exposure / equity.

effective_leverage = Σ |notional_i| / equity

A 1% risk per trade with a 25-pip stop on EUR/USD at 1.10 implies notional ≈ $44,000 on a $10k account — 4.4× effective leverage. Five concurrent correlated trades = 22× leverage even though each is "only 1%." This is the silent killer.

Hard cap: effective_leverage ≤ 10× for retail systematic. Below 5× is professional discipline.


4. Correlation Risk

4.1 The 5-trades-is-actually-1.5 problem

If you hold n positions with average pairwise correlation ρ̄ and equal per-trade variance σ², the portfolio variance is:

σ²_port = n · σ² · ((1 − ρ̄)/n + ρ̄)
       = σ² · (1 + (n−1)·ρ̄)

Effective independent trades:

n_eff = n / (1 + (n−1)·ρ̄)
n positions ρ̄ = 0.0 ρ̄ = 0.5 ρ̄ = 0.8 ρ̄ = 0.95
2 2.0 1.33 1.11 1.03
5 5.0 1.67 1.22 1.05
10 10.0 1.82 1.25 1.05

Five EUR-crosses (EURUSD, EURGBP, EURJPY, EURAUD, EURCAD) typically run pairwise ρ ≈ 0.6–0.8 over rolling 60-day windows. That basket = ~1.5 effective trades. Risking 1% on each = ~3.5% effective per-event risk, not 5%.

4.2 Typical major-pair correlations (rolling 60-day, approximate)

EURUSD GBPUSD USDJPY USDCHF AUDUSD USDCAD
EURUSD 1.00 +0.85 −0.30 −0.95 +0.70 −0.55
GBPUSD 1.00 −0.25 −0.80 +0.65 −0.50
USDJPY 1.00 +0.40 −0.25 +0.45
USDCHF 1.00 −0.65 +0.55
AUDUSD 1.00 −0.70
USDCAD 1.00

Correlations are not stationary. They spike toward |1| in crises (the "USD risk-off" regime collapses all pairs to USD strength). Re-estimate weekly on 60-day windows.

4.3 Portfolio risk rule

  • Per-trade risk: ≤1%
  • Per-currency exposure: ≤2% (sum of risk where that currency appears on the same side)
  • Per-direction USD exposure: ≤3%
  • Portfolio variance budget: total σ_port of open positions ≤ 1.5× single-trade σ

5. Drawdown Control

5.1 Loss limits

Window Limit Action on breach
Per trade 1% Stop placed, no override
Daily 3% Halt new entries until next session
Weekly 6% Halt + journal review
Monthly 10% Halt + strategy re-validation
Trailing peak-to-trough 15% Cut size to 50% until new equity high
Trailing peak-to-trough 25% Halt all live trading; offline diagnostic

5.2 Consecutive loss circuit breaker

If p = 0.5, probability of k straight losses = 0.5^k. Five in a row = 3.1% — possible. Eight in a row = 0.39% — strong evidence of regime change or edge degradation.

  • 3 consecutive losses: review entries, do not size up.
  • 5 consecutive losses: halve risk per trade.
  • 8 consecutive losses: halt strategy, full diagnostic before resuming.

5.3 Equity-curve filter

Trade the strategy only when its own equity curve trades above an SMA(20 or 30) of itself. When equity is below its own SMA, paper-trade only. This empirically reduces drawdowns by ~30–40% on momentum and breakout strategies without crushing CAGR — at the cost of missing the bounce off the bottom.


6. Black Swans

6.1 The four reference events

CHF unpeg, 15 Jan 2015. SNB abandoned the 1.20 EURCHF floor with no warning. EURCHF dropped ~20% in under a minute, spreads blew to 2000–3000 pips, no liquidity for ~40 minutes. FXCM clients ended with $225M in negative balances; FXCM needed $300M emergency financing. Alpari UK went bankrupt. Anyone short CHF with leverage and no negative-balance protection was wiped beyond zero.

GBP flash crash, 07 Oct 2016, 23:07 GMT. GBPUSD fell from 1.2608 to between 1.10 and 1.20 (broker-dependent) in roughly two minutes during the Tokyo open — the thinnest liquidity window of the FX day. Algorithmic stop-cascading + a possible fat-finger order in an empty book.

COVID, March 2020. USD funding crisis caused emerging-market currencies to drop 15–30%, AUDUSD fell from 0.69 to 0.55 in two weeks, spreads on minors widened 5–10×. Carry trades unwound violently.

Weekend gaps. Markets close Friday 17:00 ET, reopen Sunday 17:00 ET. News over the weekend (elections, central-bank emergency moves, geopolitical shocks) routinely produces 50–200 pip gaps. Stops do not protect through a gap — fills are at first available price.

6.2 Defenses

  1. Guaranteed stops (where offered, with premium) for any position held through high-impact news or weekends.
  2. Negative-balance protection is mandatory broker selection criterion. Regulated EU/UK/AU brokers offer it; many offshore do not.
  3. Position size assumes 3× stop slippage during stressed conditions. A 25-pip stop should be sized as if it were 75 pips for catastrophic-loss budgeting.
  4. No leveraged exposure into: central bank decisions, NFP, CPI, elections, weekends (unless explicitly designed for).
  5. No positions in pegged or managed-float pairs (HKD, certain EM pairs). Pegs always break — never on your schedule.
  6. Diversify brokers. A failed broker (Alpari, MF Global, Refco) freezes your capital and may haircut it. Hold no more than necessary at any one venue.
  7. Why the broker may owe you money you'll never see: when the broker goes insolvent, retail client funds may or may not be segregated and may or may not be covered by a compensation scheme (FSCS £85k in UK; nothing in many offshore jurisdictions). The CHF event taught the industry that the broker's solvency is part of your trade.

7. Carry, Swap, and Overnight

7.1 The mechanics

Holding a position past the broker's daily rollover (typically 17:00 New York) accrues the interest-rate differential between the two currencies, adjusted by the broker's markup (typically 0.25–1.0% on each side):

daily_swap = (interest_rate_long − interest_rate_short − broker_markup) × notional / 365

For most retail brokers the swap is published as points per lot per night and applied directly.

7.2 Triple-swap Wednesday

Spot FX settles T+2. A position held over 17:00 ET Wednesday settles Monday, crossing the weekend, so brokers apply 3× swap on Wednesday to account for Saturday and Sunday. If you are long the high-yielder, Wednesday is payday. If short, it is triple the bleed.

7.3 Why swap dominates small edges

Consider a strategy with average hold 14 days and average move +30 pips. On AUD/JPY with a typical 2.0 points/night negative swap (broker markup eats the carry), a 1-lot position bleeds ~$2.00 × 16 swap-days (incl. Wednesday triples) = ~$32 over the hold. The 30-pip gross profit ≈ $20. Net = −$12 per trade. The strategy showed positive backtest but loses live, every time.

Always backtest with realistic swap and commission. Many "edges" exist only when you ignore carrying cost.

7.4 Carry trade as a structural strategy

Long high-yielder + short low-yielder + low realized vol = the classic carry trade. Sharpe ratios of 1.0+ historically, but the return distribution is dramatically negatively skewed — the strategy "picks up nickels in front of a steamroller." Risk-budget carry trades as if their stop is 5× wider than recent volatility implies, because crises unwind them in days.


8. Practical Risk Checklist (programmer-ready)

Each rule is a hard boolean. If any returns False, the trade does not enter.

1.  has_edge:           expected_R = p*b − (1−p) > 0
2.  size_within_cap:    risk_pct ≤ min(0.02, 0.25 * kelly(p, b))
3.  stop_defined:       stop_pips > 0 AND stop is on the chart, not in your head
4.  position_math_ok:   lots == risk_dollars / (stop_pips * pip_value_per_lot)
5.  leverage_ok:        Σ|notional_open + this_notional| / equity ≤ 10
6.  ccy_exposure_ok:    Σ risk per currency on same side (incl. this) ≤ 2%
7.  corr_budget_ok:     n_eff after add ≥ 0.6 * n_positions  (i.e. ρ̄ < ~0.6)
8.  daily_loss_ok:      daily P&L > −3% of starting equity
9.  weekly_loss_ok:     weekly P&L > −6% of starting equity
10. streak_ok:          consecutive_losses < 5  (else size *= 0.5)
11. equity_curve_ok:    equity > SMA20(equity)  OR  trade in paper mode only
12. event_ok:           no high-impact news within ±15 min for held assets
13. session_ok:         not within 30 min of weekly close (Fri) unless flat
14. liquidity_ok:       current spread ≤ 1.5 * median_spread_60d
15. gap_safe:           if weekend hold, size assumes 3× stop slippage
16. swap_ok:            expected_R_after_swap_over_hold > 0
17. broker_ok:          broker has negative-balance protection AND segregated funds
18. peg_ok:             pair is not pegged or actively defended by a central bank
19. slippage_budget_ok: backtest P&L still positive at 2× current commission + 1 pip slip
20. kill_switch_armed:  system halts on trailing DD > 15%; resumes only after review

Each rule can become a unit test. A trade that fails any gate is logged with the failing gate id; this builds a dataset of "trades I didn't take and why" that itself becomes diagnostic.


References

  • Van Tharp, Trade Your Way to Financial Freedom, 2nd ed. — CPR formula, R-multiples, position-sizing variance study (~91% of return variance).
  • Ralph Vince, The Mathematics of Money Management and Portfolio Management Formulas — Optimal f, TWR, geometric-mean maximization.
  • Ernie Chan, Quantitative Trading (Wiley, 2008) — continuous Kelly f* = μ/σ², half-Kelly defaults.
  • MacLean, Thorp, Ziemba (eds.), The Kelly Capital Growth Investment Criterion — fractional Kelly variance/growth tradeoff.
  • BIS Markets Committee, The sterling 'flash event' of 7 October 2016 — official liquidity post-mortem.
  • FXCM SNB statement, Jan 2015 — $225M in negative client balances post-CHF unpeg.

Online sources consulted

Pro feature
Trading Bible — full chapter

The 3 Plain-English chapters are free. The rest of the library unlocks with Pro — start a 7-day trial, cancel anytime.

Unlock with Pro · €79/mo
Cancel anytime · 7-day trial
← Previous
Realistic returns: what good actually looks like
ESMA loss statistics, prop firm data, and honest performance bands.
Next →
Systematic trading doctrine
Universal rules across FX, equities, commodities, crypto.