2 Options Markets{#sec-c:options}
Options are among the most actively traded financial instruments in the world, with billions of contracts changing hands annually across global exchanges. These versatile contracts provide investors with tools for speculation, hedging, and income generation that are impossible to replicate with stocks and bonds alone.
This chapter provides an introduction to the mechanics and motives for trading options. Recall from Chapter 1 that a call option is the right to buy an underlying asset at a fixed price called the strike or strike price. Symmetrically, a put option is the right to sell an underlying asset at the strike price. The underlying asset can be a stock, index, exchange-traded fund (ETF), commodity, or other financial instrument. The buyer of an option pays the seller upfront for the right to exercise the option later, at the buyer’s discretion.
2.1 Option Basics
Options have a finite lifetime, with each contract specifying an expiration date. Most exchange-traded options can be exercised at any time prior to expiration (American options), while others can only be exercised at the expiration date (European options). Despite their names, both types trade on exchanges worldwide.
- Premium: The price paid to buy an option (like an insurance premium)
- Strike Price: The fixed price at which the option can be exercised
- Expiration Date: When the option contract ends
- Exercise: Using the right granted by the option
- Underlying Asset: The financial instrument (stock, index, etc.) that the option is based on
- Contract Size: Most equity options represent 100 shares of the underlying stock
Rights, Obligations, and Motivations
An option buyer pays the premium upfront. Subsequently, the buyer has rights (they can choose whether to exercise the option) but they have no obligations. The maximum loss of an option buyer is the option premium. On the other hand, option sellers receive the premium upfront but subsequently they have obligations: they must fulfill the contract if the option is exercised. They face potentially unlimited losses (especially for calls). The motivation for buying an option can be to speculate on the underlying asset price or it can be to hedge an existing risk. The motivation for selling an option is always to receive the option premium.
In more detail, the motivations for trading options are:
- Speculation and Leverage: One motive for buying options is to speculate on price movements with higher leverage than direct stock ownership. A small price change in the underlying can produce large percentage changes in option value, amplifying both potential gains and losses.
- Hedging and Insurance: Options serve as insurance contracts for existing positions. For example, owning a protective put on your stock holdings limits downside risk, much like buying car insurance protects against accident costs. The option premium represents the insurance cost for this protection.
- Income Generation: Option sellers collect premiums upfront, similar to insurance companies collecting policy premiums. However, this income comes with obligations and potential risks if the market moves against the seller’s position.
2.2 Trading Options on Exchanges
Options are actively traded on organized exchanges and also arranged as private contracts (called over-the-counter or OTC). Exchange-traded options offer standardized contracts with transparent pricing, while OTC options can be customized but involve counterparty risk.
Most option positions on exchanges are closed before expiration through offsetting trades rather than exercise. This allows traders to capture profits, limit losses, or adjust strategies as market conditions change.
Strikes and Maturities
Exchanges determine which strike prices and expiration dates are available for trading. As time passes and options expire, new expiration cycles are introduced. New strike prices are also added when the underlying price moves, ensuring strikes bracket the current market price. The number of available strikes and expirations depends on trading interest and exchange policies.
Order Types and Execution
As in stock markets, traders can submit either market orders or limit orders. Market orders execute immediately “at market,” which is explained below. Limit orders are price-contingent orders. A limit buy order specifies a maximum price the trader is willing to pay, and a limit sell order specifies a minimum price the trader is willing to accept. A limit order can execute immediately if someone else is willing to take the other side. Otherwise, it joins the queue of limit orders and will eventually execute against an incoming market order when and if the limit price becomes the best available price for the counterparty (the highest price among limit buy orders or the lowest price among limit sell orders) and when it achieves time priority among other limit orders at the same price (i.e., it was the first to arrive).
For an option sell order, trading “at market” means trading at the highest limit buy price in the market. This is the best price, from the seller’s point of view, that other traders are bidding for the option, and it is called the bid price. For an option buy order, trading at market means trading at the lowest limit sell price in the market. This is the best price that other traders are asking for the option, and it is called the ask price. In summary,
- Market Orders execute immediately at the best available price:
- Market buy order → executes at the ask price
- Market sell order → executes at the bid price
- Limit Orders specify a maximum buy price or minimum sell price:
- May get better execution price but risks non-execution
- Example: If you want to buy a call option trading at bid $2.50 / ask $2.60:
- Market order: Pay $2.60 immediately
- Limit order at $2.55: Wait for seller willing to accept $2.55 (may never happen)
- Limit order at $2.40: Less likely to execute than a limit order at $2.55
- Market order: Pay $2.60 immediately
Open Interest and Contract Creation
Unlike stocks, options have no pre-existing supply. At any time, the number of long positions exactly equals the number of short positions, and this total is called open interest. When a new option series (specific strike/expiration combination) is introduced, open interest starts at zero. Options are created through trading activity:
- First trade: 1 buyer + 1 seller → Open interest = 1
- New position created: New buyer + New seller → Open interest increases
- Position closed: Existing holder sells to new buyer → Open interest unchanged
- Both parties close: Existing buyer and seller offset → Open interest decreases
The Role of the Clearinghouse
Exchange clearinghouses serve as the counterparty to every options trade, providing several crucial functions:
- Counterparty Guarantee:
- Long call holders have the right to buy from the clearinghouse (not from the original seller)
- Short call writers have an obligation to deliver to the clearinghouse (if assigned)
- Likewise, long put holders have the right to sell to the clearinghouse (not from the original seller) and short put writers have an obligation to buy from the clearinghouse (if assigned)
- This eliminates counterparty risk for traders
- Exercise and Assignment Process:
- Option holder notifies broker of exercise decision
- Broker notifies clearinghouse
- Clearinghouse randomly selects a short position for assignment
- Underlying shares and strike payment flow through clearinghouse
- Margin:
- Option sellers must post collateral (margin) to ensure they can meet their obligations.
- This protects the clearinghouse from default risk.
- Benefits of the Clearinghouse System:
- Reduced counterparty default risk for all market participants
- Ability to close positions by making trades with different traders than your original counterparty
2.3 Patterns in Option Prices
Figure 2.1 allows us to browse current market data for exchange-traded options. The columns of the table are:
- Strike: the price at which the owner of a call (put) has the right to buy (sell) the underlying asset.
- Bid price: the price that a market sell order will pay (it is the best price that limit orders are bidding for the option)
- Ask price: the price that a price buy order will pay (it is the best price that limit orders are asking for the option)
- Last price: the last price at which the option traded.
- Time of last trade: the day and time at which the option last traded.
- Volume: the number of contracts traded during the day. Each contract is for 100 shares of the underlying asset.
- Open interest: The number of contracts for which there are currently outstanding positions.
Experimenting with Figure 2.1 reveals consistent patterns in how options are priced relative to each other. Understanding these patterns helps build intuition about option values. We should see the following:
- Strike Price Effects:
- Call Options: Prices decrease as strike prices increase. For example, a call with strike $50 is worth more than a call with strike $100, so it trades at a higher premium.
- Put Options: Prices increase as strike prices increase. For example, a put with strike $100 is worth more than a put with strike $50, so it trades at a higher premium.
- Time to Expiration Effects: Longer-dated options cost more because they provide:
- More time for favorable price movements
- Greater flexibility (American options can be exercised over a longer period)
2.4 Intrinsic Value, Time Value, and Moneyness
The intrinsic value of an option is what the option would be worth if it had to be exercised immediately or would expire. For a call option, this is the difference between the underlying asset price and the strike of the call, if that is positive, and is zero otherwise. Letting \(S\) denote the price of the underlying asset and \(K\) the strike price, the intrinsic value of a call is \[\begin{cases} S-K & \text{if $S>K$}\\ 0 & \text{if $S \le K$}\end{cases}\,.\] This can be written more compactly as \(\max(S-K, 0)\). For example, if the underlying asset is trading at $50, and the strike is $40, then the intrinsic value is $10. This reflects the fact that we could pay $10 for the option, pay the strike of $40 to exercise, then sell the underlying asset in the market for $50 and break even. Symmetrically, the intrinsic value of a put option is \[\max(K-S, 0) = \begin{cases}K-S & \text{if $K>S$}\\ 0 & text{if $K \le S$}\end{cases}\,.\]
If the intrinsic value of an option is positive, then the option is said to be in the money. Thus, a call option with strike \(K\) is in the money if \(S>K\), and a put option with strike \(K\) is in the money if \(S<K\). If \(S=K\) (or, in practice, approximately equal), then a call is said to be at the money. If an option is neither in the money nor out of the money, then it is out of the money.
American options are always worth at least their intrinsic values, because exercising immediately is a possibility. If one could buy an in-the-money American option at less than its intrinsic value, then buying it and immediately exercising would be an arbitrage opportunity. It is safe to assume we will not find such arbitrage opportunities in the market.
Prior to expiration, the value of an option is usually larger than its intrinsic value. This is because there is time remaining for the underlying asset to move in a direction that is favorable for the option holder. The excess of the value over the intrinsic value is called the option’s time value. As time passes and the option approaches expiration, the time value decreases. This phenomenon is called time decay.
2.5 Payoff Diagrams
Understanding option payoffs is fundamental to options trading. A payoff diagram shows the intrinsic value of an option position as a function of the price of the underlying asset. This is the value the option position would have at expiration. A profit diagram shows the profit from putting on an option position and holding to maturity as a function of the price of the underlying asset at maturity. The difference between the profit and the payoff is the premium paid (for long positions) or received (for short positions). Here are the payoff and profit diagrams for each of the four basic option positions:
Long Call
Code
import numpy as np
import plotly.graph_objects as go
import plotly.express as px
# Parameters
= 100 # Strike price
K = 5 # Option premium
premium = np.concatenate([np.linspace(0, K, 50), np.linspace(K, 140, 50)])[:-1] # Include 0 and strike price
S
# Long call payoff and profit
= np.maximum(S - K, 0)
call_payoff = call_payoff - premium
call_profit
= go.Figure()
fig
# Add payoff line
fig.add_trace(go.Scatter(=S, y=call_payoff,
x='lines',
mode='Payoff at Expiration',
name=dict(color='blue', width=2)
line
))
# Add profit line
fig.add_trace(go.Scatter(=S, y=call_profit,
x='lines',
mode='Profit/Loss',
name=dict(color='red', width=2, dash='dash')
line
))
# Add strike price line
=K, line_dash="dot", line_color="gray",
fig.add_vline(x=f"Strike = ${K}")
annotation_text
# Add vertical line at x=0 (y-axis)
# fig.add_vline(x=0, line_dash="solid", line_color="black", line_width=1)
# Formatting
fig.update_layout(="Stock Price at Expiration ($)",
xaxis_title="Payoff or Profit ($)",
yaxis_title="plotly_white",
template=True,
autosize=400,
height=dict(x=0.02, y=0.98, xanchor='left', yanchor='top'),
legend=False,
yaxis_zeroline=True,
xaxis_zeroline='black'
xaxis_zerolinecolor
)
fig.show()#| out-width: "100%"
Long Put
Code
# Long put payoff and profit
= np.maximum(K - S, 0)
put_payoff = put_payoff - premium
put_profit
= go.Figure()
fig
# Add payoff line
fig.add_trace(go.Scatter(=S, y=put_payoff,
x='lines',
mode='Payoff at Expiration',
name=dict(color='blue', width=2)
line
))
# Add profit line
fig.add_trace(go.Scatter(=S, y=put_profit,
x='lines',
mode='Profit/Loss',
name=dict(color='red', width=2, dash='dash')
line
))
# Add strike price line
=K, line_dash="dot", line_color="gray",
fig.add_vline(x=f"Strike = ${K}")
annotation_text
fig.update_layout(="Stock Price at Expiration ($)",
xaxis_title="Payoff or Profit ($)",
yaxis_title="plotly_white",
template=True,
autosize=400,
height=dict(x=0.2, y=0.98, xanchor='left', yanchor='top'),
legend=False,
yaxis_zeroline=True,
xaxis_zeroline='black'
xaxis_zerolinecolor
)
fig.show()#| out-width: "100%"
Short Call
Code
# Short call payoff and profit (opposite of long call)
= -call_payoff
short_call_payoff = premium - call_payoff
short_call_profit
= go.Figure()
fig
# Add payoff line
fig.add_trace(go.Scatter(=S, y=short_call_payoff,
x='lines',
mode='Payoff at Expiration',
name=dict(color='blue', width=2)
line
))
# Add profit line
fig.add_trace(go.Scatter(=S, y=short_call_profit,
x='lines',
mode='Profit/Loss',
name=dict(color='red', width=2, dash='dash')
line
))
# Add strike price line
=K, line_dash="dot", line_color="gray",
fig.add_vline(x=f"Strike = ${K}")
annotation_text
fig.update_layout(="Stock Price at Expiration ($)",
xaxis_title="Payoff or Profit ($)",
yaxis_title="plotly_white",
template=True,
autosize=400,
height=dict(x=0.02, y=0.8, xanchor='left', yanchor='top'),
legend=False,
yaxis_zeroline=True,
xaxis_zeroline='black'
xaxis_zerolinecolor
)
fig.show()#| out-width: "100%"
Short Put
Code
# Short put payoff and profit (opposite of long put)
= -put_payoff
short_put_payoff = premium - put_payoff
short_put_profit
= go.Figure()
fig
# Add payoff line
fig.add_trace(go.Scatter(=S, y=short_put_payoff,
x='lines',
mode='Payoff at Expiration',
name=dict(color='blue', width=2)
line
))
# Add profit line
fig.add_trace(go.Scatter(=S, y=short_put_profit,
x='lines',
mode='Profit/Loss',
name=dict(color='red', width=2, dash='dash')
line
))
# Add strike price line
=K, line_dash="dot", line_color="gray",
fig.add_vline(x=f"Strike = ${K}")
annotation_text
fig.update_layout(="Stock Price at Expiration ($)",
xaxis_title="Payoff orProfit ($)",
yaxis_title="plotly_white",
template=True,
autosize=400,
height=dict(x=0.02, y=0.98, xanchor='left', yanchor='top'),
legend=False,
yaxis_zeroline=True,
xaxis_zeroline='black'
xaxis_zerolinecolor
)
fig.show()#| out-width: "100%"
Summary of Basic Option Positions
The four basic option positions can be summarized as follows:
Position | Market View | Max Profit | Max Loss | Breakeven |
---|---|---|---|---|
Long Call | Bullish | Unlimited | Premium paid | Strike + Premium |
Long Put | Bearish | Strike - Premium | Premium paid | Strike - Premium |
Short Call | Bearish/Neutral | Premium received | Unlimited | Strike + Premium |
Short Put | Bullish/Neutral | Premium received | Strike - Premium | Strike - Premium |
These basic positions form the building blocks for more complex option strategies such as spreads, straddles, and collars.
2.6 Option Portfolios
Individual options can be combined with each other and with the underlying asset to create portfolios with specific risk-reward profiles. These strategies allow investors to implement sophisticated views about market direction, volatility, and risk management. We examine several common option portfolios below. We present the payoff diagram for each.
The payoff of a portfolio is the sum of the payoffs of its constituent positions. Frequently, an easy way to compute the payoff diagram of a portfolio is to add the payoffs at a single point on the \(x\)-axis (the origin is often a good place to start) and then add the slopes of the individual positions. For example, if the sum of the slopes is \(+1\), then the portfolio payoff diagram will slope upwards, one-for-one with the underlying asset price. If the sum of the slopes is zero, then the portfolio payoff will be flat; if the sum of the slopes is \(-1\), then the portfolio payoff diagram will slope downwards, one-for-one with the underlying asset price. In each figure, we show the payoffs of the individual positions and the combined portfolio payoff.
Protective Put
A protective put combines a long position in the underlying asset with a long put option. This strategy provides downside protection while maintaining upside potential.
Code
# Parameters for all strategies
= 100 # Current stock price
S0 = 95 # Put strike
K_put = 105 # Call strike (for other strategies)
K_call = 3
put_premium = 2
call_premium
= np.arange(161)
S # Protective put: Long stock + Long put
= S # Stock value at maturity
stock_payoff = np.maximum(K_put - S, 0) # Put payoff at maturity
put_payoff = stock_payoff + put_payoff
protective_put_payoff
= go.Figure()
fig
# Individual components
=S, y=stock_payoff, mode='lines',
fig.add_trace(go.Scatter(x='Long Stock', line=dict(color='blue', dash='dot')))
name=S, y=put_payoff, mode='lines',
fig.add_trace(go.Scatter(x='Long Put', line=dict(color='green', dash='dot')))
name
# Combined strategy
=S, y=protective_put_payoff, mode='lines',
fig.add_trace(go.Scatter(x='Protective Put', line=dict(color='red', width=3)))
name
=K_put, line_dash="dot", line_color="gray",
fig.add_vline(x=f"Put Strike = ${K_put}")
annotation_text
# Add vertical line at x=0 (y-axis)
=0, line_dash="solid", line_color="black", line_width=1)
fig.add_vline(x
fig.update_layout(="Protective Put Strategy",
title="Stock Price at Expiration ($)",
xaxis_title="Portfolio Value ($)",
yaxis_title="plotly_white",
template=400,
height=True,
autosize=dict(x=0.02, y=0.98, xanchor='left', yanchor='top'),
legend=False,
yaxis_zeroline=True,
xaxis_zeroline='black'
xaxis_zerolinecolor
)
fig.show()#| out-width: "100%"
Selling Covered Calls
A common option strategy is to sell an out-of-the-money call option on a stock that one owns. This generates premium income, at the expense of reducing the maximum gain on the stock (it is capped at the call strike). Whether this turns out to be profitable depends on how high the underlying goes prior to the option maturity - if it goes up sufficiently far, then the trader will regret having sold the call; if it goes up less, or doesn’t go up at all, then the trader will be happy to have captured the call premium. The following is the payoff diagram of a portfolio consisting of a long position in the underlying asset and a short call.
Code
# Collar: Long stock + Long put + Short call
= -np.maximum(S - K_call, 0) # Short call payoff at maturity
call_payoff = stock_payoff + call_payoff
collar_payoff
= go.Figure()
fig
# Individual components
=S, y=stock_payoff, mode='lines',
fig.add_trace(go.Scatter(x='Long Stock', line=dict(color='blue', dash='dot')))
name=S, y=call_payoff, mode='lines',
fig.add_trace(go.Scatter(x='Short Call', line=dict(color='orange', dash='dot')))
name
# Combined strategy
=S, y=collar_payoff, mode='lines',
fig.add_trace(go.Scatter(x='Collar', line=dict(color='red', width=3)))
name
=K_call, line_dash="dot", line_color="gray",
fig.add_vline(x=f"Call Strike = ${K_call}")
annotation_text
fig.update_layout(="Covered Call Strategy",
title="Stock Price at Expiration ($)",
xaxis_title="Portfolio Value ($)",
yaxis_title="plotly_white",
template=400,
height=True,
autosize=dict(x=0.02, y=0.98, xanchor='left', yanchor='top'),
legend=False,
yaxis_zeroline=True,
xaxis_zeroline='black'
xaxis_zerolinecolor
)
fig.show()
Collar
A collar combines a protective put with selling a covered call. This strategy provides downside protection and pays for some or all of the protection by capping the upside potential. If the premium received from the call that is sold equals (or, in practice, is approximately equal to) the premium paid for the put, then the collar is called a zero-cost collar.
Code
# Collar: Long stock + Long put + Short call
= -np.maximum(S - K_call, 0) # Short call payoff at maturity
call_payoff = stock_payoff + put_payoff + call_payoff
collar_payoff
= go.Figure()
fig
# Individual components
=S, y=stock_payoff, mode='lines',
fig.add_trace(go.Scatter(x='Long Stock', line=dict(color='blue', dash='dot')))
name=S, y=put_payoff, mode='lines',
fig.add_trace(go.Scatter(x='Long Put', line=dict(color='green', dash='dot')))
name=S, y=call_payoff, mode='lines',
fig.add_trace(go.Scatter(x='Short Call', line=dict(color='orange', dash='dot')))
name
# Combined strategy
=S, y=collar_payoff, mode='lines',
fig.add_trace(go.Scatter(x='Collar', line=dict(color='red', width=3)))
name
=K_put, line_dash="dot", line_color="gray",
fig.add_vline(x=f"Put Strike = ${K_put}",
annotation_text="top left")
annotation_position=K_call, line_dash="dot", line_color="gray",
fig.add_vline(x=f"Call Strike = ${K_call}")
annotation_text
fig.update_layout(="Collar Strategy",
title="Stock Price at Expiration ($)",
xaxis_title="Portfolio Value ($)",
yaxis_title="plotly_white",
template=400,
height=True,
autosize=dict(x=0.02, y=0.98, xanchor='left', yanchor='top'),
legend=False,
yaxis_zeroline=True,
xaxis_zeroline='black',
xaxis_zerolinecolor=[-50, 200]
yaxis_range
)
fig.show()#| out-width: "100%"
Bull Call Spread
A profit diagram is derived from a payoff diagram by subtracting the premium paid for each long position and adding the premium received for each short position. There is a simple rule for determining from the payoff diagram whether the net premium is positive or negative. If the payoff diagram lies entirely at or above the \(x\)-axis, then a net premium must be paid to put on the position. Otherwise there would be an arbitrage opportunity. Thus, the profit diagram lies below the payoff diagram (and goes below the \(x\) axis into negative territory somewhere) if the payoff is always greater than or equal to zero. Symmetrically, the profit diagram lies above the payoff diagram (and goes above the \(x\)-axis into positive territory) if the payoff is always less than or equal to zero.
A bull call spread involves buying a call option and selling another call option with a higher strike price. This strategy profits from moderate upward price movements. Because the payoff diagram lies above the \(x\)-axis, we know that a net premium is paid to put on the position. In fact, the call with a higher strike that is sold will be cheaper than the call with a lower strike that is bought, and the investor will have to pay the difference to put on the position. Remember that the purpose of selling options is always to receive the premium income. In this case, the call with the higher strike is sold to partially offset the cost of the call with the lower strike. Consequently, a bull call spread is a relatively low cost bet on the upside of an asset.
Code
# Bull call spread parameters
= 95 # Lower strike (long call)
K_low = 105 # Higher strike (short call)
K_high = 7
low_call_premium = 3
high_call_premium
# Bull call spread: Long low-strike call + Short high-strike call
= np.maximum(S - K_low, 0) # Long call payoff at maturity
long_call_payoff = -np.maximum(S - K_high, 0) # Short call payoff at maturity
short_call_payoff = long_call_payoff + short_call_payoff
bull_spread_payoff
= go.Figure()
fig
# Individual components
=S, y=long_call_payoff, mode='lines',
fig.add_trace(go.Scatter(x=f'Long {K_low} Call', line=dict(color='blue', dash='dot')))
name=S, y=short_call_payoff, mode='lines',
fig.add_trace(go.Scatter(x=f'Short {K_high} Call', line=dict(color='green', dash='dot')))
name
# Combined strategy
=S, y=bull_spread_payoff, mode='lines',
fig.add_trace(go.Scatter(x='Bull Call Spread', line=dict(color='red', width=3)))
name
=K_low, line_dash="dot", line_color="gray",
fig.add_vline(x=f"Low Strike = ${K_low}",
annotation_text="top left")
annotation_position=K_high, line_dash="dot", line_color="gray",
fig.add_vline(x=f"High Strike = ${K_high}")
annotation_text
fig.update_layout(="Bull Call Spread",
title="Stock Price at Expiration ($)",
xaxis_title="Portfolio Value ($)",
yaxis_title="plotly_white",
template=400,
height=True,
autosize=dict(x=0.02, y=0.98, xanchor='left', yanchor='top'),
legend=False,
yaxis_zeroline=True,
xaxis_zeroline='black'
xaxis_zerolinecolor
)
fig.show()#| out-width: "100%"
Bear Put Spread
A bear put spread involves buying a put option and selling another put option with a lower strike price. This strategy profits from moderate downward price movement. The motivation for putting on a bear spread is the desire to own a put either for protection (i.e., hedging/insurance) or as a bet on the downside of an asset. This protection or bet is provided by the put with the higher strike. The put with the lower strike is sold to reduce the cost of the bet. As with a bull call spread, the payoff is always nonnegative, so there must be a net premium paid to put it on (the put that is sold will have a lower price than the put that is bought, so the trader must pay the difference).
Code
# Bear put spread: Long high-strike put + Short low-strike put
= 8
high_put_premium = 4
low_put_premium
= np.maximum(K_high - S, 0) # Long put payoff at maturity
long_put_payoff = -np.maximum(K_low - S, 0) # Short put payoff at maturity
short_put_payoff = long_put_payoff + short_put_payoff
bear_spread_payoff
= go.Figure()
fig
# Individual components
=S, y=long_put_payoff, mode='lines',
fig.add_trace(go.Scatter(x=f'Long {K_high} Put', line=dict(color='blue', dash='dot')))
name=S, y=short_put_payoff, mode='lines',
fig.add_trace(go.Scatter(x=f'Short {K_low} Put', line=dict(color='green', dash='dot')))
name
# Combined strategy
=S, y=bear_spread_payoff, mode='lines',
fig.add_trace(go.Scatter(x='Bear Put Spread', line=dict(color='red', width=3)))
name
=K_low, line_dash="dot", line_color="gray",
fig.add_vline(x=f"Low Strike = ${K_low}",
annotation_text="top left")
annotation_position=K_high, line_dash="dot", line_color="gray",
fig.add_vline(x=f"High Strike = ${K_high}")
annotation_text
fig.update_layout(="Bear Put Spread",
title="Stock Price at Expiration ($)",
xaxis_title="Portfolio Value ($)",
yaxis_title="plotly_white",
template=400,
height=True,
autosize=dict(x=0.02, y=0.77, xanchor='left', yanchor='top'),
legend=False,
yaxis_zeroline=True,
xaxis_zeroline='black'
xaxis_zerolinecolor
)
fig.show()#| out-width: "100%"
Straddle
A straddle involves buying both a call and a put option with the same strike price. This strategy profits from large price movements in either direction (high volatility). The profit diagram lies below the payoff diagram and will be in negative territory if the underlying finishes near the straddle strike.
Code
# Straddle: Long call + Long put (same strike)
= 100
K_straddle = 5
straddle_call_premium = 5
straddle_put_premium
= np.maximum(S - K_straddle, 0) # Call payoff at maturity
straddle_call_payoff = np.maximum(K_straddle - S, 0) # Put payoff at maturity
straddle_put_payoff = straddle_call_payoff + straddle_put_payoff
straddle_payoff
= go.Figure()
fig
# Individual components
=S, y=straddle_call_payoff, mode='lines',
fig.add_trace(go.Scatter(x=f'Long {K_straddle} Call', line=dict(color='blue', dash='dot')))
name=S, y=straddle_put_payoff, mode='lines',
fig.add_trace(go.Scatter(x=f'Long {K_straddle} Put', line=dict(color='green', dash='dot')))
name
# Combined strategy
=S, y=straddle_payoff, mode='lines',
fig.add_trace(go.Scatter(x='Long Straddle', line=dict(color='red', width=3)))
name
=K_straddle, line_dash="dot", line_color="gray",
fig.add_vline(x=f"Strike = ${K_straddle}")
annotation_text
fig.update_layout(="Long Straddle",
title="Stock Price at Expiration ($)",
xaxis_title="Portfolio Value ($)",
yaxis_title="plotly_white",
template=400,
height=True,
autosize=dict(x=0.02, y=0.6, xanchor='left', yanchor='top'),
legend=False,
yaxis_zeroline=True,
xaxis_zeroline='black',
xaxis_zerolinecolor
)
fig.show()#| out-width: "100%"
Butterfly Spread
A butterfly spread involves buying options at two different strike prices and selling two options at a middle strike price. This strategy profits when the stock price stays near the middle strike (low volatility). As with the other spreads we have examined, the payoff is nonnegative, so the trader must pay a net premium to put the position on.
Code
# Butterfly spread parameters
= 90
K_low_bf = 100
K_mid_bf = 110
K_high_bf = 12
low_call_bf_premium = 6
mid_call_bf_premium = 2
high_call_bf_premium
# Butterfly: Long low call + Short 2 middle calls + Long high call
= np.maximum(S - K_low_bf, 0) # Long low call payoff at maturity
bf_low_call = -2 * np.maximum(S - K_mid_bf, 0) # Short 2 middle calls payoff at maturity
bf_mid_call = np.maximum(S - K_high_bf, 0) # Long high call payoff at maturity
bf_high_call = bf_low_call + bf_mid_call + bf_high_call
butterfly_payoff
= go.Figure()
fig
# Individual components
=S, y=bf_low_call, mode='lines',
fig.add_trace(go.Scatter(x=f'Long {K_low_bf} Call', line=dict(color='blue', dash='dot')))
name=S, y=bf_mid_call, mode='lines',
fig.add_trace(go.Scatter(x=f'Short 2x {K_mid_bf} Calls', line=dict(color='green', dash='dot')))
name=S, y=bf_high_call, mode='lines',
fig.add_trace(go.Scatter(x=f'Long {K_high_bf} Call', line=dict(color='orange', dash='dot')))
name
# Combined strategy
=S, y=butterfly_payoff, mode='lines',
fig.add_trace(go.Scatter(x='Butterfly Spread', line=dict(color='red', width=3)))
name
=K_low_bf, line_dash="dot", line_color="gray",
fig.add_vline(x=f"Low = ${K_low_bf}",
annotation_text="top left")
annotation_position=K_mid_bf, line_dash="dot", line_color="gray",
fig.add_vline(x=f"Mid = ${K_mid_bf}",
annotation_text="left")
annotation_position=K_high_bf, line_dash="dot", line_color="gray",
fig.add_vline(x=f"High = ${K_high_bf}",
annotation_text="bottom right")
annotation_position
fig.update_layout(="Butterfly Spread",
title="Stock Price at Expiration ($)",
xaxis_title="Portfolio Value ($)",
yaxis_title="plotly_white",
template=400,
height=True,
autosize=dict(x=0.02, y=0.98, xanchor='left', yanchor='top'),
legend=False,
yaxis_zeroline=True,
xaxis_zeroline='black'
xaxis_zerolinecolor
)
fig.show()#| out-width: "100%"
Interactive Portfolio Builder
The strategies shown above represent just a few of the many possible option combinations. The interactive figure below allows you to experiment with option portfolios. The value at maturity of a portfolio of options is plotted, assuming all of the options have the same maturity. Enter positive quantities for long positions in options and negative quantities for short positions. Long or short positions in the underlying asset can also be included. Cash means a position in a risk-free asset sufficient to deliver the specified amount of cash at the option maturity.
Try recreating the strategies we’ve discussed above, or experiment with your own combinations to develop intuition about how option portfolios behave.
2.7 Volume and Open Interest Patterns
Understanding trading volume and open interest patterns provides insight into market behavior and liquidity in options markets. These patterns reflect how traders use options and where market activity concentrates.
The Life Cycle of Open Interest
When an exchange first introduces a new option series (a specific combination of underlying asset, strike price, and expiration date), open interest starts at zero. Open interest represents the total number of outstanding option contracts that have not been closed or exercised.
Initial Growth Phase: As traders begin to notice and trade the new option, open interest grows. Each time a new buyer purchases an option from a new seller (rather than from someone closing an existing position), open interest increases by one contract. For example:
- Day 1: Trader A buys 10 call contracts from Trader B → Open interest = 10
- Day 2: Trader C buys 5 call contracts from Trader D → Open interest = 15
- Day 3: Trader E buys 3 call contracts from Trader A (closing A’s position) → Open interest = 15 (unchanged)
Peak Activity: Open interest typically reaches its peak when the option has several weeks or months remaining until expiration and the strike price is reasonably close to the current stock price. During this phase, the option attracts both speculators and hedgers.
Decline Phase: As expiration approaches, open interest generally declines for several reasons:
- Traders close positions by making offsetting trades rather than holding to expiration
- Some positions are exercised early (for American options)
- Risk managers prefer not to hold options too close to expiration due to increased time decay and volatility
Final Settlement: At expiration, remaining open interest is settled through automatic exercise (for in-the-money options) or expires worthless (for out-of-the-money options).
Why Out-of-the-Money Options Are Popular
Examining Figure 2.1 reveals that trading activity and open interest are often concentrated in out-of-the-money options rather than in-the-money ones. Several factors explain this pattern:
1. Leverage and Cost Efficiency Out-of-the-money options cost significantly less than in-the-money or at-the-money options. This lower cost provides higher leverage, allowing traders to control more shares with the same dollar investment. A trader with $1,000 might be able to buy:
- 2 in-the-money calls at $500 each, or
- 20 out-of-the-money calls at $50 each
2. Speculative Appeal Out-of-the-money options offer the potential for large percentage returns if the underlying stock moves favorably. While the probability of profit may be lower, the potential rewards are proportionally higher, attracting speculative traders.
3. Hedging Applications Portfolio managers often use out-of-the-money puts as portfolio insurance. These tail risk hedges provide protection against large market declines while minimizing the cost of insurance premiums.
4. Time Value Focus Out-of-the-money options consist entirely of time value (no intrinsic value). Traders who want to bet on volatility or time decay often prefer these options because their value is most sensitive to these factors.
Observable Patterns in Market Data
When examining options market data, several consistent patterns emerge:
Strike Price Distribution:
- Volume and open interest concentrate in strikes within roughly 10-20% of the current stock price
- Call activity tends to be higher in strikes above the current price
- Put activity tends to be higher in strikes below the current price
Maturity Effects:
- Near-term expirations (1-8 weeks) typically show the highest volume due to active trading
- Longer-term options (3+ months) may show high open interest but lower daily volume
- Options expiring in less than a week often see volume spikes as traders close positions
Time Decay Impact:
- Options with strikes far from the current price show less frequent trading
- Last trade dates for these deep out-of-the-money options may be days or weeks old
- Bid-ask spreads widen significantly for strikes with little trading interest
These patterns reflect the diverse motivations of options traders: speculation, hedging, income generation, and portfolio management. Understanding these patterns helps explain why certain options trade actively while others remain dormant, and why pricing and liquidity can vary dramatically across different strikes and expirations.
2.8 Put-Call Parity
Put-call parity is one of the most important relationships in options pricing. It establishes a precise connection between the prices of European calls, puts, the underlying asset, and risk-free bonds. This relationship must hold to prevent arbitrage opportunities - riskless profit possibilities that would be quickly eliminated by trader activity.
The Put-Call Parity Relationship
For European options on stocks that do not pay dividends prior to option expiry, put-call parity states that:
\[\text{Cash} + \text{Call} = \text{Put} + \text{Underlying}\]
More precisely, denote:
- \(C\) = price of a European call option
- \(P\) = price of a European put option
- \(S\) = current price of the underlying stock
- \(K\) = strike price (same for both call and put)
- \(r\) = risk-free interest rate
- \(T\) = time to expiration
Then put-call parity requires: \[K\mathrm{e}^{-rT} + C = P + S\]
The term \(K\mathrm{e}^{-rT}\) represents the present value of the strike price - the amount of cash that, when invested at the risk-free rate, will grow to exactly \(K\) at expiration. Here we are using continuous compounding/discounting, so \(\mathrm{e}^{-rT}\) is the discount factor. This is a common and convenient way to represent discount factors when considering various fractions of a year. The appropriate discount rate for a particular period can be imputed from the yields of Treasury bonds at nearby maturities.
Understanding the Economic Logic
The put-call parity relationship reflects the fact that two different portfolios have identical payoffs at expiration:
Portfolio A: Cash + Call
- Hold cash worth \(K\mathrm{e}^{-rT}\) (which grows to \(K\) by expiration)
- Own a call option with strike \(K\)
Portfolio B: Put + Underlying
- Own a put option with strike \(K\)
- Own one share of the underlying stock
Let’s examine what happens at expiration for any stock price \(S_T\):
- Case 1: Stock price at expiration \(S_T > K\)
- Portfolio A: Cash grows to \(K\), call is worth \((S_T - K)\), total value = \(K + (S_T - K) = S_T\)
- Portfolio B: Put expires worthless, stock is worth \(S_T\), total value = \(0 + S_T = S_T\)
- Case 2: Stock price at expiration \(S_T \leq K\)
- Portfolio A: Cash grows to \(K\), call expires worthless, total value = \(K + 0 = K\)
- Portfolio B: Put is worth \((K - S_T)\), stock is worth \(S_T\), total value = \((K - S_T) + S_T = K\)
Because both portfolios have identical payoffs in all possible scenarios, they must have the same current value to prevent arbitrage opportunities.
Arbitrage Example
Suppose put-call parity is violated. For example, assume:
- Stock price: \(S = \$100\)
- Strike price: \(K = \$100\)
- Time to expiration: \(T = 0.25\) years (3 months)
- Risk-free rate: \(r = 5\%\)
- Call price: \(C = \$6\)
- Put price: \(P = \$4\)
Then, we have:
- Present value of strike: \(K\mathrm{e}^{-rT} = 100\mathrm{e}^{-0.05 \times 0.25} = \$98.76\)
- Put-call parity requires: \(98.76 + 6 = 4 + 100\), or \(104.76 = 104\)
- Because \(104.76 > 104\), the left side is overpriced relative to the right side. An arbitrageur would:
- Sell the expensive side: Sell the call and lend $98.76 at the risk-free rate
- Buy the cheap side: Buy the put and buy the stock
- Initial cash flow: \(+6 + 98.76 - 4 - 100 = +\$0.76\) (immediate profit!)
At expiration, regardless of the stock price, the arbitrageur can close all positions with zero net cash flow, keeping the initial $0.76 as riskless profit.
Practical Implications
Put-call parity has several important applications:
1. Option Pricing: If we know the prices of a call, the underlying stock, and the risk-free rate, we can determine what the put price should be (and vice versa).
2. Synthetic Instruments: We can create synthetic positions:
- Synthetic call: \(C = P + S - K\mathrm{e}^{-rT}\)
- Synthetic put: \(P = C - S + K\mathrm{e}^{-rT}\)
- Synthetic stock: \(S = C - P + K\mathrm{e}^{-rT}\)
3. Conversion and Reversal Strategies: Professional traders use these synthetic relationships to identify mispriced options and construct arbitrage trades.
Important Limitations
Put-call parity as stated above applies specifically to:
- European options (cannot be exercised before expiration)
- Non-dividend-paying stocks (dividends complicate the relationship)
- Same strike price and expiration for both call and put
For American options, the put-call parity relation does not always hold, and, for stocks that pay dividends prior to the option’s maturity, the present value of expected dividends must be subtracted from the stock price in the parity relationship. Despite these limitations, put-call parity is one of the most reliable and useful relationships in options theory, providing a foundation for understanding options pricing and identifying trading opportunities.
2.9 Early Exercise of American Options
Most exchange-traded options are American-style, meaning they can be exercised at any time before expiration. However, early exercise is not always optimal and should be considered carefully. Understanding when early exercise might be beneficial requires analyzing the trade-off between immediate payoff and the option’s remaining time value.
An option’s value consists of two components:
- Intrinsic value: The value if it were expiring now
- Time value: The additional value from the possibility of more favorable price movements before expiration
Early exercise is optimal when the value is equal to the intrinsic value alone, meaning that the time value has shrunk to zero.
American Calls
For American call options on stocks that pay no dividends prior to the option maturity, early exercise is never optimal. This important result is sometimes stated as “calls are better alive than dead.” It follows from two facts:
In financial markets, as in life generally, “keeping your options open” is valuable. In other words, there is value to the flexibility that an option provides. This flexibility is lost once it is exercised.
Early exercise of a call means paying the strike early, which has an opportunity cost equal to the foregone interest that could be earned if the cash were held instead of being used to pay the strike.
The only time that a call should be exercised early is to capture a dividend (or other cash flow) paid by the underlying asset. Call holders do not receive dividends, so it may be optimal to exercise to avoid missing the dividend. Even in this circumstance, individual investors will generally find it better to sell the call in the market rather than exercising. However, institutional investors, who can trade at lower costs, may find it profitable to exercise. Regardless, if anyone finds it optimal to exercise, the bid price of the call must have fallen to the call’s intrinsic value, meaning the time value of the option has shrunk to zero. This typically occurs only just before an ex-dividend date, and even then the dividend must be large enough to offset the value of preserving flexibility for the remaining maturity of the option. In subsequent chapters, we will investigate models for determining how large the dividend must be.
American Puts
It is more likely that an American put should be exercised early than it is that an American call should be exercised early. This is because the second factor above (the time value of money for the strike) is reversed for puts. Early exercise of a put implies early receipt of the strike, which can be invested to earn interest.
Whether it is optimal to exercise an American put early depends on how deeply in the money it is and how high interest rates are. When a put is deeply in the money (meaning the underlying asset price is low), there is little value to the flexibility of keeping the option open, because it becomes nearly certain that exercise at some date will be optimal. In this case, one should exercise to get the strike early and forego flexibility. When interest rates are high, the time value of money is high, so again it can be optimal to exercise early. Whether one should exercise early depends on both of these factors - how deeply in the money the option should be before exercising depends on how high interest rates are. The volatility of the underlying asset price is also a critical factor, because it determines the value of maintaining flexibility. Again, we will investigate models for making this determination in later chapters.
Put-Call Parity, Option Bounds, and Early Exercise
The put-call parity formula for European options on non-dividend-paying assets is \[ C + \mathrm{e}^{-rT}K = P + S\] Because the put value must be at least zero, this gives us the inequality \[C + \mathrm{e}^{-rT}K \ge S \;\Leftrightarrow\; C \ge S - \mathrm{e}^{-rT}K > S - K\,.\] Thus, we can see that the value of a European call on a non-dividend-paying asset must be strictly greater than the intrinsic value. Because American calls are worth at least as much as their European counterparts, the value of an American call on a non-dividend-paying asset must also be strictly greater than its intrinsic value and hence should not be exercised early.
The “strictly greater” rather than “greater than or equal to” is due to the time value of money, as encapsulated in the fact that \(\mathrm{e}^{-rT}K < K\). This is factor #2 described above as to why American calls on non-dividend-paying assets should never be exercised early.
Because call values are also at least zero, we can likewise obtain an inequality for put values from put-call parity, namely, \[\mathrm{e}^{-rT}K \le P + S \; \Leftrightarrow \; P \ge \mathrm{e}^{-rT}K - S\,.\] Put-call parity is for European options, but, because American options are worth at least as much as European options, this inequality also holds for American options on non-dividend-paying assets. However, this does not tell us that early exercise is suboptimal, because, as discussed before, the time value of money operates in reverse fashion for puts compared to calls (the present value of the strike appears with a positive sign on the right-hand side of the inequality for puts but with a negative sign for calls). In fact, it is possible that \[K - S = P > \mathrm{e}^{-rT}K-S\,.\] In this circumstance, the time value of the put has shrunk to zero, and early exercise is optimal.
2.10 Exercises
Exercise 2.1 As illustrated in the protective put, covered call, and collar examples, a long position in one unit of the underlying asset has a payoff diagram equal to the 45-degree line. Symmetrically, a short position in one unit of the underlying asset has a payoff diagram equal to the negative of the 45-degree line. What option position would cap the possible loss from a short position? How would you collar a short position? Write python code to generate the payoff diagrams of these porttolios.
Exercise 2.2 The text explains a bull call spread. Using put-call parity, explain how we can obtain the same payoff diagram using puts. Write python code to generate the payoff diagrams of the bull call spread and the bull put spread.
Exercise 2.3 Repeat the previous exercise, but for a bear spread in calls and puts.
Exercise 2.4 Write python code to generate the payoff diagram of a short straddle (short call and short put with the same strike and expiration). What option positions would cap the possible losses from a short straddle? Write python code to generate the payoff diagram of the short straddle with these additional options. Using put-call parity, explain the similarity of this payoff diagram with the payoff diagram of a butterfly spread.
Exercise 2.5 Suppose you have a short position in an asset. You can protect the short position and pay for the protection by collaring the shortposition as in Exercise 2.1. There are other options that could be sold to pay for protection (options that do not create a collar). Write python code to generate the payoff diagrams of the following option portfolios combined with the short position in the underlying asset: (a) a long call and two short calls with higher strikes, (b) a short call and two long calls with higher strikes.