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
- Inputs are estimated, not known. A 5% overestimate of
pcan make full-Kelly negative-EV in log-space. Ernie Chan and MacLean/Thorp/Ziemba consistently recommend ½ Kelly or less because parameter uncertainty dominates. - 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. - 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
σ_portof 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
- Guaranteed stops (where offered, with premium) for any position held through high-impact news or weekends.
- Negative-balance protection is mandatory broker selection criterion. Regulated EU/UK/AU brokers offer it; many offshore do not.
- 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.
- No leveraged exposure into: central bank decisions, NFP, CPI, elections, weekends (unless explicitly designed for).
- No positions in pegged or managed-float pairs (HKD, certain EM pairs). Pegs always break — never on your schedule.
- 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.
- 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
- Quantitative Trading: Kelly formula revisited — Ernest Chan
- How much leverage should you use? — Ernest Chan
- The Risk-Constrained Kelly Criterion — QuantInsti
- Van Tharp Institute — Position Sizing Calculator
- Pip Value Formula — EarnForex
- FXCM Second-by-Second Account of SNB Flash Crash
- How Forex Brokers Went Bankrupt Overnight — LeapRate
- The sterling 'flash event' of 7 October 2016 — BIS
- Forex Correlation — Mataf
- Currency Pairs Correlation Table — Defcofx
- What is Triple Swap? — Axi
- FX Swap Trading — Pepperstone
- Optimal F Money Management — QuantifiedStrategies
- Beware of Excessive Leverage — QuantPedia