Original paper
Abstract
We propose a theoretical explanation for the puzzling positive pre-announcement drift that occurs before scheduled announcements, using as a main example the drift before Federal Open Market Committee (FOMC) meetings. We construct a general equilibrium model of disagreement (differences-of-opinion) in which investors interpret costly signals differently. Investors optimally choose to stop learning when an announcement is imminent, making the risk premium realized not uniform over time. The model rationalizes puzzling empirical evidence by generating (1) an upward drift in prices just before scheduled announcements, regardless of the information announced, that coexists with (2) low volatility and (3) low trading volume.
Keywords:Â FOMC announcements, differences-of-opinion, scheduled announcements, sentiment risk, optimal stopping time
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.