Overall Statistics
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))