Code
# Load python libraries
import plotly.graph_objects as go
import numpy as np
Additonal sources on option trading strategies:
Learning Outcomes:
# Load python libraries
import plotly.graph_objects as go
import numpy as np
Principal Protected Notes (PPNs) enable investors to engage in potentially high-reward investments without the fear of losing their principal amount. This dual-feature mechanism is facilitated through a blend of a zero-coupon bond and a derivative instrument, typically a call option.
Consider an investment in a PPN valued at $1,000, structured as follows:
Zero-Coupon Bond Component: A 3-year zero-coupon bond with a face value of $1,000 ensures the principal protection. Given a continuous compounding interest rate of 6%, the present value of this bond is calculated as: \[ PV = \$1,000 \times e^{-0.06 \times 3} = \$835.27 \] This calculation confirms that an initial investment of $835.27 will mature to $1,000 over 3 years, effectively protecting the principal.
Call Option Component: The remaining funds, amounting to $164.73 ($1,000 - $835.27), are utilized to purchase a 3-year at-the-money call option on a stock portfolio. This option provides the upside potential.
The feasibility of structuring a PPN profitably hinges on several market conditions:
To cater to diverse investor preferences, PPNs can be customized with various features:
Combining positions in the underlying stock with options can create tailored risk/reward profiles that suit various investment strategies and market views. Two popular strategies that illustrate this principle are the protective put and the covered call.
A protective put strategy involves buying a stock (or holding a currently owned stock) and buying a put option for the same stock. This strategy is used to protect against a decline in the stock’s price while allowing for participation in any upside. It guarantees a minimum selling price (the strike price of the put) for the stock until the put’s expiration, effectively setting a floor on the potential losses without capping the potential gains.
# Parameters for the protective put strategy
= np.linspace(80, 120, 100) # Range of spot prices
spot_prices = 100 # Initial stock price
S0 = 100 # Strike price of the put option
K = 5 # Premium paid for the put option
premium_put = S0 + premium_put # Total initial investment including the put premium
initial_investment
# Profit calculations for protective put
= spot_prices - S0 # Profit from the stock alone
stock_profit = np.maximum(K - spot_prices, 0) - premium_put # Profit from the long put option
put_option_profit = stock_profit + put_option_profit # Total profit from the protective put strategy
protective_put_profit
# Create the figure
= go.Figure()
fig
# Add traces for the individual components' profits
fig.add_trace(
go.Scatter(=spot_prices,
x=stock_profit,
y="lines",
mode="Stock Profit",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
fig.add_trace(
go.Scatter(=spot_prices,
x=put_option_profit,
y="lines",
mode="Put Option Profit",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Add trace for the protective put net profit
fig.add_trace(
go.Scatter(=spot_prices,
x=protective_put_profit,
y="lines",
mode="Protective Put",
name=dict(width=4),
line="Spot Price: %{x:.0f}<br>Net Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Horizontal line at profit = 0 for reference, adjusted for the initial investment
=0, line_dash="dash", line_color="black")
fig.add_hline(y
# Layout adjustments for clarity
fig.update_layout(="Protective Put Strategy",
title="Spot Price at Expiration",
xaxis_title="Profit",
yaxis_title="Component",
legend_title
)
# Show the figure
fig.show()
A covered call strategy involves owning a stock and selling a call option on that stock. This strategy is aimed at generating additional income from the option premium, which can enhance the overall returns on the stock, especially in flat or slightly bullish markets. It limits the upside potential to the strike price of the sold call but provides premium income that offers some protection against a decline in the stock’s price.
# Parameters for the covered call strategy
= np.linspace(80, 120, 100) # Range of spot prices
spot_prices = 100 # Initial stock price
S0 = 100 # Strike price of the call option
K = 5 # Premium received for the call option
premium_call
# Profit calculations for covered call
= spot_prices - S0 # Profit from the stock alone
stock_profit = np.where(spot_prices > K, K - spot_prices, 0) + premium_call # Profit from the short call option
call_option_profit = stock_profit + call_option_profit # Total profit from the covered call strategy
covered_call_profit
# Create the figure
= go.Figure()
fig
# Add traces for the individual components' profits
fig.add_trace(
go.Scatter(=spot_prices,
x=stock_profit,
y="lines",
mode="Stock Profit",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
fig.add_trace(
go.Scatter(=spot_prices,
x=call_option_profit,
y="lines",
mode="Call Option Profit",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Add trace for the covered call net profit
fig.add_trace(
go.Scatter(=spot_prices,
x=covered_call_profit,
y="lines",
mode="Covered Call",
name=dict(width=4),
line="Spot Price: %{x:.0f}<br>Net Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Horizontal line at profit = 0 for reference
=0, line_dash="dash", line_color="black")
fig.add_hline(y
# Layout adjustments for clarity
fig.update_layout(="Covered Call Strategy",
title="Spot Price at Expiration",
xaxis_title="Profit",
yaxis_title="Component",
legend_title
)
# Show the figure
fig.show()
Option spread strategies involve holding two or more options of the same type simultaneously to capitalize on movements in the underlying asset’s price. These strategies can be tailored to reflect various market outlooks, from bullish to bearish or even neutral.
A bull spread is a strategy used when an investor expects a moderate increase in the price of the underlying asset. It can be constructed using either calls or puts.
# Parameters for the bull spread strategy
= np.linspace(80, 120, 100) # Range of spot prices
spot_prices = 95 # Strike price of the long call option
K1 = 105 # Strike price of the short call option
K2 = 5 # Premium paid for the long call
premium_long = 2 # Premium received for the short call
premium_short
# Profit calculations
= np.maximum(spot_prices - K1, 0) - premium_long
long_call_profit = -(np.maximum(spot_prices - K2, 0) - premium_short)
short_call_profit = long_call_profit + short_call_profit # Net profit of the bull spread
bull_spread_profit
# Create the figure
= go.Figure()
fig
# Add traces for the individual option profits
fig.add_trace(
go.Scatter(=spot_prices,
x=long_call_profit,
y="lines",
mode="Long Call",
name=dict(width=3, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
fig.add_trace(
go.Scatter(=spot_prices,
x=short_call_profit,
y="lines",
mode="Short Call",
name=dict(width=3, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Add trace for the bull spread net profit
fig.add_trace(
go.Scatter(=spot_prices,
x=bull_spread_profit,
y="lines",
mode="Bull Spread",
name=dict(width=4),
line="Spot Price: %{x:.0f}<br>Net Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Horizontal line at profit = 0 for reference
=0, line_dash="dash", line_color="black")
fig.add_hline(y
# Layout adjustments for clarity
fig.update_layout(="Bull Spread Using Call Options",
title="Spot Price at Expiration",
xaxis_title="Profit",
yaxis_title="Component",
legend_title
)
# Show the figure
fig.show()
# Parameters for the bull spread strategy using put options
= np.linspace(80, 120, 100) # Range of spot prices
spot_prices = 95 # Strike price of the long put option (lower strike)
K1 = 105 # Strike price of the short put option (higher strike)
K2 = 2 # Premium paid for the long put
premium_long = 5 # Premium received for the short put
premium_short
# Profit calculations
= np.maximum(K1 - spot_prices, 0) - premium_long
long_put_profit = -(np.maximum(K2 - spot_prices, 0) - premium_short)
short_put_profit = long_put_profit + short_put_profit # Net profit of the bull spread using put options
bull_spread_profit
# Create the figure
= go.Figure()
fig
# Add traces for the individual option profits
fig.add_trace(
go.Scatter(=spot_prices,
x=long_put_profit,
y="lines",
mode="Long Put",
name=dict(width=3, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
fig.add_trace(
go.Scatter(=spot_prices,
x=short_put_profit,
y="lines",
mode="Short Put",
name=dict(width=3, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Add trace for the bull spread net profit
fig.add_trace(
go.Scatter(=spot_prices,
x=bull_spread_profit,
y="lines",
mode="Bull Spread",
name=dict(width=4),
line="Spot Price: %{x:.0f}<br>Net Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Horizontal line at profit = 0 for reference
=0, line_dash="dash", line_color="black")
fig.add_hline(y
# Layout adjustments for clarity
fig.update_layout(="Bull Spread Using Put Options",
title="Spot Price at Expiration",
xaxis_title="Profit",
yaxis_title="Component",
legend_title
)
# Show the figure
fig.show()
A bear spread is used when an investor expects a moderate decline in the price of the underlying asset. Similar to the bull spread, it can be executed using calls or puts.
# Parameters for the bear spread strategy using call options
= np.linspace(80, 120, 100) # Range of spot prices
spot_prices = 90 # Strike price of the short call option (lower strike)
K1 = 105 # Strike price of the long call option (higher strike)
K2 = 5 # Premium received for the short call
premium_short = 2 # Premium paid for the long call
premium_long
# Profit calculations for bear spread using call options
= -(np.maximum(spot_prices - K1, 0) - premium_short)
short_call_profit = np.maximum(spot_prices - K2, 0) - premium_long
long_call_profit = short_call_profit + long_call_profit # Net profit of the bear spread
bear_spread_profit
# Create the figure
= go.Figure()
fig
# Add traces for the individual option profits
fig.add_trace(
go.Scatter(=spot_prices,
x=short_call_profit,
y="lines",
mode="Short Call",
name=dict(width=3, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
fig.add_trace(
go.Scatter(=spot_prices,
x=long_call_profit,
y="lines",
mode="Long Call",
name=dict(width=3, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Add trace for the bear spread net profit
fig.add_trace(
go.Scatter(=spot_prices,
x=bear_spread_profit,
y="lines",
mode="Bear Spread",
name=dict(width=4),
line="Spot Price: %{x:.0f}<br>Net Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Horizontal line at profit = 0 for reference
=0, line_dash="dash", line_color="black")
fig.add_hline(y
# Layout adjustments for clarity
fig.update_layout(="Bear Spread Using Call Options",
title="Spot Price at Expiration",
xaxis_title="Profit",
yaxis_title="Component",
legend_title
)
# Show the figure
fig.show()
# Parameters for the bear spread strategy using put options
= np.linspace(80, 120, 100) # Range of spot prices
spot_prices = 105 # Strike price of the long put option (higher strike)
K1 = 95 # Strike price of the short put option (lower strike)
K2 = 5 # Premium paid for the long put
premium_long = 2 # Premium received for the short put
premium_short
# Profit calculations for bear spread using put options
= np.maximum(K1 - spot_prices, 0) - premium_long
long_put_profit = -(np.maximum(K2 - spot_prices, 0) - premium_short)
short_put_profit = long_put_profit + short_put_profit # Net profit of the bear spread
bear_spread_profit
# Create the figure
= go.Figure()
fig
# Add traces for the individual option profits
fig.add_trace(
go.Scatter(=spot_prices,
x=long_put_profit,
y="lines",
mode="Long Put",
name=dict(width=3, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
fig.add_trace(
go.Scatter(=spot_prices,
x=short_put_profit,
y="lines",
mode="Short Put",
name=dict(width=3, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Add trace for the bear spread net profit
fig.add_trace(
go.Scatter(=spot_prices,
x=bear_spread_profit,
y="lines",
mode="Bear Spread",
name=dict(width=4),
line="Spot Price: %{x:.0f}<br>Net Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Horizontal line at profit = 0 for reference
=0, line_dash="dash", line_color="black")
fig.add_hline(y
# Layout adjustments for clarity
fig.update_layout(="Bear Spread Using Put Options",
title="Spot Price at Expiration",
xaxis_title="Profit",
yaxis_title="Component",
legend_title
)
# Show the figure
fig.show()
The butterfly spread is a neutral option strategy that is used when an investor expects little to no movement in the underlying asset’s price. It can be constructed using either calls or puts and involves both buying and selling options at three different strike prices.
# Parameters for the butterfly spread strategy using call options
= np.linspace(80, 120, 100) # Range of spot prices
spot_prices = 95 # Strike price of the first long call option (lower strike)
K1 = 100 # Strike price of the short call options (middle strike)
K2 = 105 # Strike price of the second long call option (higher strike)
K3 = 8 # Premium paid for the first long call
premium_long1 = 5 # Premium received for each short call (twice for the middle strike)
premium_short = 4 # Premium paid for the second long call
premium_long2
# Profit calculations for butterfly spread using call options
= np.maximum(spot_prices - K1, 0) - premium_long1
long_call1_profit = 2 * (-(np.maximum(spot_prices - K2, 0) - premium_short))
short_call_profit = np.maximum(spot_prices - K3, 0) - premium_long2
long_call2_profit = long_call1_profit + short_call_profit + long_call2_profit # Net profit of the butterfly spread
butterfly_spread_profit
# Create the figure
= go.Figure()
fig
# Add traces for the individual option profits
fig.add_trace(
go.Scatter(=spot_prices,
x=long_call1_profit,
y="lines",
mode="Long Call 1",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
fig.add_trace(
go.Scatter(=spot_prices,
x=short_call_profit,
y="lines",
mode="Short Call (2x)",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
fig.add_trace(
go.Scatter(=spot_prices,
x=long_call2_profit,
y="lines",
mode="Long Call 2",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Add trace for the butterfly spread net profit
fig.add_trace(
go.Scatter(=spot_prices,
x=butterfly_spread_profit,
y="lines",
mode="Butterfly Spread",
name=dict(width=4),
line="Spot Price: %{x:.0f}<br>Net Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Horizontal line at profit = 0 for reference
=0, line_dash="dash", line_color="black")
fig.add_hline(y
# Layout adjustments for clarity
fig.update_layout(="Butterfly Spread Using Call Options",
title="Spot Price at Expiration",
xaxis_title="Profit",
yaxis_title="Component",
legend_title
)
# Show the figure
fig.show()
# Parameters for the butterfly spread strategy using put options
= np.linspace(80, 120, 100) # Range of spot prices
spot_prices = 105 # Strike price of the first long put option (higher strike)
K1 = 100 # Strike price of the short put options (middle strike)
K2 = 95 # Strike price of the second long put option (lower strike)
K3 = 8 # Premium paid for the first long put
premium_long1 = 5 # Premium received for each short put (twice for the middle strike)
premium_short = 4 # Premium paid for the second long put
premium_long2
# Profit calculations for butterfly spread using put options
= np.maximum(K1 - spot_prices, 0) - premium_long1
long_put1_profit = 2 * (-(np.maximum(K2 - spot_prices, 0) - premium_short))
short_put_profit = np.maximum(K3 - spot_prices, 0) - premium_long2
long_put2_profit = long_put1_profit + short_put_profit + long_put2_profit # Net profit of the butterfly spread
butterfly_spread_profit
# Create the figure
= go.Figure()
fig
# Add traces for the individual option profits
fig.add_trace(
go.Scatter(=spot_prices,
x=long_put1_profit,
y="lines",
mode="Long Put 1",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
fig.add_trace(
go.Scatter(=spot_prices,
x=short_put_profit,
y="lines",
mode="Short Put (2x)",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
fig.add_trace(
go.Scatter(=spot_prices,
x=long_put2_profit,
y="lines",
mode="Long Put 2",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Add trace for the butterfly spread net profit
fig.add_trace(
go.Scatter(=spot_prices,
x=butterfly_spread_profit,
y="lines",
mode="Butterfly Spread",
name=dict(width=4),
line="Spot Price: %{x:.0f}<br>Net Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Horizontal line at profit = 0 for reference
=0, line_dash="dash", line_color="black")
fig.add_hline(y
# Layout adjustments for clarity
fig.update_layout(="Butterfly Spread Using Put Options",
title="Spot Price at Expiration",
xaxis_title="Profit",
yaxis_title="Component",
legend_title
)
# Show the figure
fig.show()
Market Outlook: Bull spreads are used when expecting a moderate price increase, while bear spreads are for a moderate price decrease. Butterfly spread is best suited for markets expected to be stable or within a specific range.
Risk and Reward: Bull and bear spreads strategies offer limited risk and reward, making them attractive for traders with a specific market view and risk tolerance. Butterfly spreado ffers a high reward-to-risk ratio if the market remains stable but with limited profit potential outside the narrow price range.
Cost Efficiency: Spreads can be cost-effective ways to gain market exposure compared to outright option purchases.
Flexibility: Investors can adjust the width of the spread and the strike prices to manage the risk-reward ratio according to their market outlook and risk appetite.
Calendar spreads, also known as time or horizontal spreads, involve options of the same underlying asset, strike price, but different expiration dates. They capitalize on the difference in time decay rates (theta) between options. Typically, a calendar spread is constructed by selling a short-term option and buying a longer-term option of the same type (call or put).
For more information check, e.g., tastylive
Option combinations involve two or more options of different types. It allow traders and investors to express complex market views and hedge positions in ways that single option positions cannot. This section covers four popular option combination strategies: straddles, strangles, strips, and straps.
A straddle involves buying or selling both a call and a put option with the same strike price and expiration date.
A long straddle is created by buying both a call and a put option. It is a bet on volatility without taking a directional stance. Traders expect the underlying asset to move significantly, but they are unsure in which direction. The maximum loss is limited to the total premium paid for both options, while the profit potential is unlimited if the underlying moves significantly in either direction.
# Parameters for the long straddle strategy
= np.linspace(80, 120, 100) # Range of spot prices
spot_prices = 100 # Strike price for both the call and put options
K = 5 # Premium paid for the call option
premium_call = 5 # Premium paid for the put option
premium_put
# Profit calculations for long straddle
= np.maximum(spot_prices - K, 0) - premium_call
call_profit = np.maximum(K - spot_prices, 0) - premium_put
put_profit = call_profit + put_profit # Net profit of the long straddle
long_straddle_profit
# Create the figure
= go.Figure()
fig
# Add traces for the individual option profits
fig.add_trace(
go.Scatter(=spot_prices,
x=call_profit,
y="lines",
mode="Call Option",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
fig.add_trace(
go.Scatter(=spot_prices,
x=put_profit,
y="lines",
mode="Put Option",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Add trace for the long straddle net profit
fig.add_trace(
go.Scatter(=spot_prices,
x=long_straddle_profit,
y="lines",
mode="Long Straddle",
name=dict(width=4),
line="Spot Price: %{x:.0f}<br>Net Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Horizontal line at profit = 0 for reference
=0, line_dash="dash", line_color="black")
fig.add_hline(y
# Layout adjustments for clarity
fig.update_layout(="Long Straddle Strategy",
title="Spot Price at Expiration",
xaxis_title="Profit",
yaxis_title="Component",
legend_title
)
# Show the figure
fig.show()
Conversely, a short straddle involves selling a call and a put option. This strategy bets on low market volatility, with the trader expecting the underlying asset to remain stable. The maximum profit is limited to the premiums received, while the risk is theoretically unlimited, as the underlying asset can move significantly in either direction.
# Parameters for the short straddle strategy
= np.linspace(80, 120, 100) # Range of spot prices
spot_prices = 100 # Strike price for both the call and put options
K = 5 # Premium received for the call option
premium_call = 5 # Premium received for the put option
premium_put
# Profit calculations for short straddle
= np.minimum(K - spot_prices, 0) + premium_call
call_profit = np.minimum(spot_prices - K, 0) + premium_put
put_profit = call_profit + put_profit # Net profit of the short straddle
short_straddle_profit
# Create the figure
= go.Figure()
fig
# Add traces for the individual option profits
fig.add_trace(
go.Scatter(=spot_prices,
x=call_profit,
y="lines",
mode="Call Option",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
fig.add_trace(
go.Scatter(=spot_prices,
x=put_profit,
y="lines",
mode="Put Option",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Add trace for the short straddle net profit
fig.add_trace(
go.Scatter(=spot_prices,
x=short_straddle_profit,
y="lines",
mode="Short Straddle",
name=dict(width=4),
line="Spot Price: %{x:.0f}<br>Net Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Horizontal line at profit = 0 for reference
=0, line_dash="dash", line_color="black")
fig.add_hline(y
# Layout adjustments for clarity
fig.update_layout(="Short Straddle Strategy",
title="Spot Price at Expiration",
xaxis_title="Profit",
yaxis_title="Component",
legend_title
)
# Show the figure
fig.show()
A strangle is similar to a straddle but involves options with different strike prices. Typically, the call option has a higher strike price than the put.
A long strangle is less expensive than a long straddle due to the options being out of the money. It requires a larger move in the underlying asset’s price to be profitable but still benefits from significant volatility without a clear directional bias. The maximum loss is limited to the total premium paid.
# Parameters for the long strangle strategy
= np.linspace(80, 120, 100) # Range of spot prices
spot_prices = 105 # Strike price of the call option (higher strike)
K_call = 95 # Strike price of the put option (lower strike)
K_put = 2 # Premium paid for the call option
premium_call = 2 # Premium paid for the put option
premium_put
# Profit calculations for long strangle
= np.maximum(spot_prices - K_call, 0) - premium_call
call_profit = np.maximum(K_put - spot_prices, 0) - premium_put
put_profit = call_profit + put_profit # Net profit of the long strangle
long_strangle_profit
# Create the figure
= go.Figure()
fig
# Add traces for the individual option profits
fig.add_trace(
go.Scatter(=spot_prices,
x=call_profit,
y="lines",
mode="Call Option",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
fig.add_trace(
go.Scatter(=spot_prices,
x=put_profit,
y="lines",
mode="Put Option",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Add trace for the long strangle net profit
fig.add_trace(
go.Scatter(=spot_prices,
x=long_strangle_profit,
y="lines",
mode="Long Strangle",
name=dict(width=4),
line="Spot Price: %{x:.0f}<br>Net Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Horizontal line at profit = 0 for reference
=0, line_dash="dash", line_color="black")
fig.add_hline(y
# Layout adjustments for clarity
fig.update_layout(="Long Strangle Strategy",
title="Spot Price at Expiration",
xaxis_title="Profit",
yaxis_title="Component",
legend_title
)
# Show the figure
fig.show()
Selling a strangle involves selling an OTM call and an OTM put. This strategy profits from low volatility and time decay. The risk is significant if the underlying moves dramatically, as one of the sold options could become deeply in the money.
# Parameters for the short strangle strategy
= np.linspace(80, 120, 100) # Range of spot prices
spot_prices = 105 # Strike price of the call option (higher strike)
K_call = 95 # Strike price of the put option (lower strike)
K_put = 2 # Premium received for the call option
premium_call = 2 # Premium received for the put option
premium_put
# Profit calculations for short strangle
= np.minimum(K_call - spot_prices, 0) + premium_call
call_profit = np.minimum(spot_prices - K_put, 0) + premium_put
put_profit = call_profit + put_profit # Net profit of the short strangle
short_strangle_profit
# Create the figure
= go.Figure()
fig
# Add traces for the individual option profits
fig.add_trace(
go.Scatter(=spot_prices,
x=call_profit,
y="lines",
mode="Call Option",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
fig.add_trace(
go.Scatter(=spot_prices,
x=put_profit,
y="lines",
mode="Put Option",
name=dict(width=2, dash='dot'),
line="Spot Price: %{x:.0f}<br>Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Add trace for the short strangle net profit
fig.add_trace(
go.Scatter(=spot_prices,
x=short_strangle_profit,
y="lines",
mode="Short Strangle",
name=dict(width=4),
line="Spot Price: %{x:.0f}<br>Net Profit: %{y:.0f}<extra></extra>",
hovertemplate
)
)
# Horizontal line at profit = 0 for reference
=0, line_dash="dash", line_color="black")
fig.add_hline(y
# Layout adjustments for clarity
fig.update_layout(="Short Strangle Strategy",
title="Spot Price at Expiration",
xaxis_title="Profit",
yaxis_title="Component",
legend_title
)
# Show the figure
fig.show()
Strips and straps are modifications of the straddle strategy, offering a directional bias while still betting on volatility.
Strip: A strip consists of buying one call option and two put options with the same strike price and expiration. This strategy bets on volatility but with a bearish outlook, as the additional put provides extra profit if the underlying asset’s price falls.
Strap: A strap involves buying two call options and one put option with the same strike price and expiration. It is similar to a strip but with a bullish outlook, benefiting from an upward move in the underlying asset’s price.
Volatility Sensitivity: All these strategies are sensitive to changes in implied volatility. Long positions in straddles, strangles, strips, and straps benefit from an increase in volatility, while short positions benefit from a decrease.
Directional Bias: Straddles and strangles are primarily non-directional strategies that profit from significant price movements in either direction. Strips and straps introduce a directional bias, offering asymmetric payoffs based on the underlying asset’s movement.
Risk and Reward: The risk-reward profile varies significantly between these strategies. Long positions have limited risk and potentially unlimited reward, while short positions offer limited profit potential with significant risk.
Breakeven Points: These strategies have two breakeven points, one on each side of the underlying asset’s price at entry. The underlying must move beyond these points for long strategies to profit.