Overall Statistics
# Compounding Annual Return: 23.624%

class PERatioStrategy(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2000, 1, 1)  # Set Start Date
        self.SetEndDate(2000, 6, 1)  # Set End Date
        self.SetCash(100000)  # Set Strategy Cash
        
        self.Settings.FreePortfolioValuePercentage = 0.1
        self.UniverseSettings.Resolution = Resolution.Daily
        self.AddUniverse(self.CoarseFilter, self.FineFilter)
        self.lastMonth = -1
        self.symbols = []
    
    
    def CoarseFilter(self, coarse):
        if self.Time.month == self.lastMonth:
            return self.symbols
        
        CoarseWithFundamental = [x for x in coarse if x.HasFundamentalData and x.Price > 5]
        sortedByDollarVolume = sorted(CoarseWithFundamental, key=lambda x: x.DollarVolume, reverse=False) 

        return [i.Symbol for i in sortedByDollarVolume[:500]]
        
    
    def FineFilter(self, fine):
        if self.Time.month == self.lastMonth:
            return self.symbols
        self.lastMonth = self.Time.month
        
        fine = [x for x in fine if x.ValuationRatios.PERatio > 0]
        sortedPERatio = sorted(fine, key=lambda x: x.ValuationRatios.PERatio)
        self.symbols = [x.Symbol for x in sortedPERatio[:10]]
        return self.symbols
    
    
    def OnSecuritiesChanged(self, changes):
        holdings = []
        for symbol in self.symbols:
            holdings.append(PortfolioTarget(symbol, 0.1))
        # self.Liquidate()
        self.SetHoldings(holdings, True)
        
            
    def Summary(self):
        self.Debug(self.Time)
        # holdings = []
        # for symbol in self.Portfolio.Keys:
        #     holding = self.Portfolio[symbol]
        #     positionSize = holding.Quantity * holding.Price
        #     temp = f'{symbol.Value}:{positionSize}'
        #     holdings.append(temp)
        # self.Debug(' '.join(holdings))
                        
        self.Debug(f'{self.Portfolio.Cash}, {self.Portfolio.UnsettledCash}')
        self.Debug(f'{self.Portfolio.MarginRemaining}, {self.Portfolio.TotalMarginUsed}')
        self.Debug(f'{self.Portfolio.TotalHoldingsValue}, {self.Portfolio.TotalPortfolioValue}')