Futures
Chapter: 5.1 Futures Difficulty: Mastery — cross-domain (finance math + no-arbitrage proof + coding) Time limit: 75 minutes Total marks: 60
Instructions: Answer all three questions. Show all working. Use notation for math. Where a computational procedure is requested, present clean pseudocode or Python. Assume 365-day-year convention unless a question states otherwise.
Question 1 — Cost of Carry, Basis & Arbitrage Proof (22 marks)
A non-dividend-paying stock trades at spot . The continuously-compounded risk-free rate is p.a. A futures contract expires in days.
(a) Derive from a no-arbitrage argument the fair futures price formula . Explicitly construct the arbitrage portfolio that would be executed if the observed market price , and show the locked-in riskless profit. (8)
(b) Compute the fair futures price and the basis (define it as ) for the given data. State whether this market is in contango or backwardation and justify with the sign of the cost of carry. (6)
(c) The stock now pays a discrete dividend at days (mid-life). Re-derive the adjusted fair price and recompute . Explain in one sentence why a large enough dividend yield can flip a contango market into backwardation. (8)
Question 2 — Margin, Mark-to-Market & Leverage Simulation (20 marks)
An index future has lot size = 50, entry price = 18000. Initial SPAN + exposure margin totals 12% of notional. Maintenance margin is 9% of notional. A trader goes long 1 lot.
(a) Compute the notional value, the initial margin deposited, and the effective leverage (). (5)
(b) Over three days the settlement prices are: Day 1 = 17820, Day 2 = 17950, Day 3 = 17650. Build a mark-to-market ledger: for each day give the daily P&L, running account balance (starting from initial margin), and flag any margin call (when balance falls below maintenance margin). (9)
(c) Write clean pseudocode/Python for a function mtm_ledger(entry, prices, lot, im_pct, mm_pct, side) that reproduces part (b) generally and returns the list of daily balances plus a boolean list of margin-call days. (6)
Question 3 — Rollover Cost & Hedge Optimisation (18 marks)
(a) A trader holds a long near-month future bought at ; near-month currently trades at , far-month at . Define and compute the rollover cost (far − near, in points) and explain what a positive rollover cost signals about the term structure (contango/backwardation). (6)
(b) A portfolio manager holds equity worth ₹1,20,00,000 with portfolio beta against an index. Index future = 20000, lot size = 25. Derive the number of futures contracts to short for a full hedge using , round sensibly, and state the resulting residual beta after the (rounded) hedge. (8)
(c) Explain in 2–3 sentences why stock futures typically require higher margins than index futures, linking your answer to volatility and diversification. (4)
Answer keyMark scheme & solutions
Question 1
(a) No-arbitrage derivation (8)
Suppose . Execute cash-and-carry:
- At : borrow at rate , buy the stock, short one future at . Net cash flow = 0. (2)
- At : deliver stock into the short future, receive ; repay loan . (2)
- Riskless profit with zero net investment. (2)
Arbitrage forces . The symmetric reverse cash-and-carry (short stock, lend proceeds, long future) removes any . Hence . (2)
(b) Computation (6)
yr. . . (3)
Basis (negative). (1)
Cost of carry ⇒ futures above spot ⇒ contango. Negative basis (spot below futures) confirms contango. (2)
(c) Dividend-adjusted (8)
PV of dividend: . (3)
. (3)
If dividend yield exceeds the financing rate, net carry , so → futures trade below spot, flipping contango into backwardation. (2)
Question 2
(a) Notional, margin, leverage (5)
Notional . (2) Initial margin . (2) Leverage . (1)
(b) MTM ledger (9) — Point value = 50; maintenance = .
| Day | Settle | Δ from prev | Daily P&L (×50) | Balance | Call? |
|---|---|---|---|---|---|
| 0 | 18000 | — | — | 108,000 | — |
| 1 | 17820 | −180 | −9,000 | 99,000 | No |
| 2 | 17950 | +130 | +6,500 | 105,500 | No |
| 3 | 17650 | −300 | −15,000 | 90,500 | No |
(P&L each 2 marks = 6; balances + call check 3.) Balance never drops below 81,000, so no margin call on any day. (check mark)
(c) Pseudocode (6)
def mtm_ledger(entry, prices, lot, im_pct, mm_pct, side):
# side = +1 long, -1 short
notional = entry * lot
im = im_pct * notional
mm = mm_pct * notional
balance = im
prev = entry
balances, calls = [], []
for p in prices:
pnl = side * (p - prev) * lot
balance += pnl
balances.append(balance)
calls.append(balance < mm) # margin call flag
prev = p
return balances, calls(Correct P&L sign & side handling 3; running balance 2; margin-call flag 1.)
Question 3
(a) Rollover cost (6)
Rollover cost far − near points. (3) A positive rollover cost means the far contract is dearer than the near — an upward-sloping term structure = contango; carrying the position forward costs 38 points. (3) (Note: entry price 2450 is a distractor — rollover cost uses current market quotes, not the original entry.)
(b) Hedge ratio (8)
Contract value . (2) . (3) Round to 31 contracts short. (1) Residual beta: hedged notional of beta-1 short vs. portfolio beta-exposure . Residual . (2)
(c) Stock vs index margins (4)
Stock futures reference a single company whose price is more volatile and exposed to idiosyncratic (news/earnings) risk, so SPAN margins scale with that higher volatility. (2) An index is a diversified basket, so unsystematic risk cancels out, volatility is lower, and required margin is correspondingly smaller. (2)
[
{"claim":"Q1b fair futures price ~2039.84","code":"S0=2000; r=0.08; T=sympify(90)/365; F0=S0*exp(r*T); result = abs(float(F0)-2039.84)<0.5"},
{"claim":"Q1b basis is negative (contango)","code":"S0=2000; r=0.08; T=sympify(90)/365; F0=S0*exp(r*T); basis=S0-F0; result = float(basis)<0"},
{"claim":"Q1c dividend-adjusted futures ~2009.55","code":"S0=2000; r=0.08; T=sympify(90)/365; D=30; PVd=D*exp(-r*sympify(45)/365); F0=(S0-PVd)*exp(r*T); result = abs(float(F0)-2009.55)<0.6"},
{"claim":"Q2 leverage 8.33x and no margin call day3","code":"lot=50; entry=18000; notional=entry*lot; im=0.12*notional; mm=0.09*notional; lev=notional/im; bal=im+(17820-18000)*lot+(17950-17820)*lot+(17650-17950)*lot; result = abs(float(lev)-8.3333)<0.01 and bal>mm"},
{"claim":"Q3b hedge = 31.2 contracts, round to 31","code":"N=Rational(13,10)*Rational(12000000,500000); result = float(N)==31.2 and round(float(N))==31"}
]