Quant BuffetRelax, Not Over Thinking

Scheduled Economic Announcements Effect in Stocks

Log in to collect

Academic paper

How Much Do Investors Care About Macroeconomic Risk? Evidence from Scheduled Economic Announcements

AuthorsPavel G. Savor; Mungo Ivor Wilson

Institute
  • DePaul University
  • ?DePaul University - Kellstadt Graduate School of Business
  • ?affiliation not provided to SSRN
  • University of Oxford
  • ?University of Oxford - Said Business School

Strategy in a nutshell

The strategy invests in equities via CFDs, ETFs, or futures only on major economic announcement days (CPI, PPI, jobs data, FOMC decisions). On other days, positions are closed and capital stays in cash, targeting gains from heightened market activity while minimizing exposure to low-information periods.

Economic rationale

Research shows markets demand a risk premium on announcement days due to heightened uncertainty. As risk-averse investors require higher compensation, stock returns rise predictably around these events, making such days attractive for targeted equity exposure.

Backtest performance

Annualised return7.2%
Beta0.093
Sortino ratio-0.104
Win rate54%

Full Python code

from AlgorithmImports import *
from pandas.tseries.offsets import BDay
#endregion
class ScheduledAnnouncementsAnomaly(QCAlgorithm):
def initialize(self):
self.set_start_date(2000, 1, 1)
self.set_cash(100_000)

self.symbol: Symbol = self.add_equity("SPY", Resolution.MINUTE).symbol
csv_string_file: str = self.download('data.quantpedia.com/backtesting_data/economic/economic_announcements.csv')
dates: List[str] = csv_string_file.split('\r\n')
self.announcement_dates_t_minus_one: List[datetime.date] = [(datetime.strptime(x, "%Y-%m-%d") - BDay(1)).date() for x in dates]
def on_data(self, data: Slice) -> None:
if self.time.hour == 15 and self.time.minute == 44:
    if self.time.date() in self.announcement_dates_t_minus_one:
        if not self.portfolio[self.symbol].is_long:
            self.market_on_close_order(self.symbol, self.calculate_order_quantity(self.symbol, 1.))
    else:
        if self.portfolio[self.symbol].is_long:
            self.market_on_close_order(self.symbol, -self.portfolio[self.symbol].quantity)