I have a very simple, buy-at-open and sell-at-close algorithm and have been testing various schedules with it. In theory, using self.TimeRules.AfterMarketOpen(symbol, 0) and self.TimeRules.At(9, 30) interchangeably should yield the exact same results, all else equal. However, the difference in returns between the two are more than 2x. Code below for both. What could be causing this in the LEAN engine?

  1. class BuyOpenSellCloseSPY(QCAlgorithm):
  2. def Initialize(self):
  3. self.SetTimeZone("America/New_York")
  4. self.SetStartDate(2017, 1, 1)
  5. self.SetCash(100000)
  6. self.ticker = self.AddEquity("SPY", Resolution.Minute, extendedMarketHours = True).Symbol
  7. self.Schedule.On(self.DateRules.EveryDay(self.ticker), self.TimeRules.AfterMarketOpen(self.ticker, 0), self.BuyOnOpen)
  8. self.Schedule.On(self.DateRules.EveryDay(self.ticker), self.TimeRules.BeforeMarketClose(self.ticker, 0), self.SellOnClose)
  9. def BuyOnOpen(self):
  10. self.SetHoldings(self.ticker, 1)
  11. def SellOnClose(self):
  12. self.Liquidate()
+ Expand

And again here, modified:

  1. class BuyOpenSellCloseSPY(QCAlgorithm):
  2. def Initialize(self):
  3. self.SetTimeZone("America/New_York")
  4. self.SetStartDate(2017, 1, 1)
  5. self.SetCash(100000)
  6. self.ticker = self.AddEquity("SPY", Resolution.Minute, extendedMarketHours = True).Symbol
  7. self.Schedule.On(self.DateRules.EveryDay(self.ticker), self.TimeRules.At(9, 30), self.BuyOnOpen)
  8. self.Schedule.On(self.DateRules.EveryDay(self.ticker), self.TimeRules.BeforeMarketClose(self.ticker, 0), self.SellOnClose)
  9. def BuyOnOpen(self):
  10. self.SetHoldings(self.ticker, 1)
  11. def SellOnClose(self):
  12. self.Liquidate()
+ Expand

Author

James Hawkins

January 2022