Option Strategies
Bear Call Spread
Introduction
Bear call spread, which is also known as short call spread, consists of buying an OTM call and selling an ITM call. Both calls have the same underlying stock and the same expiration date. The OTM call serves as a hedge of the ITM call. It is a option strategy profitting from a decline in underlying asset price, as well as the time decay value of the shorted option contract.
This is a limited-reward-limited-risk strategy. The payoff is as follows:
$Payoff_{OTM\ call}=(Price_{underlying}-Strike_{OTM\ call})^{+}$$Payoff_{ITM\ call}=(Price_{underlying}-Strike_{ITM\ call})^{+}$
$Profit/Loss=(Payoff_{OTM\ call}-Payoff_{ITM\ call}+credit\ received_{ITM\ call}-debit\ paid_{OTM\ call})\times multiplier-commissions$

The maximum profit is the net credit received after commission when opening the trade. If the price is declining, both calls will become worthless at expiration.
Maximum loss is the spread between the 2 options' strike prices minus net credit received when opening the trade, where is underlying price is above both strike prices and the options being exercised/assigned.
If the option is American option, there will be a risk of early assignment on the shorted option.
Implementation
Follow these steps to implement the bear call spread strategy.
- In the Initialize method, set the start date, end date, cash, and Option universe.
- In the OnData method, select the Option contracts.
- In the OnData method, call the
OptionStrategies.BearCallSpread
method and then submit the order.
private Symbol _symbol; public override void Initialize() { SetStartDate(2017, 2, 1); SetEndDate(2017, 3, 5); SetCash(500000); var option = AddOption("GOOG", Resolution.Minute); _symbol = option.Symbol; option.SetFilter(universe => universe.IncludeWeeklys() .Strikes(-15, 15) .Expiration(TimeSpan.FromDays(0), TimeSpan.FromDays(31))); }
def Initialize(self) -> None: self.SetStartDate(2017, 2, 1) self.SetEndDate(2017, 3, 5) self.SetCash(500000) option = self.AddOption("GOOG", Resolution.Minute) self.symbol = option.Symbol option.SetFilter(self.UniverseFunc) def UniverseFunc(self, universe: OptionFilterUniverse) -> OptionFilterUniverse: return universe.IncludeWeeklys().Strikes(-15, 15).Expiration(timedelta(0), timedelta(31))
public override void OnData(Slice slice) { if (Portfolio.Invested) return; // Get the OptionChain of the symbol var chain = slice.OptionChains.get(_symbol, null); if (chain.Count() == 0) return; // sorted the optionchain by expiration date and choose the furthest date var expiry = chain.OrderByDescending(x => x.Expiry).First().Expiry; // filter the call options from the contracts which expire on the furthest expiration date in the option chain. var calls = chain.Where(x => x.Expiry == expiry && x.Right == OptionRight.Call); if (calls.Count() == 0) return; // sort the call options with the same expiration date according to their strike price. var callStrikes = calls.Select(x => x.Strike).OrderBy(x => x); // select the strike prices for forming the option legs // the ITM call option with the lowest strike price (short) and the OTM call with the highest strike price (long). var itmStrike = callStrikes.First(); var otmStrike = callStrikes.Last();
def OnData(self, slice: Slice) -> None: # avoid extra orders if self.Portfolio.Invested: return # Get the OptionChain of the self.symbol chain = slice.OptionChains.get(self.symbol, None) if not chain: return # sorted the optionchain by expiration date and choose the furthest date expiry = sorted(chain, key = lambda x: x.Expiry, reverse=True)[0].Expiry # filter the call options from the contracts which expire on the furthest expiration date in the option chain. calls = [i for i in chain if i.Expiry == expiry and i.Right == OptionRight.Call] if len(calls) == 0: return # sort the call options with the same expiration date according to their strike price. call_strikes = sorted([x.Strike for x in calls]) # select the strike prices for forming the option legs # the ITM call option with the lowest strike price (short) and the OTM call with the highest strike price (long). itm_strike = call_strikes[0] otm_strike = call_strikes[-1]
var optionStrategy = OptionStrategies.BearCallSpread(_symbol, itmStrike, otmStrike, expiry); // We open a position with 1 unit of the option strategy Buy(optionStrategy, 1); }
option_strategy = OptionStrategies.BearCallSpread(self.symbol, itm_strike, otm_strike, expiry) # We open a position with 1 unit of the option strategy self.Buy(option_strategy, 1)
Summary
In this algorithm, we've realised the below payout at expiration (2022-3-4).
Items | Price |
---|---|
Price of OTM call | $ 4.40 |
Price of ITM call | $ 36.80 |
Strike of OTM call | $ 835.00 |
Strike of ITM call | $ 767.50 |
Price of underlying at expiration | $ 829.08 |
Commission per trade | $ 1.00 |
$Payoff_{ITM\ call}=(829.08-767.50)^{+}=61.58$
$Payoff_{total}=(0-61.58+36.80-4.40)\times100-1.00\times2=-2920$
So, the strategy losses $2920.