Level 5 — MasteryRisk & Money Management

Risk & Money Management

90 minutes60 marksprintable — key stays hidden on paper

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 p=0.55p = 0.55, and a payoff where a win returns bb 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 \200withaprotectivestopatwith a protective stop at$188$. Compute the position size (shares) consistent with this risk budget. (4 marks)

(b) Derive the Kelly fraction ff^* for the above payoff structure by maximising the expected logarithmic growth rate g(f)=pln(1+bf)+(1p)ln(1f).g(f) = p\ln(1+bf) + (1-p)\ln(1-f). Show the first-order condition, solve for ff^*, and prove the solution is a maximum (second-derivative test). Evaluate ff^* for b=2b = 2. (8 marks)

(c) Prove that for f>2ff > 2f^* the long-run growth rate g(f)g(f) becomes negative (over-betting leads to ruin-like decay), given b=1b=1 (even-money). Show the exact break-even fraction f0f_0 where g(f0)=0g(f_0)=0 and relate f0f_0 to ff^*. (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(i.e.eachpositionsstoplossrepresentsa(i.e. each position's stop-loss represents a$1{,}000potentialloss).Theirtradeoutcomeshavecorrelationpotential loss). Their trade outcomes have correlation\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.Evaluatefor. Evaluate for \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(beta(beta= 1.3totheindex).Designanindexfutureshedge:givenindexfutureswithcontractmultiplierto the index). Design an index-futures hedge: given index futures with contract multiplier$50perindexpointandindexlevelper index point and index level4{,}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 pp 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 R=(1edge1+edge)U,R = \left(\frac{1-\text{edge}}{1+\text{edge}}\right)^{U}, where edge=2p1\text{edge} = 2p-1 and UU is the number of risk-units of capital. Compute RR for p=0.55p = 0.55 and U=20U = 20 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 2×2\times 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 k(D)k(D) where DD is current drawdown from equity peak. Propose a concrete piecewise k(D)k(D), 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 =750/12=62.562= 750 / 12 = 62.5 \Rightarrow 62 shares (round down to stay within budget). (1)

(b) (8 marks)

  • g(f)=pln(1+bf)+(1p)ln(1f)g(f)=p\ln(1+bf)+(1-p)\ln(1-f). (1)
  • First derivative: g(f)=pb1+bf1p1fg'(f)=\dfrac{pb}{1+bf}-\dfrac{1-p}{1-f}. (2)
  • Set g(f)=0g'(f)=0: pb(1f)=(1p)(1+bf)pb(1-f)=(1-p)(1+bf). Expanding: pbpbf=(1p)+(1p)bfpb - pbf = (1-p) + (1-p)bf. Collect: pb(1p)=bf[p+(1p)]=bfpb-(1-p) = bf[p+(1-p)] = bf. So f=pb(1p)b=p(b+1)1b.f^* = \frac{pb-(1-p)}{b}=\frac{p(b+1)-1}{b}. (2)
  • Second derivative: g(f)=pb2(1+bf)21p(1f)2<0g''(f) = -\dfrac{pb^2}{(1+bf)^2} - \dfrac{1-p}{(1-f)^2} < 0 for all admissible ff ⇒ concave ⇒ maximum. (2)
  • For b=2,p=0.55b=2,p=0.55: f=0.55312=0.652=0.325f^*=\dfrac{0.55\cdot 3 -1}{2}=\dfrac{0.65}{2}=0.325. (1)

(c) (6 marks)

  • For b=1b=1: g(f)=pln(1+f)+(1p)ln(1f)g(f)=p\ln(1+f)+(1-p)\ln(1-f), and f=2p1f^*=2p-1. (1)
  • Break-even f0f_0: solve g(f0)=0g(f_0)=0 with f00f_0\ne 0. pln(1+f0)=(1p)ln(1f0)p\ln(1+f_0) = -(1-p)\ln(1-f_0). For p=0.55p=0.55: 0.55ln(1+f0)+0.45ln(1f0)=00.55\ln(1+f_0)+0.45\ln(1-f_0)=0. (2)
  • Numerically f00.1974f_0 \approx 0.1974, while f=0.10f^*=0.10, so f01.97f2ff_0 \approx 1.97 f^* \approx 2f^*. (2)
  • Conclusion: for f>f02ff>f_0\approx 2f^*, g(f)<0g(f)<0 — over-betting drives geometric decay of capital despite a positive edge. (1)

(d) (6 marks)

  • Quantitative: near ff^*, gg 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 p,bp,b means true ff^* may be lower; over-estimating it pushes you toward the g<0g<0 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)

  • σP=σA2+σB2+2ρσAσB=10002+2ρ\sigma_P=\sqrt{\sigma_A^2+\sigma_B^2+2\rho\sigma_A\sigma_B}=1000\sqrt{2+2\rho}. (2)
  • ρ=+1\rho=+1: \sigma_P=1000\sqrt{4}=\2000$ (risks fully add — worst case, concentrated). (1)
  • ρ=0\rho=0: \sigma_P=1000\sqrt{2}\approx\1414(diversificationbenefit;lessthanthe(diversification benefit; less than the$2000$ naive sum). (1)
  • ρ=1\rho=-1: σP=0\sigma_P=0 (perfect hedge — positions cancel). (1)
  • Interpretation: correlated positions understate true risk if summed naively; the effective portfolio risk depends on ρ\rho. (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;cap; cap =$3000;; 3000/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 =130,000/200,000=0.651= 130{,}000/200{,}000 = 0.65 \approx 1 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 =2(0.55)1=0.10=2(0.55)-1=0.10. (1)
  • R=(10.101+0.10)20=(0.91.1)20=(0.818)20R=\left(\dfrac{1-0.10}{1+0.10}\right)^{20}=\left(\dfrac{0.9}{1.1}\right)^{20}=(0.8\overline{18})^{20}. (1)
  • 0.0181\approx 0.0181, 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 UU) 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 2U2U (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. Increase trials to shrink Monte-Carlo standard error (1/N\sim 1/\sqrt{N}). (3)

(c) (6 marks)

  • Proposed rule (base risk r0=1%r_0=1\%): k(D)={1D<5%0.55%D<10%0D10% (stop trading)k(D)=\begin{cases}1 & D<5\%\\ 0.5 & 5\%\le D<10\%\\ 0 & D\ge 10\%\ (\text{stop trading})\end{cases} Effective risk per trade =k(D)r0= k(D)\cdot r_0. (2)
  • Daily-stop proof: with base risk 1% and max 4 trades, worst-case daily loss 4×1%=4%\le 4\times1\%=4\% — 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 3%\le 3\% (plus at most one in-flight trade; sizing the last permitted trade so remaining budget 3%\le3\% enforces the cap). Formally, track cumulative loss LL; permit a new trade only if L+next risk3%L + \text{next risk} \le 3\%, guaranteeing Lmax3%L_{\max}\le 3\%. (2)
  • Why reduce size in drawdown: smaller bets in drawdown reduce the number of effective risk-units lost per adverse trade, increasing UU 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)"}
]