HFT & Advanced Concepts
Chapter: 6.5 High-Frequency Trading & Advanced Concepts Difficulty Level: 4 — Application (novel problems, no hints) Time Limit: 60 minutes Total Marks: 60
Question 1 — Latency Arbitrage & Colocation (12 marks)
An HFT firm receives a price update on Exchange A that a stock's fair value has moved from \50.00$50.04$50.00$ on Exchange B. The firm must send an order from its server to Exchange B to capture it.
- Firm's colocated round-trip latency:
- Competing (non-colocated) firm's round-trip latency:
- Signal-to-order internal processing time (both firms):
- The stale quote will be cancelled/updated by a passive liquidity provider after the Exchange A update.
(a) Determine total reaction time (processing + round trip) for each firm, and state which firm captures the arbitrage. (4)
(b) Compute the gross profit captured by the winning firm if the full 2,000 shares are hit at \50.00$50.04$. (4)
(c) The colocated firm considers reducing its round-trip latency to at a monthly cost of \8{,}000$. If this exact arbitrage opportunity recurs on average 22 times per trading day (21 trading days/month) with identical size and edge, is the upgrade justified purely on captured-edge grounds? Show the monthly benefit vs cost. (4)
Question 2 — Execution Algorithm Selection: TWAP vs VWAP vs POV (14 marks)
A pension fund must buy 600,000 shares over one trading session (6 hours). Historical intraday volume distribution (fraction of daily volume per hour) is:
| Hour | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| Volume % | 25% | 20% | 15% | 10% | 12% | 18% |
(a) State how many shares a pure TWAP algorithm schedules in each hour. (2)
(b) State how many shares a pure VWAP algorithm schedules in each hour. (3)
(c) In Hour 4, the market's total volume turns out to be 900,000 shares. A POV (Percentage of Volume) algorithm targeting 8% participation is used only in Hour 4. How many shares does it execute that hour? Compare this to the VWAP-scheduled quantity (assume expected daily volume = 10,000,000 shares). (5)
(d) The fund's trader argues VWAP minimises market impact versus TWAP in this stock. Give two reasons this is generally true, and one scenario where TWAP would be preferable. (4)
Question 3 — Market Making Economics at Scale (12 marks)
A market maker quotes a two-sided market: bid \99.98$100.02$.
(a) Compute the quoted spread in dollars and in basis points (relative to the mid-price). (3)
(b) The MM captures the full spread on 60% of its filled volume (round-trip captures) and suffers adverse selection on the other 40%, where it loses on average \0.03$ per share. On a day filling 4,000,000 shares total, compute the net trading P&L. (5)
(c) The exchange offers a maker rebate of \0.0020$ per share for all passive fills. Assuming all 4,000,000 shares were passive maker fills, compute the additional rebate income and the new total P&L. Comment on why rebates are strategically central to market-making at scale. (4)
Question 4 — Flash Crash & Circuit Breakers (12 marks)
A stock opens at \200.00\pm5%$ band around a rolling 5-minute reference price, triggering a 5-minute trading pause if price would trade outside the band.
(a) Compute the upper and lower price limits given the opening reference price. (2)
(b) During a liquidity vacuum, a large sell algorithm pushes the price down in these successive prints: \198, $194, $190.50, $189.90$. At which print is the lower band first breached, triggering a pause? Show the boundary. (4)
(c) Explain the mechanism by which uncoordinated HFT liquidity withdrawal can amplify a flash crash, referencing the 2010 event conceptually. (3)
(d) Regulators criticise "quote stuffing." Define it and explain how it can degrade market quality even without executed trades. (3)
Question 5 — Smart Order Routing Optimisation (10 marks)
A SOR must fill a market buy for 5,000 shares. Displayed liquidity at the offer across venues:
| Venue | Ask Price | Size | Taker Fee (per share) |
|---|---|---|---|
| A | \25.00$ | 2,000 | \0.0030$ |
| B | \25.00$ | 1,500 | \0.0010$ |
| C | \25.01$ | 3,000 | \0.0005$ |
(a) Determine the fill allocation a cost-minimising SOR chooses, and compute the total all-in cost (price + fees). Assume it must fill all 5,000 shares immediately. (6)
(b) A naïve SOR ignores fees and simply sweeps A then B then C by price. Compute its all-in cost and the savings the smart router achieves. (4)
End of paper. Show all working. Marks awarded for method as well as final answers.
Answer keyMark scheme & solutions
Question 1 (12)
(a) Reaction time = processing + round trip.
- Colocated firm: ✓(1)
- Competitor: ✓(1)
- Stale quote alive for . Colocated () captures; competitor () misses. ✓(2)
(b) Edge per share = 50.04 - 50.00 = \0.04= 0.04 \times 2000 = $80$. ✓(4) (1 for edge, 1 for size, 2 for product)
(c) The upgrade does not change who wins this trade (colocated already wins at ). Captured edge is unchanged by the upgrade for this recurring opportunity.
- Monthly benefit from this opportunity set: it was already being captured, so incremental benefit = $0. ✓(2)
- Cost = $8,000/month. Benefit ($0) < cost. Not justified on this edge alone. ✓(2)
(Full marks require recognising the upgrade adds no incremental capture here; awarding capture would be a trap. Marginal-benefit reasoning is the key insight.) If a student instead computes gross monthly edge = 80 \times 22 \times 21 = \36{,}960$ and compares to cost, award (1) but note it is the wrong marginal frame.
Question 2 (14)
(a) TWAP = equal per hour = shares each hour. ✓(2)
(b) VWAP = order size × hourly volume fraction:
- H1:
- H2:
- H3:
- H4:
- H5:
- H6: Sum ✓. (3) (correct method 2, all values + check 1)
(c) POV: shares executed in Hour 4. ✓(2) VWAP-scheduled H4 = 60,000 (from part b). ✓(1) POV executes 72,000 vs VWAP 60,000 → POV executes 12,000 more because realised volume (900k) exceeded the expected hourly share ( was expected, but POV keys off actual volume). ✓(2)
(d) VWAP reasons (any two, 1 each):
- Concentrates trading when natural liquidity/volume is highest → smaller footprint per share.
- Benchmarks to volume-weighted price, reducing signalling and slippage vs a rigid time schedule. TWAP preferable scenario (2): when volume is unpredictable/illiquid or the trader wants to avoid over-participating in volume spikes, or to conceal intent by steady, predictable-to-nobody slicing / when minimising timing risk of front-loaded VWAP. ✓(4)
Question 3 (12)
(a) Spread = 100.02 - 99.98 = \0.04= (100.02+99.98)/2 = $100.00= (0.04/100.00)\times 10{,}000 = 4\ \text{bps}$. ✓(1)
(b) Volume 4,000,000.
- Spread capture side: 60% × 4,000,000 = 2,400,000 shares. Half-spread earned per share on a round trip ≈ full spread \0.042{,}400{,}000 \times 0.04 = $96{,}000$. ✓(2)
- Adverse side: 40% × 4,000,000 = 1,600,000 shares, loss \0.03-$48{,}000$. ✓(2)
- Net P&L = 96{,}000 - 48{,}000 = \48{,}000$. ✓(1)
(c) Rebate = 0.0020 \times 4{,}000{,}000 = \8{,}000= 48{,}000 + 8{,}000 = $56{,}000$. ✓(1) Comment: at thin per-share margins and huge volumes, rebates can exceed raw spread P&L; they turn marginal/loss-making passive quotes profitable and drive maker-taker strategy. ✓(1)
Question 4 (12)
(a) Reference \200\pm5%$:
- Upper = 200 \times 1.05 = \210.00$ ✓(1)
- Lower = 200 \times 0.95 = \190.00$ ✓(1)
(b) Lower band = \190.00198194190.50189.90 (**below 190 → breach**). First breach at the **\189.90** print, since boundary. ✓(4) (band identified 1, sequential test 2, correct print 1)
(c) Uncoordinated HFT withdrawal: as price gaps, MMs widen/pull quotes to avoid adverse selection; liquidity evaporates simultaneously across venues, so the same order flow now walks a much thinner book, causing larger price jumps → feedback loop. In 2010 a large sell program met vanishing liquidity, prices cascaded, and "stub quotes" got hit at absurd prices. ✓(3)
(d) Quote stuffing = flooding an exchange with huge numbers of orders and near-instant cancellations. It degrades quality by consuming bandwidth/matching-engine capacity, introducing latency for others, obscuring the true book, and enabling latency games — all without real intent to trade. ✓(3)
Question 5 (10)
(a) All-in cost per share = price + taker fee:
- A: 25.00 + 0.0030 = \25.0030$
- B: 25.00 + 0.0010 = \25.0010$
- C: 25.01 + 0.0005 = \25.0105$
Cheapest first: B (1,500 @ 25.0010), then A (2,000 @ 25.0030), then need from C (@ 25.0105). ✓(3) Total cost:
- B:
- A:
- C:
- Total = \125{,}023.25$ ✓(3)
(b) Naïve sweeps by price only: A and B both at $25.00 → fill A 2,000 + B 1,500 = 3,500, then C 1,500 @ 25.01.
- A:
- B:
- C:
- Naïve total = \125{,}023.25$. ✓(2)
Here naïve and smart give the same allocation because A and B share the same price and both fully consumed; fees only reorder within the same price level and total volume taken is identical → savings = $0. ✓(2) (Key teaching point: SOR fee-optimisation only helps when it changes which shares at a given price get skipped or which venue is left partially unfilled; when the full displayed size at the cheap level is consumed, order is immaterial. Recognising $0 savings earns full marks.)
[
{"claim":"Q1b gross profit = 80","code":"edge=Rational('0.04'); vol=2000; result=(edge*vol==80)"},
{"claim":"Q2b VWAP allocations sum to 600000","code":"order=600000; fracs=[Rational(25,100),Rational(20,100),Rational(15,100),Rational(10,100),Rational(12,100),Rational(18,100)]; result=(sum(order*f for f in fracs)==600000 and order*Rational(10,100)==60000)"},
{"claim":"Q2c POV Hour4 = 72000 and exceeds VWAP by 12000","code":"pov=Rational(8,100)*900000; vwap=60000; result=(pov==72000 and pov-vwap==12000)"},
{"claim":"Q3 spread 4bps and net PnL 48000, total 56000","code":"spread=Rational('0.04'); mid=100; bps=spread/mid*10000; cap=Rational(60,100)*4000000*Rational('0.04'); adv=Rational(40,100)*4000000*Rational('0.03'); net=cap-adv; total=net+Rational('0.0020')*4000000; result=(bps==4 and net==48000 and total==56000)"},
{"claim":"Q4 limits 210 and 190, breach at 189.90","code":"ref=200; up=ref*Rational(105,100); lo=ref*Rational(95,100); result=(up==210 and lo==190 and Rational('189.90')<lo and Rational('190.50')>lo)"},
{"claim":"Q5 smart total all-in cost = 125023.25","code":"B=1500*Rational('25.0010'); A=2000*Rational('25.0030'); C=1500*Rational('25.0105'); result=(B+A+C==Rational('125023.25'))"}
]