
The strategy shorts high open-interest stocks in the deep ITM category, forming equally weighted portfolios on the Thursday before options expiration Friday and holding for one day.
ASSET CLASS: stocks | REGION: United States | FREQUENCY:
Daily | MARKET: equities | KEYWORD: Shorting, Stocks, Option, Expiration
I. 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.
II. 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.
III. SOURCE PAPER
Stock Returns on Option Expiration Dates [Click to Open PDF]
Chiang, Columbia University
<Abstract>
This paper documents striking evidence that stocks with a suf ciently large amount of deeply in-the-money call options earn signi cantly lower returns on option expiration dates, with a drop in average daily returns of up to 1 percentage point. This price movement of stocks is followed by a short-term reversal. On option expiration dates, option holders who exercise deeply in-the-money call options have an increasing demand for immediacy to sell the acquired stocks in the stock market. I offer an explanation of why this is not offset by option writers’ purchases, based on the premise that most written calls are covered either at inception or prior to maturity. When exercised open interest is sufficiently large compared to the daily trading volume of the underlying stocks, the resulting selling pressure in the stock market leads to a fall in expiration-date returns of the underlying stocks.

IV. BACKTEST PERFORMANCE
| Annualised Return | 18.86% |
| Volatility | 24.69% |
| Beta | -0.025 |
| Sharpe Ratio | 0.6 |
| Sortino Ratio | N/A |
| Maximum Drawdown | N/A |
| Win Rate | 46% |
V. 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)