A right, not an obligation
An option gives its holder the right, but not the obligation, to trade an asset at a fixed price (the strike) on or before a date (the expiry). A call is the right to buy, a put the right to sell. At expiry the holder only uses the right when it pays. A call struck at 100 with the stock at 110 lets you buy at 100 what is worth 110: a payoff of 10. With the stock at 90 you simply do nothing and the payoff is 0, never negative. That one-sidedness is what makes options valuable.
import numpy as np
spot = np.array([80, 90, 100, 110, 120.0]) # possible prices of the stock at expiry
strike = 100
call = np.maximum(spot - strike, 0) # np.maximum works element by element: no loop, no if
put = np.maximum(strike - spot, 0)
print(call.tolist()) # [0.0, 0.0, 0.0, 10.0, 20.0]
print(put.tolist()) # [20.0, 10.0, 0.0, 0.0, 0.0]Profit is payoff minus the premium
The option has a price today, the premium, so what you earn is the payoff minus what you paid. A call bought for 6 loses 6 whenever the stock ends below the strike and breaks even at strike + premium = 106. Combining options builds other shapes. A long straddle (call plus put at the same strike) profits from a big move in either direction and loses both premiums if the stock stays put. A bull call spread (long a call at 100, short a call at 110) costs less but caps the gain at the strike difference: you give up the upside above 110 to reduce the cost.
call_pnl = call - 6 # bought for a premium of 6
print(call_pnl.tolist()) # [-6.0, -6.0, -6.0, 4.0, 14.0] break-even at 106
straddle = call + put - (4.0 + 3.5) # a call (4.0) and a put (3.5) at the same strike
print(straddle.tolist()) # [12.5, 2.5, -7.5, 2.5, 12.5] wins on a move up or down
spread = np.maximum(spot - 100, 0) - np.maximum(spot - 110, 0) - (6.0 - 2.0) # long the 100 call, short the 110 call
print(spread.tolist()) # [-4.0, -4.0, -4.0, 6.0, 6.0] loss and gain are both cappedshort_call = 6 - call # the seller of the call keeps the premium and pays the payoff
print(short_call.tolist()) # [6.0, 6.0, 6.0, -4.0, -14.0] the exact mirror of the buyer's loss and gainprint(float(np.maximum(112 - 100, 0))) # 12.0 a single price works as well as an array- Call payoff
max(S - K, 0), put payoffmax(K - S, 0):np.maximum(..., 0)does it on a whole array. - Profit = payoff - premium; a straddle (call + put) bets on a large move, a bull call spread caps both cost and gain.
- Payoffs are values at expiry; the price today is higher by the time value, which the next topics price.
Next up: put–call parity, the exact link between the price of a call and the price of a put.
Lab · what's graded
- Pay out the right to buy with
call_payoff25 pts - Pay out the right to sell with
put_payoff25 pts - Bet on a big move either way with
long_straddle_pnl25 pts - Cap the cost and the gain with
bull_call_spread_pnl25 pts