Mid-Month Payday S&P500 Strategy
Log in to collectAcademic paper
Aixin Ma; William R. Pratt
- Oklahoma City University
- ?Oklahoma City University - Meinders School of Business
Strategy in a nutshell
The investment universe consists of the S&P500 index. Simply, buy and hold the index during the 16th day in the month during each month of the year.
Economic rationale
The reason for the functionality is probably deeply connected with paychecks. Employees get paid at the end of the month, and many of them either automatically invest a portion of their paycheck in the market through retirement contributions or are encouraged to do so by having a surplus of funds with the new paycheck. However, many companies pay their employees twice a month, on the 15th and at the end of the month. Therefore, building on that the pay-day effect holds true for the turn-of-the-month days, there should be a clear pattern in the middle of the month as well as at the end of the month since employees do make retirement contributions with every paycheck. Results confirm that abnormal returns indeed exist in the middle of the month. According to the research, the 16th of the month is not only the 3rd best day in the month overall, but has moved up in the ranks monotonically every decade since the 1950s, until the most recent decade, the 2010s. Although more and more firms are paying wages on a bi-weekly basis, the highest average hourly earnings are distributed semi-monthly followed by monthly distribution, which favours this strategy, and therefore, this effect should not diminish. Another possible reason for the functionality is that, because the other pay-days have been extensively discussed in the literature, practitioners have been trying to take advantage of the anomaly and market efficiency has caught up, reducing the magnitude of the anomaly. Therefore, this novel anomaly has a strong performance if we compare it with the other days, and mainly, it is not traded-off, at least not yet.
Backtest performance
Full Python code
from dateutil.relativedelta import relativedelta
from AlgoLib import *
class PayDayAnomaly(XXX):
def Initialize(self):
self.SetStartDate(2000, 1, 1)
self.SetCash(100000)
self.market: Symbol = self.AddEquity('SPY', Resolution.Minute).Symbol
self.liquidate_next_day: bool = False
self.Schedule.On(self.DateRules.EveryDay(self.market), self.TimeRules.BeforeMarketClose(self.market, 1), self.Purchase)
def Purchase(self) -> None:
alg_time = self.Time
paydate = self.PaydayDate(alg_time)
if alg_time.date() == paydate:
self.SetHoldings(self.market, 1)
self.liquidate_next_day = True
if self.liquidate_next_day:
self.liquidate_next_day = False
return
if self.Portfolio[self.market].IsLong:
self.Liquidate(self.market)
def PaydayDate(self, date_time):
payday = date(date_time.year, date_time.month, 1) + relativedelta(day=15)
if payday.weekday() == 5: # Is saturday.
payday = payday - timedelta(days=1)
elif payday.weekday() == 6: # Is sunday.
payday = payday - timedelta(days=2)
return payday