Level 5 — MasteryFutures

Futures

75 minutes60 marksprintable — key stays hidden on paper

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 S0=2000S_0 = 2000. The continuously-compounded risk-free rate is r=8%r = 8\% p.a. A futures contract expires in T=90T = 90 days.

(a) Derive from a no-arbitrage argument the fair futures price formula F0=S0erTF_0 = S_0 e^{rT}. Explicitly construct the arbitrage portfolio that would be executed if the observed market price Fmkt>F0F_{mkt} > F_0, and show the locked-in riskless profit. (8)

(b) Compute the fair futures price F0F_0 and the basis (define it as S0F0S_0 - F_0) 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 D=30D = 30 at t=45t = 45 days (mid-life). Re-derive the adjusted fair price F0=(S0PV(D))erTF_0 = (S_0 - \text{PV}(D))e^{rT} and recompute F0F_0. 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 (notional/margin\text{notional}/\text{margin}). (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 Fnear=2450F_{near}=2450; near-month currently trades at 25102510, far-month at 25482548. 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 βp=1.3\beta_p = 1.3 against an index. Index future = 20000, lot size = 25. Derive the number of futures contracts to short for a full hedge using N=βp×Portfolio ValueContract ValueN = \beta_p \times \dfrac{\text{Portfolio Value}}{\text{Contract Value}}, 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 Fmkt>S0erTF_{mkt} > S_0 e^{rT}. Execute cash-and-carry:

  • At t=0t=0: borrow S0S_0 at rate rr, buy the stock, short one future at FmktF_{mkt}. Net cash flow = 0. (2)
  • At TT: deliver stock into the short future, receive FmktF_{mkt}; repay loan S0erTS_0 e^{rT}. (2)
  • Riskless profit =FmktS0erT>0= F_{mkt} - S_0 e^{rT} > 0 with zero net investment. (2)

Arbitrage forces Fmkt=S0erTF_{mkt} = S_0 e^{rT}. The symmetric reverse cash-and-carry (short stock, lend proceeds, long future) removes any Fmkt<S0erTF_{mkt} < S_0 e^{rT}. Hence F0=S0erTF_0 = S_0 e^{rT}. (2)

(b) Computation (6)

T=90/365=0.246575T = 90/365 = 0.246575 yr. rT=0.08×0.246575=0.019726rT = 0.08 \times 0.246575 = 0.019726. F0=2000e0.019726=2000×1.019922=2039.84F_0 = 2000\,e^{0.019726} = 2000 \times 1.019922 = 2039.84. (3)

Basis =S0F0=20002039.84=39.84= S_0 - F_0 = 2000 - 2039.84 = -39.84 (negative). (1)

Cost of carry =r>0= r > 0 ⇒ futures above spot ⇒ contango. Negative basis (spot below futures) confirms contango. (2)

(c) Dividend-adjusted (8)

PV of dividend: PV(D)=30er45/365=30e0.08×0.123288=30e0.009863=30×0.990185=29.706\text{PV}(D) = 30\,e^{-r\cdot 45/365} = 30\,e^{-0.08\times0.123288} = 30\,e^{-0.009863} = 30 \times 0.990185 = 29.706. (3)

F0=(S0PV(D))erT=(200029.706)×1.019922=1970.294×1.019922=2009.55F_0 = (S_0 - \text{PV}(D))e^{rT} = (2000 - 29.706)\times 1.019922 = 1970.294 \times 1.019922 = 2009.55. (3)

If dividend yield exceeds the financing rate, net carry (rq)<0(r - q) < 0, so F0<S0F_0 < S_0 → futures trade below spot, flipping contango into backwardation. (2)


Question 2

(a) Notional, margin, leverage (5)

Notional =18000×50=9,00,000= 18000 \times 50 = 9{,}00{,}000. (2) Initial margin =12%×900000=1,08,000= 12\% \times 900000 = 1{,}08{,}000. (2) Leverage =900000/108000=8.33×= 900000/108000 = 8.33\times. (1)

(b) MTM ledger (9) — Point value = 50; maintenance = 9%×900000=81,0009\%\times900000 = 81{,}000.

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 =25482510=38= 2548 - 2510 = 38 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 =20000×25=5,00,000= 20000 \times 25 = 5{,}00{,}000. (2) N=1.3×1,20,00,0005,00,000=1.3×24=31.2N = 1.3 \times \dfrac{1{,}20{,}00{,}000}{5{,}00{,}000} = 1.3 \times 24 = 31.2. (3) Round to 31 contracts short. (1) Residual beta: hedged notional =31×500000=1,55,00,000= 31\times500000 = 1{,}55{,}00{,}000 of beta-1 short vs. portfolio beta-exposure =1.3×120,00,000=1,56,00,000= 1.3\times120{,}00{,}000 = 1{,}56{,}00{,}000. Residual β=(1,56,00,0001,55,00,000)/120,00,000=100000/12000000=0.0083\beta = (1{,}56{,}00{,}000 - 1{,}55{,}00{,}000)/120{,}00{,}000 = 100000/12000000 = 0.0083. (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"}
]