Quant BuffetRelax, Not Over Thinking

Shorting Stocks on the Option Expiration Day

Log in to collect

Academic paper

Strategy in a nutshell

The strategy focuses on NYSE, AMEX, and NASDAQ stocks priced above $5 with tradable options. Stocks are classified into three in-the-money (ITM) categories: slightly ITM (0-5%), medium ITM (5-25%), and deep ITM (over 25%), based on the percentage ITM of their options. Within the deep ITM category, stocks are further ranked into small, medium, and large groups by open interest, using the 40th and 70th percentiles as cutoffs. The strategy shorts stocks with the highest open interest in the deep ITM group. Portfolios, equally weighted, are formed the Thursday before options expiration Friday and held for one day.

Economic rationale

The price-pressure hypothesis explains that non-information-driven demand shifts, such as large stock sales or purchases, temporarily impact prices. Large sales press prices down, while large purchases push them up. A common source of selling pressure is investors exercising deeply in-the-money call options and promptly selling the acquired stocks. This immediate liquidation creates additional supply in the market, leading to short-term price declines. This phenomenon highlights how stock prices can be influenced by trading mechanics rather than underlying fundamental changes, providing opportunities for strategies that anticipate and capitalize on these temporary price pressures.

Backtest performance

Annualised return18.86%
Volatility24.69%
Beta-0.025
Sharpe ratio0.6
Win rate46%

Full Python code

from AlgorithmImports import *
#endregion
class OptionExpirationWeekEffect(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2010, 1, 1)
self.SetCash(100000)

self.symbol = self.AddEquity('DIA', Resolution.Minute).Symbol
option = self.AddOption('DIA')
option.SetFilter(-3, 3, timedelta(0), timedelta(days = 60))       

self.SetBenchmark('DIA')
self.last_expiry = datetime.min

self.Schedule.On(self.DateRules.Every(DayOfWeek.Tuesday, DayOfWeek.Tuesday), self.TimeRules.AfterMarketOpen(self.symbol), self.GetExpiryDay)
self.Schedule.On(self.DateRules.Every(DayOfWeek.Thursday, DayOfWeek.Thursday), self.TimeRules.AfterMarketOpen(self.symbol), self.Open)
self.Schedule.On(self.DateRules.Every(DayOfWeek.Friday, DayOfWeek.Friday), self.TimeRules.AfterMarketOpen(self.symbol), self.Close)
def GetExpiryDay(self):
# Expiry days are available only on Tuesday
calendar = self.TradingCalendar.GetDaysByType(TradingDayType.OptionExpiration, self.Time, self.EndDate)
expiries = [i.Date for i in calendar]
if len(expiries) == 0: return
self.last_expiry = expiries[0]
def Close(self):
# Liquidate on Friday
self.Liquidate()

def Open(self):
# Buy on Thursday before expiry date.
if (self.last_expiry - self.Time).days <= 1 and self.last_expiry != datetime.min:
    self.SetHoldings(self.symbol, -1)