import pandas as pd
class EMAMomentumUniverse(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 1, 1)
self.SetEndDate(2021, 1, 1)
self.SetCash(100000)
self.AddEquity("SPY", Resolution.Daily)
self.SetBenchmark("SPY")
self.UniverseSettings.Resolution = Resolution.Daily
self.AddUniverse(self.CoarseSelectionFunction)
self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 190), self.EveryDayAfterMarketOpen)
def CoarseSelectionFunction(self, universe):
self.selected = []
universe = sorted(universe, key=lambda c: c.DollarVolume, reverse=True)
universe = [c for c in universe if c.HasFundamentalData][:100]
for coarse in universe:
symbol = coarse.Symbol
history = self.History(symbol, 63, Resolution.Daily)
adv63 = (history.close.mean() * history.volume.mean())
self.selected.append([symbol,adv63])
self.selected = pd.DataFrame(self.selected,columns=['symbol','adv']).set_index('symbol')
self.Log(str(self.selected.sort_values('adv',ascending=False).iloc[:1]))
self.selected = list(self.selected.sort_values('adv',ascending=False).iloc[:1].index)
return self.selected
def EveryDayAfterMarketOpen(self):
for security in self.selected:
self.Securities[security].SetDataNormalizationMode(DataNormalizationMode.Adjusted)
self.Securities[security].FeeModel = ConstantFeeModel(0)
for security in self.selected:
if self.Securities[security].Invested:
pass
else:
self.SetHoldings(security, 1)
for security in self.selected:
self.SetHoldings(security, 1)
self.Log('Ordered ' + str(security))