Original paper
Abstract
We document large average excess returns on U.S. equities in anticipation of monetary policy decisions made at scheduled meetings of the Federal Open Market Committee (FOMC) in the past few decades. These pre-FOMC returns have increased over time and account for sizable fractions of total annual realized stock returns. While other major international equity indices experienced similar pre-FOMC returns, we find no such effect in U.S. Treasury securities and money market futures. Other major U.S. macroeconomic news announcements also do not give rise to pre-announcement excess equity returns. Pre-FOMC returns are higher in periods when the slope of the Treasury yield curve is low, implied equity market volatility is high, and when past pre-FOMC returns have been high. We discuss challenges at explaining these returns with standard asset pricing theory.
Keywords:Â FOMC announcements, equity premium, anomaly
Trading rules
- Invest in stocks during FOMC meetings (go long on S&P 500 ETF, fund, future, or CFD)
- Enter position one day before the meeting, close position after the meeting ends
- Hold cash during non-FOMC meeting days
- Leverage due to low market exposure (8 days per average year) to boost returns
Python code
Backtrader
import datetime
import backtrader as bt
class FOMCMeetingStrategy(bt.Strategy):
def __init__(self):
self.fomc_dates = self.get_fomc_dates()
def next(self):
current_date = self.data.datetime.date(0)
if current_date in self.fomc_dates:
self.buy()
elif self.position and current_date == self.fomc_dates.get(current_date) + datetime.timedelta(days=1):
self.sell()
else:
self.broker.set_cash(self.broker.get_value())
def get_fomc_dates(self):
# Replace with actual FOMC meeting dates
fomc_meetings = [
datetime.date(2023, 1, 25),
datetime.date(2023, 3, 15),
# Add more dates here
]
return {date - datetime.timedelta(days=1): date for date in fomc_meetings}
if __name__ == '__main__':
cerebro = bt.Cerebro()
cerebro.addstrategy(FOMCMeetingStrategy)
cerebro.broker.set_leverage(10) # Adjust leverage as needed
data = bt.feeds.YahooFinanceData(dataname='^GSPC', fromdate=datetime.datetime(2023, 1, 1), todate=datetime.datetime(2023, 12, 31))
cerebro.adddata(data)
cerebro.broker.set_cash(10000)
cerebro.run()
cerebro.plot()
This code snippet sets up a Backtrader strategy for trading based on FOMC meeting dates. Note that you will need to replace the fomc_meetings
list with the actual FOMC meeting dates. The leverage is set to 10x, but you can adjust this value as needed.