Level 5 — MasteryOptions Basics

Options Basics

90 minutes60 marksprintable — key stays hidden on paper

Chapter: 5.2 Options Basics Difficulty: Level 5 — Mastery (cross-domain: quantitative finance + mathematics + coding + proof) Time Limit: 90 minutes Total Marks: 60

Instructions: Answer all three questions. Show full derivations. For coding parts, write clean pseudocode or Python. All prices in ₹ (INR). Assume no transaction costs unless stated.


Question 1 — Payoff Algebra, Breakeven & Put–Call Parity (22 marks)

A Nifty-style underlying trades at spot S0=20,000S_0 = 20{,}000. Consider European options with strike K=20,000K = 20{,}000, expiry TT. The call premium is C=250C = 250, the put premium is P=180P = 180.

(a) Write the expiry payoff functions Πcall buyer(ST)\Pi_{\text{call buyer}}(S_T) and Πput buyer(ST)\Pi_{\text{put buyer}}(S_T) as piecewise functions including premium paid. Hence derive the breakeven points for the long call and long put. (6)

(b) A trader constructs a long straddle (buy the call + buy the put, same KK). Derive the total-profit function Πstraddle(ST)\Pi_{\text{straddle}}(S_T), state both breakeven points, and prove that the position's profit is a convex function of STS_T. (6)

(c) Using continuous compounding at risk-free rate rr, state and prove the put–call parity relation CP=S0KerTC - P = S_0 - K e^{-rT} using a no-arbitrage replication argument. Then, given the observed prices above with r=6%r = 6\% p.a. and T=0.25T = 0.25 years, compute the theoretical CPC - P implied by parity and determine whether an arbitrage exists. If so, state the exact riskless-profit trade. (10)


Question 2 — Intrinsic/Time Value, Moneyness & Option-Chain Coding (20 marks)

You are given a fragment of an option chain for expiry with spot S=20,050S = 20{,}050:

Strike Call LTP Call OI Put LTP Put OI
19900 320 45,000 95 60,000
20000 250 80,000 180 120,000
20100 190 110,000 260 70,000

(a) For each strike, classify the call and the put as ITM / ATM / OTM, and compute the intrinsic value and time value of each call and each put. Present as a table. (8)

(b) The Put–Call Ratio (PCR) by open interest is PCR=Put OICall OI\text{PCR} = \frac{\sum \text{Put OI}}{\sum \text{Call OI}}. Compute it for this fragment and interpret its sentiment meaning. (4)

(c) Write a function analyze_chain(spot, rows) (Python) that, given the spot and a list of rows (strike, call_ltp, call_oi, put_ltp, put_oi), returns for each strike a dict containing call/put moneyness, intrinsic and time values, and finally returns the overall PCR. Your code must handle negative time-value inputs by flagging an arbitrage-warning. (8)


Question 3 — American vs European, Assignment & Early-Exercise Proof (18 marks)

(a) Precisely distinguish European and American style exercise, and explain the mechanics of exercise (buyer's action) versus assignment (seller's obligation). (4)

(b) Prove the classic result: For a non-dividend-paying underlying, it is never optimal to exercise an American call early. Use the lower bound CS0KerTC \ge S_0 - K e^{-rT} and compare the payoff of exercising now versus selling the option. (8)

(c) Give a concrete numerical counterexample showing that early exercise of an American put CAN be optimal (deep ITM put), and explain the intuition in one line why puts differ from calls here. (6)

Answer keyMark scheme & solutions

Question 1

(a) Payoffs & breakevens (6)

Call buyer profit (premium C=250C=250): Πcall(ST)=max(STK,0)C={C,STKSTKC,ST>K\Pi_{\text{call}}(S_T) = \max(S_T - K, 0) - C = \begin{cases} -C, & S_T \le K \\ S_T - K - C, & S_T > K \end{cases} (1) payoff form, (1) premium subtracted.

Put buyer profit (premium P=180P=180): Πput(ST)=max(KST,0)P={KSTP,ST<KP,STK\Pi_{\text{put}}(S_T) = \max(K - S_T, 0) - P = \begin{cases} K - S_T - P, & S_T < K \\ -P, & S_T \ge K \end{cases} (1).

Breakevens (set profit =0=0 in the ITM region):

  • Call: STKC=0ST=20000+250=20,250S_T - K - C = 0 \Rightarrow S_T = 20000 + 250 = \mathbf{20{,}250}. (1)
  • Put: KSTP=0ST=20000180=19,820K - S_T - P = 0 \Rightarrow S_T = 20000 - 180 = \mathbf{19{,}820}. (2)

(b) Long straddle (6)

Total cost =C+P=250+180=430= C + P = 250 + 180 = 430. (1) Πstr(ST)=max(STK,0)+max(KST,0)430=STK430.\Pi_{\text{str}}(S_T) = \max(S_T-K,0) + \max(K-S_T,0) - 430 = |S_T - K| - 430. (2) Breakevens: ST20000=430ST=20,430|S_T - 20000| = 430 \Rightarrow S_T = 20{,}430 (upper) and ST=19,570S_T = 19{,}570 (lower). (2)

Convexity proof: Π=ST20000430\Pi = |S_T-20000| - 430. The absolute-value function is convex (composition of affine argument into |\cdot|; for any λ[0,1]\lambda\in[0,1], λx+(1λ)yλx+(1λ)y|\lambda x+(1-\lambda)y|\le \lambda|x|+(1-\lambda)|y| by triangle inequality). Subtracting a constant preserves convexity. Hence Π\Pi is convex. (1)

(c) Put–call parity — statement, proof, arbitrage check (10)

Statement: For European options same K,TK,T: CP=S0KerTC - P = S_0 - K e^{-rT}. (1)

Proof (replication / no-arbitrage): Form two portfolios:

  • A: long 1 call + cash KerTKe^{-rT} (invested at rr).
  • B: long 1 put + 1 unit of underlying.

At expiry TT:

  • A value =max(STK,0)+K=max(ST,K)= \max(S_T-K,0) + K = \max(S_T, K).
  • B value =max(KST,0)+ST=max(ST,K)= \max(K-S_T,0) + S_T = \max(S_T, K).

Both give identical terminal payoff max(ST,K)\max(S_T,K) in every state. (3) By the law of one price / no-arbitrage, their values today must be equal: C+KerT=P+S0    CP=S0KerT.C + K e^{-rT} = P + S_0 \;\Rightarrow\; C - P = S_0 - K e^{-rT}. \quad\blacksquare (2)

Numerical check: r=0.06r=0.06, T=0.25T=0.25, K=20000K=20000, S0=20000S_0=20000. KerT=20000e0.015=20000×0.9851119=19,702.24Ke^{-rT} = 20000 \, e^{-0.015} = 20000 \times 0.9851119 = 19{,}702.24. Parity RHS =S0KerT=2000019702.24=297.76= S_0 - Ke^{-rT} = 20000 - 19702.24 = \mathbf{297.76}. (2)

Observed CP=250180=70C - P = 250 - 180 = 70. Since 70297.7670 \ne 297.76, an arbitrage exists (call is cheap / put+stock rich relative to parity). (1)

Arbitrage trade: Since market CP=70<C-P=70 < fair 297.76297.76, buy the cheap side (the call side, portfolio A) and sell the rich side (portfolio B):

  • Buy call, invest KerT=19702.24Ke^{-rT}=19702.24 at rr; short the underlying, and write (sell) the put.
  • Net cash flow today =C+P+S0KerT=250+180+2000019702.24=+227.76= -C + P + S_0 - Ke^{-rT} = -250 + 180 + 20000 - 19702.24 = +227.76 received, with zero terminal net payoff (both legs max(ST,K)\to \max(S_T,K) cancel). Locked riskless profit 227.76\approx ₹227.76. (1)

Question 2

(a) Moneyness, intrinsic, time value (8)

Spot S=20,050S=20{,}050. Call intrinsic =max(SK,0)=\max(S-K,0); Put intrinsic =max(KS,0)=\max(K-S,0); Time value == LTP - intrinsic.

Strike Call class Call IV Call TV Put class Put IV Put TV
19900 ITM (S>KS>K) 150 320−150=170 OTM 0 95
20000 ITM 50 250−50=200 OTM 0 180
20100 OTM 0 190 ITM (K>SK>S) 50 260−50=210

Nearest-to-spot strike (20000, and 20100) are effectively near-ATM; strictly ATM = strike closest to spot (20000/20100). (0.5 per correct cell region — 8 total)

(b) PCR (4)

\sum Put OI =60000+120000+70000=250,000= 60000 + 120000 + 70000 = 250{,}000. (1) \sum Call OI =45000+80000+110000=235,000= 45000 + 80000 + 110000 = 235{,}000. (1) PCR=250000235000=1.0638.\text{PCR} = \frac{250000}{235000} = \mathbf{1.0638}. (1) Interpretation: PCR >1>1 (more put OI than call OI) — often read as bearish positioning / put-heavy hedging, or contrarian bullish at extremes. Here mildly put-skewed, near-neutral. (1)

(c) Code (8)

def analyze_chain(spot, rows):
    total_put_oi = 0
    total_call_oi = 0
    result = {}
    for strike, c_ltp, c_oi, p_ltp, p_oi in rows:
        c_iv = max(spot - strike, 0.0)
        p_iv = max(strike - spot, 0.0)
        c_tv = c_ltp - c_iv
        p_tv = p_ltp - p_iv
 
        def moneyness(intrinsic, at_spot):
            if abs(strike - spot) < 1e-9:  # exact ATM
                return "ATM"
            return "ITM" if intrinsic > 0 else "OTM"
 
        entry = {
            "call": {
                "moneyness": moneyness(c_iv, spot),
                "intrinsic": c_iv, "time_value": c_tv,
                "arb_warning": c_tv < 0,
            },
            "put": {
                "moneyness": moneyness(p_iv, spot),
                "intrinsic": p_iv, "time_value": p_tv,
                "arb_warning": p_tv < 0,
            },
        }
        result[strike] = entry
        total_call_oi += c_oi
        total_put_oi  += p_oi
 
    pcr = total_put_oi / total_call_oi if total_call_oi else float('inf')
    return {"per_strike": result, "PCR": round(pcr, 4)}

Marks: intrinsic logic (2), time value (1), moneyness classification (2), negative-TV arbitrage flag (2), PCR return (1).


Question 3

(a) European vs American; exercise vs assignment (4)

  • European: exercisable only at expiry TT. American: exercisable any time up to and including expiry. (2)
  • Exercise is the buyer's right/action: the long holder chooses to convert the option into the underlying position (call → buy at KK; put → sell at KK). Assignment is the seller's (writer's) obligation: when a buyer exercises, the clearinghouse assigns a short-position holder to fulfil the contract (deliver/receive underlying or cash-settle). (2)

(b) No early exercise of American call (non-dividend) (8)

Lower bound (no-arbitrage): CS0KerTC \ge S_0 - K e^{-rT}. (2) Payoff from exercising the call now =S0K= S_0 - K. (1) Since r>0r>0 and T>0T>0, KerT<KKe^{-rT} < K, hence CS0KerT>S0K=immediate-exercise value.C \ge S_0 - Ke^{-rT} > S_0 - K = \text{immediate-exercise value}. (3) Because an American call is worth at least its European counterpart, and the European value already exceeds the exercise value, the holder does strictly better by selling the option (capturing CC) than exercising (getting S0KS_0-K). Also exercising forfeits remaining time value and pays KK early (losing interest). Therefore early exercise is never optimal. \blacksquare (2)

(c) American put early-exercise counterexample (6)

Take K=100K=100, spot S0=5S_0 = 5 (deep ITM put), r=10%r=10\%, T=1T=1.

  • Exercise now: receive KS0=1005=95K - S_0 = 100 - 5 = \mathbf{95} immediately, which can be invested to earn interest. (2)
  • Max value from waiting is bounded by KS0K - S_0 but the discounted strike caps European put value near KerTS0=100e0.15=90.485=85.48<95Ke^{-rT} - S_0 = 100e^{-0.1} - 5 = 90.48 - 5 = 85.48 < 95. (2) So holding is worth less than the ₹95 obtainable now → early exercise optimal.
  • Intuition: For a put, exercising brings in cash KK early (earning interest), so time value of money favours early exercise deep ITM; for a call you would pay out KK, so delaying is better. Puts and calls differ by the sign of the strike cash flow. (2)
[
  {"claim":"Long call breakeven = 20250", "code":"K=20000; C=250; result = (K + C == 20250)"},
  {"claim":"Straddle upper/lower breakevens 20430 and 19570", "code":"K=20000; cost=430; result = (K+cost==20430) and (K-cost==19570)"},
  {"claim":"Put-call parity fair C-P = 297.76 with r=6%,T=0.25", "code":"import sympy as sp; val=20000-20000*sp.exp(sp.Rational(-6,100)*sp.Rational(1,4)); result = abs(float(val)-297.76) < 0.5"},
  {"claim":"Arbitrage exists: observed C-P=70 differs from fair 297.76", "code":"import sympy as sp; fair=20000-20000*sp.exp(sp.Rational(-6,100)*sp.Rational(1,4)); obs=250-180; result = abs(float(fair)-obs) > 1"},
  {"claim":"PCR = 1.0638", "code":"put=60000+120000+70000; call=45000+80000+110000; result = round(put/call,4)==1.0638"},
  {"claim":"American put early exercise optimal: 95 > European bound 85.48", "code":"import sympy as sp; euro_bound=100*sp.exp(sp.Rational(-1,10))-5; result = 95 > float(euro_bound)"}
]