Trading vs Investing & Styles
Level 5 — Mastery (Cross-Domain: Finance + Mathematics + Coding) Time Limit: 90 minutes Total Marks: 60
Instructions: Answer all three questions. Show full working. Use notation for mathematics. Code may be in Python-like pseudocode or valid Python. Justify all modelling assumptions.
Question 1 — Style Selection Under Capital & Time Constraints (20 marks)
A retail trader has ₹5,00,000 capital and can dedicate only 45 minutes per day (before market open). Broker charges a round-trip cost of 0.05% of turnover per trade. Consider four styles with the following per-trade statistics:
| Style | Trades/day | Avg gross edge/trade | Hold time |
|---|---|---|---|
| Scalping | 40 | 0.08% | seconds–minutes |
| Intraday | 4 | 0.35% | hours |
| Swing | 0.2 (1 per 5 days) | 3.0% | days–weeks |
| Positional | 0.05 (1 per 20 days) | 9.0% | weeks–months |
(a) Define net edge per trade as gross edge minus round-trip cost. Compute the net edge for each style and identify which styles are rendered unprofitable by costs. (6 marks)
(b) Assuming full capital deployed each trade and net edges compound multiplicatively over trades, derive an expression for the expected daily net return for each style. Compute numerically for Scalping and Intraday. (6 marks)
(c) Given the trader's time constraint (45 min/day, pre-market only), argue rigorously which single style is feasible AND profitable. Reference both the quantitative results and the qualitative demands of each style. (5 marks)
(d) State the personality/discipline mismatch risk if this trader forced themselves into scalping despite the time constraint. (3 marks)
Question 2 — Mean-Reversion vs Momentum: Build & Prove (22 marks)
Consider a de-trended price series modelled as an Ornstein–Uhlenbeck (mean-reverting) process in discrete form:
with , , .
(a) Prove that the expected value moves toward whenever , and state the condition on for the deterministic part to be stable (non-oscillating, non-diverging). (6 marks)
(b) A mean-reversion trader buys when and sells at . A momentum trader buys when expecting continuation. Using the OU structure, explain mathematically why the mean-reversion signal has positive expected edge on this series while the momentum signal has negative expected edge. (6 marks)
(c) Write a coded backtest (Python) that: simulates steps, applies the mean-reversion rule with , and returns the average per-trade return. Your code must define an entry/exit loop. (6 marks)
(d) Explain how the SAME market, in a trending regime ( itself drifting upward at rate per step), would flip the sign of edge — favouring momentum. Give the modified drift equation. (4 marks)
Question 3 — Realistic Return Expectations & Risk of Ruin (18 marks)
A day-trader claims a system with win rate , average win , average loss , risking a fixed fraction of capital per trade.
(a) Compute the expectancy per trade in -multiples and state whether the edge is positive. (4 marks)
(b) Using the Kelly criterion for a symmetric payoff, , compute the optimal fraction. Comment on why the trader's chosen is far below Kelly and why that is rational for realistic return targets. (5 marks)
(c) The trader claims "I will double my account every month (≈20 trading days) with this system." Using expectancy and , compute the expected geometric monthly growth and evaluate the realism of the doubling claim. (6 marks)
(d) Contrast the realistic annual return expectation of this active day-trader with a long-term index investor, in one paragraph, citing the trade-off between effort, drawdown risk, and consistency. (3 marks)
END OF PAPER
Answer keyMark scheme & solutions
Question 1
(a) Net edge = gross edge − round-trip cost (0.05%) (6 marks)
- Scalping: ✓ (1)
- Intraday: ✓ (1)
- Swing: ✓ (1)
- Positional: ✓ (1)
Rendered unprofitable: None are outright negative, BUT scalping's net edge (0.03%) is razor-thin — the slightest slippage/latency makes it negative. Award (2) for identifying scalping as marginal/fragile (cost consumes 62.5% of gross edge). (2)
(b) Expected daily net return (6 marks)
Compounding trades each with net edge : for small . Full derivation credit (2).
- Scalping: /day ✓ (2)
- Intraday: /day ✓ (2)
(Note: nearly identical daily return — but achieved with radically different effort.)
(c) Feasible & profitable style (5 marks)
- Scalping requires continuous full-session screen presence, instant execution, low-latency infrastructure — impossible in 45 min pre-market. (2)
- Intraday needs monitoring through the day → also violates constraint. (1)
- Swing trading fits: entries/reviews done pre-market in ~45 min; positions held days needing no intraday monitoring; net edge 2.95% is robust to costs. Swing is the answer. (2)
(d) Personality/discipline mismatch (3 marks) Forcing scalping under a time constraint means entering/exiting hurriedly without focus → execution errors, missed stops, overtrading, and emotional tilt. Scalping demands sustained concentration and rapid decision-making that a 45-min distracted window cannot supply, converting a thin +0.03% edge into net losses. (3)
Question 2
(a) Proof of mean reversion (6 marks)
Distance to mean: . (3) Since , the gap shrinks by factor → moves toward . (2) Stability condition: need ; for non-oscillating (monotone) decay require . (1)
(b) Sign of edge (6 marks) Mean-reversion buy at : expected next-step drift → price expected to rise toward → positive edge. (3) Momentum buy at : expected drift → price expected to fall → negative edge (trend continuation contradicts the pull-to-mean). (3)
(c) Backtest code (6 marks)
import numpy as np
np.random.seed(0)
theta, mu, sigma, N, k = 0.3, 100.0, 2.0, 10000, 1.0
x = mu
xs = [x]
for _ in range(N):
x = x + theta*(mu - x) + np.random.normal(0, sigma)
xs.append(x)
rets, in_pos, entry = [], False, 0.0
for xt in xs:
if not in_pos and xt < mu - k*sigma: # entry
in_pos, entry = True, xt
elif in_pos and xt >= mu: # exit at mean
rets.append((xt - entry)/entry)
in_pos = False
print("avg per-trade return:", np.mean(rets))Marks: simulation loop (2), entry/exit logic (2), return calc + positive result (2). Expected avg per-trade return ≈ +2% (positive), confirming edge.
(d) Trending regime flips edge (4 marks) Modified drift with mean itself rising: , so Now the moving-target term; a price above the old mean may still lie below the rising mean, so buying strength (momentum) captures the drift . When is large relative to , momentum edge > mean-reversion edge. (4)
Question 3
(a) Expectancy (4 marks) (3) Positive edge (+0.10R). ✓ (1)
(b) Kelly (5 marks) (2) Trader's is of Kelly ("fifth-Kelly"). Rational because: full Kelly gives brutal drawdowns (~50%+), estimation error in overshoots, and psychological tolerability + capital preservation matter more than maximal growth for realistic sustainable targets. (3)
(c) Doubling claim (6 marks) Per-trade expected geometric growth with , symmetric : Growth factor per trade (log-utility) or arithmetically . (2) Over 20 trades: expected monthly. (2) Doubling (+100%) requires either near Kelly with huge variance or is simply unrealistic — the honest expectation is ~4% monthly (~60% annualized before variance drag), NOT 100%/month. The claim is fantasy. (2)
(d) Realistic contrast (3 marks) The day-trader might realistically target ~2–5%/month (30–60% annual) if skilled, but with high effort, steep drawdown risk, and inconsistency — most fail. The index investor accepts ~10–12% annual passively, with far lower effort and drawdown, and high consistency. The trade-off is effort + risk for higher potential return that is neither guaranteed nor easily sustained. (3)
[
{"claim":"Scalping net edge = 0.03%","code":"result = round(0.08-0.05,2)==0.03"},
{"claim":"Scalping daily return approx 1.207%","code":"result = round(((1.0003)**40-1)*100,3)==1.207"},
{"claim":"Intraday daily return approx 1.205%","code":"result = round(((1.003)**4-1)*100,3)==1.205"},
{"claim":"OU gap shrinks by (1-theta)=0.7","code":"result = (1-0.3)==0.7"},
{"claim":"Expectancy = 0.10R","code":"result = round(0.55-0.45,2)==0.10"},
{"claim":"Full Kelly = 10%","code":"result = 2*0.55-1==Rational(1,10)"},
{"claim":"Monthly expected growth ~4.08%","code":"result = round(((1+0.02*0.10)**20-1)*100,2)==4.08"}
]