Original paper
Abstract
The advent of index tracking early in the 1970s and the continuous growth of assets tied to the S&P 500 index have enforced perceptions of the importance of becoming an index-member, due to increased demand by index fund participants for the stocks involved in index composition changes. This study focuses on S&P 500 inclusions and examines the impact of potential overnight price adjustment after the announcement of an S&P 500 index change. We find evidence of a significant overnight price change that diminishes the profits available to speculators although there are still profits available from the first day after announcement until a few days after the actual event. More importantly observing the tick-by-tick stock price performance of the key days of the event window for the first time, we find evidence of consistent trading patterns during trading hours over inclusion event. A separate analysis of two different sub-periods as well as of NASDAQ and NYSE listed stocks allows for a detailed examination of the price and volume effect in continuous time.
Keywords:Â Index effect, S&P 500, market efficiency, price pressure
Trading rules
- Buy stocks being added to S&P 500 index at close, one day post-announcement
- Sell stocks at close on the effective day
- Short the general market for hedging purposes
Python code
Backtrader
import backtrader as bt
class SP500AdditionEffect(bt.Strategy):
def __init__(self):
self.added_stocks = {} # Dictionary to store added stocks and their effective dates
def next(self):
# Buy stocks one day after announcement
for stock, data in self.datas.items():
if data.datetime.date() == data.announcement_date + bt.TimeFrame.Days(1):
self.buy(data=data)
# Store stock and its effective date in the dictionary
self.added_stocks[data] = data.effective_date
# Sell stocks at close on the effective day
for stock, effective_date in self.added_stocks.items():
if self.datetime.date() == effective_date:
self.sell(data=stock)
# Remove stock from the dictionary
del self.added_stocks[stock]
# Short the general market for hedging purposes
self.sell(data=self.data0)
# Instantiate Cerebro, add strategy, data feeds, broker settings, etc.
cerebro = bt.Cerebro()
cerebro.addstrategy(SP500AdditionEffect)
# Add data feeds and other settings as required
# ...
cerebro.run()
Please note that this code snippet assumes that you have already set up the data feeds with the required announcement_date and effective_date fields. You will need to integrate this code with your existing Backtrader setup and provide the necessary data.