Risk & Money Management
Chapter: 4.7 Risk & Money Management Level: 5 — Mastery (cross-domain: probability, calculus, coding, proof) Time limit: 90 minutes Total marks: 60
Instructions: Answer all three questions. Show full derivations. Where code is requested, write clean, runnable Python (NumPy/standard library). Justify every modelling assumption.
Question 1 — Position Sizing, Kelly, and the Geometric Growth Proof (24 marks)
A trader runs a strategy with win probability , and a payoff where a win returns times the amount risked and a loss forfeits the full amount risked. Account equity is E = \50{,}000$.
(a) State the fixed-fractional risk rule (1–2% rule) and compute the dollar risk per trade at the 1.5% level. A long trade is entered at \200$188$. Compute the position size (shares) consistent with this risk budget. (4 marks)
(b) Derive the Kelly fraction for the above payoff structure by maximising the expected logarithmic growth rate Show the first-order condition, solve for , and prove the solution is a maximum (second-derivative test). Evaluate for . (8 marks)
(c) Prove that for the long-run growth rate becomes negative (over-betting leads to ruin-like decay), given (even-money). Show the exact break-even fraction where and relate to . (6 marks)
(d) Explain, with reference to your result in (a), why practitioners typically trade at a fraction of Kelly (e.g. "half-Kelly") rather than full Kelly. Give one quantitative and one behavioural reason. (6 marks)
Question 2 — Correlation Risk, Portfolio Exposure & Hedging (20 marks)
A portfolio holds two positions, A and B, each risking \1{,}000$1{,}000\rho$.
(a) Treating each position's P&L as a random variable with standard deviation \sigma_A = \sigma_B = \1{,}000, derive the standard deviation of the combined two-position portfolio P&L as a function of \rho\rho = -1, 0, +1$ and interpret each in risk-management terms. (6 marks)
(b) The trader's rule caps total portfolio heat (sum of individual position risks) at 6% of a \50{,}000$ account. Write a Python function max_positions(equity, risk_per_trade_pct, heat_cap_pct) returning the maximum number of equal-risk positions allowed, and evaluate it for risk_per_trade_pct=1.5, heat_cap_pct=6. (6 marks)
(c) Position A is 500 shares of a stock at \200= 1.3$504{,}000$, compute the number of futures contracts to short for a beta-neutral hedge. State the residual risk that remains after hedging. (8 marks)
Question 3 — Risk of Ruin, Drawdown & Adaptive Sizing Simulation (16 marks)
(a) For a system with per-trade win probability and equal win/loss size (even money), the classical risk-of-ruin approximation for risking a fixed fraction is often written via the edge. State the simplified risk-of-ruin formula where and is the number of risk-units of capital. Compute for and units, and interpret. (4 marks)
(b) Write a Python Monte-Carlo function risk_of_ruin(p, units, trials=100000) that simulates fixed-unit betting until ruin or until starting capital, returning the empirical ruin probability. Describe how you would validate it against part (a). (6 marks)
(c) Design an adaptive position-sizing rule ("size up/down with performance") tied to a daily-loss circuit breaker: risk is scaled by a factor where is current drawdown from equity peak. Propose a concrete piecewise , prove it never lets a single day's loss exceed a 3% daily stop given base risk 1% per trade and max 4 trades/day, and discuss why reducing size in drawdown lowers risk of ruin. (6 marks)
End of paper.
Answer keyMark scheme & solutions
Question 1
(a) (4 marks)
- Rule: risk a fixed small fraction (1–2%) of equity per trade so no single loss materially harms capital. (1)
- Dollar risk = 0.015 \times 50{,}000 = \750$. (1)
- Stop distance = 200 - 188 = \12$ per share. (1)
- Shares shares (round down to stay within budget). (1)
(b) (8 marks)
- . (1)
- First derivative: . (2)
- Set : . Expanding: . Collect: . So (2)
- Second derivative: for all admissible ⇒ concave ⇒ maximum. (2)
- For : . (1)
(c) (6 marks)
- For : , and . (1)
- Break-even : solve with . . For : . (2)
- Numerically , while , so . (2)
- Conclusion: for , — over-betting drives geometric decay of capital despite a positive edge. (1)
(d) (6 marks)
- Quantitative: near , is flat (parabolic top), so half-Kelly captures ~75% of the growth rate with roughly half the volatility of returns — much better risk-adjusted growth. Also parameter uncertainty in means true may be lower; over-estimating it pushes you toward the region. (3)
- Behavioural: full-Kelly drawdowns are brutal (can lose 50%+ frequently), causing traders to abandon the system; fractional Kelly keeps drawdowns psychologically tolerable and reduces risk of ruin. (3)
Question 2
(a) (6 marks)
- . (2)
- : \sigma_P=1000\sqrt{4}=\2000$ (risks fully add — worst case, concentrated). (1)
- : \sigma_P=1000\sqrt{2}\approx\1414$2000$ naive sum). (1)
- : (perfect hedge — positions cancel). (1)
- Interpretation: correlated positions understate true risk if summed naively; the effective portfolio risk depends on . (1)
(b) (6 marks)
def max_positions(equity, risk_per_trade_pct, heat_cap_pct):
risk_per_trade = equity * risk_per_trade_pct/100
heat_cap = equity * heat_cap_pct/100
return int(heat_cap // risk_per_trade)
max_positions(50000, 1.5, 6) # -> 4- Each position risk =\750=$30003000/750=4$ positions. (marks: correct formula 3, correct floor/int 1, answer 4 → 2)
(c) (8 marks)
- Position dollar value = 500\times200=\100{,}000$. (1)
- Beta-adjusted exposure =100{,}000\times1.3=\130{,}000$. (2)
- Value per futures contract =50\times4000=\200{,}000$. (2)
- Contracts to short contract (or 0.65 if fractional/mini allowed). (2)
- Residual risk: hedge removes only market/systematic (beta) risk; idiosyncratic (stock-specific) risk remains, plus basis risk between stock and index and beta-estimation error. (1)
Question 3
(a) (4 marks)
- edge . (1)
- . (1)
- , i.e. about 1.8% chance of ruin with 20 units of capital. (1)
- Interpretation: even a modest edge plus adequate capitalisation (many risk-units) makes ruin unlikely; thin capitalisation (small ) makes ruin dangerously high. (1)
(b) (6 marks)
import random
def risk_of_ruin(p, units, trials=100000):
ruined = 0
for _ in range(trials):
cap = units
while 0 < cap < 2*units:
cap += 1 if random.random() < p else -1
if cap <= 0:
ruined += 1
return ruined/trials- Simulate fixed 1-unit bets, absorbing barriers at 0 (ruin) and (target). (3)
- Validation: run with
p=0.55, units=20; empirical result should approximate the gambler's-ruin closed form (bounded version). For the unbounded formula in (a), compare with large target and check convergence; expect ~0.018. Increasetrialsto shrink Monte-Carlo standard error (). (3)
(c) (6 marks)
- Proposed rule (base risk ): Effective risk per trade . (2)
- Daily-stop proof: with base risk 1% and max 4 trades, worst-case daily loss — this exceeds a 3% daily stop, so we add a circuit breaker: halt trading once cumulative daily loss reaches 3%. Then max realised daily loss (plus at most one in-flight trade; sizing the last permitted trade so remaining budget enforces the cap). Formally, track cumulative loss ; permit a new trade only if , guaranteeing . (2)
- Why reduce size in drawdown: smaller bets in drawdown reduce the number of effective risk-units lost per adverse trade, increasing in the risk-of-ruin sense and shrinking geometric decay; it prevents the "doubling-down into ruin" failure mode and preserves capital to recover. (2)
[
{"claim":"Position size = 62 shares from $750 risk / $12 stop","code":"risk=0.015*50000; shares=int(risk/(200-188)); result = (shares==62)"},
{"claim":"Kelly fraction f*=0.325 for b=2,p=0.55","code":"p=Rational(55,100); b=2; f=(p*(b+1)-1)/b; result = (f==Rational(325,1000))"},
{"claim":"Even-money Kelly f*=0.10 for p=0.55","code":"p=Rational(55,100); f=2*p-1; result = (f==Rational(1,10))"},
{"claim":"Break-even f0 ~1.97*f* (approx 2*Kelly) for p=0.55 even money","code":"import mpmath as mp; f0=mp.findroot(lambda x: 0.55*mp.log(1+x)+0.45*mp.log(1-x), 0.2); result = (abs(f0/0.10-2)<0.05)"},
{"claim":"Portfolio sigma at rho=0 is 1000*sqrt(2)~1414","code":"import math; s=1000*math.sqrt(2+2*0); result = (abs(s-1414.2135)<0.01)"},
{"claim":"Max positions = 4 at 1.5% risk, 6% heat cap","code":"result = (int((50000*6/100)//(50000*1.5/100))==4)"},
{"claim":"Beta-neutral hedge ~0.65 contracts","code":"c=(500*200*1.3)/(50*4000); result = (abs(c-0.65)<1e-9)"},
{"claim":"Risk of ruin ~0.0181 for p=0.55,U=20","code":"R=(Rational(9,10)/Rational(11,10))**20; result = (abs(float(R)-0.0181)<0.001)"}
]