Overall Statistics
# https://quantpedia.com/strategies/pre-holiday-effect/
# 
# Investors use some simple investment vehicles to gain exposure to US equity market (ETF, fund, CFD or future) only during days 
# preceding holiday days (New Year’s Day, Martin Luther King Jr. Day, President’s Day, Good Friday, Memorial Day, Independence Day,
# Labor Day, Election Day, Thanksgiving Day, Christmas Day). Investors stay in cash during other trading days. The anomaly isn’t
# limited only to the US market but seems to work well also in other countries; therefore, it could be broadened to include 
# pre-holiday days for local holidays in other markets

class PreHolidayEffect(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2000, 1, 1)  
        self.SetCash(100000)           
        
        self.symbol = self.AddEquity("SPY", Resolution.Daily).Symbol

    def OnData(self, data):
        calendar1 = self.TradingCalendar.GetDaysByType(TradingDayType.PublicHoliday, self.Time, self.Time+timedelta(days=2))
        calendar2 = self.TradingCalendar.GetDaysByType(TradingDayType.Weekend, self.Time, self.Time+timedelta(days=2))
        
        holidays = [i.Date for i in calendar1]
        weekends = [i.Date for i in calendar2]
        
        # subtract weekends in all holidays
        public_holidays = list(set(holidays) - set(weekends))

        if not self.Portfolio.Invested and len(public_holidays)>0:
            self.SetHoldings(self.symbol, 1)
        elif self.Portfolio.Invested and len(public_holidays)==0:
            self.Liquidate()