The strategy takes long equity positions via CFDs, ETFs, or futures on economic announcement days (CPI, PPI, employment, FOMC) and holds cash on non-announcement days, targeting event-driven opportunities.

I. 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.

II. 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.

III. SOURCE PAPER

How Much Do Investors Care About Macroeconomic Risk? Evidence from Scheduled Economic Announcements [Click to Open PDF]

Savor, Wison, DePaul University – Kellstadt Graduate School of Business, University of Oxford – Said Business School

<Abstract>

Stock market average returns and Sharpe ratios are significantly higher on days when important macroeconomic news about inflation, unemployment, or interest rates is scheduled for announcement. The average announcement day excess return from 1958 to 2009 is 11.4 basis points versus 1.1 basis points for all the other days, suggesting that over 60% of the cumulative annual equity risk premium is earned on announcement days. The Sharpe ratio is ten times higher. In contrast, the risk-free rate is detectably lower on announcement days, consistent with a precautionary saving motive. Our results demonstrate a trade-off between macroeconomic risk and asset returns, and provide an estimate of the premium investors demand to bear this risk.

IV. BACKTEST PERFORMANCE

Annualised Return7.2%
VolatilityN/A
Beta0.093
Sharpe RatioN/A
Sortino Ratio-0.104
Maximum DrawdownN/A
Win Rate54%

V. 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)

VI. Backtest Performance

Leave a Reply

Discover more from Quant Buffet

Subscribe now to keep reading and get access to the full archive.

Continue reading