Overall Statistics
Total Trades
127
Average Win
1.46%
Average Loss
-1.73%
Compounding Annual Return
-22.980%
Drawdown
19.000%
Expectancy
-0.061
Net Profit
-10.365%
Sharpe Ratio
-0.489
Probabilistic Sharpe Ratio
14.127%
Loss Rate
49%
Win Rate
51%
Profit-Loss Ratio
0.84
Alpha
-0.155
Beta
0.086
Annual Standard Deviation
0.316
Annual Variance
0.1
Information Ratio
-0.429
Tracking Error
0.382
Treynor Ratio
-1.788
Total Fees
$2025.02
# 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}')