RSK Risk Management Fundamentals
You can't compound returns from a blown account
Learning Objectives
- •Understand why risk management matters more than signal quality
- •Use the R-multiple framework to normalize trade outcomes
- •See the math behind why drawdowns are so hard to recover from
- •Learn how adaptive risk scaling protects capital in real time
Explain Like I'm 5
Imagine a jar with 100 marbles — 59 green (winners) and 41 red (losers). If you bet your entire jar on each draw, one red marble wipes you out. But if you bet just 1 marble at a time, you steadily grow your collection. Risk management is about how many marbles you bet each round — small enough to survive bad streaks, large enough for wins to add up.
Think of It This Way
Risk management is the seatbelt for your portfolio. It doesn't make the car faster, but it keeps you alive when you crash. Every trader hits drawdowns. The difference between those who survive and those who blow up is their risk infrastructure.
1Why This Comes Before Everything Else
The Asymmetry of Drawdown Recovery
2The R-Multiple Framework
3Adaptive Risk Scaling
Adaptive Risk Scaling vs Fixed Risk — Survival Analysis
Key Formulas
Risk of Ruin (Simplified)
p is edge probability, B is bankroll in risk units, R is risk per trade. As B/R grows (smaller risk per trade), ruin probability drops fast. This is why risking 0.30% of capital per trade makes ruin effectively impossible.
Drawdown Recovery Requirement
A 50% drawdown needs 100% gain to recover. A 10% drawdown only needs 11.1%. This asymmetry is why max drawdown control matters more than almost anything else in risk management.
Hands-On Code
Monte Carlo Drawdown Simulation
import numpy as np
def simulate_max_drawdown(win_rate: float, avg_win: float,
avg_loss: float, risk_pct: float,
n_trades: int, n_sims: int = 10000):
"""
Monte Carlo simulation of maximum drawdown distribution.
Parameters:
win_rate: probability of winning trade
avg_win: average winning trade in R-multiples
avg_loss: average losing trade in R-multiples
risk_pct: fraction of equity risked per trade
n_trades: number of trades to simulate
n_sims: number of Monte Carlo iterations
"""
max_dds = np.zeros(n_sims)
for i in range(n_sims):
equity = 100.0
peak = 100.0
max_dd = 0.0
for _ in range(n_trades):
if np.random.random() < win_rate:
equity += equity * risk_pct * avg_win
else:
equity -= equity * risk_pct * avg_loss
peak = max(peak, equity)
dd = (peak - equity) / peak
max_dd = max(max_dd, dd)
max_dds[i] = max_dd * 100 # percentage
return {
'median': np.median(max_dds),
'p95': np.percentile(max_dds, 95),
'p99': np.percentile(max_dds, 99),
'breach_prob': np.mean(max_dds > 10) * 100,
}
# Conservative risk parameters
result = simulate_max_drawdown(
win_rate=0.592, avg_win=1.65, avg_loss=0.95,
risk_pct=0.003, n_trades=4500
)
print(f"Median Max DD: {result['median']:.2f}%")
print(f"95th Percentile: {result['p95']:.2f}%")
print(f"99th Percentile: {result['p99']:.2f}%")
print(f"10% Breach Prob: {result['breach_prob']:.2f}%")This runs thousands of possible equity paths and finds the worst drawdown in each. By checking the 95th and 99th percentiles, you can see whether a given risk level keeps drawdown within your limits. At 0.30% risk per trade, breach probability typically lands well below 1%.
Knowledge Check
Q1.If your account drops by 50%, how much must you gain to recover to the original balance?
Q2.What does "1R" represent in the R-multiple framework?
Q3.What is the correct response when a trading system enters a deeper drawdown?
Assignment
Using the Monte Carlo simulation code, test risk_pct values of 0.5%, 1.0%, 2.0%, and 3.0%. At what risk level does the 99th percentile max drawdown first cross 10%? Build a table of risk level vs. drawdown percentiles vs. breach probability. Write 300 words explaining why smaller sizes produce much better survival rates.