| Overall Statistics |
|
Total Trades 675 Average Win 0.45% Average Loss -0.35% Compounding Annual Return 30.291% Drawdown 19.200% Expectancy 0.228 Net Profit 30.385% Sharpe Ratio 1.483 Probabilistic Sharpe Ratio 63.481% Loss Rate 46% Win Rate 54% Profit-Loss Ratio 1.29 Alpha 0.23 Beta 0.304 Annual Standard Deviation 0.176 Annual Variance 0.031 Information Ratio 0.619 Tracking Error 0.258 Treynor Ratio 0.857 Total Fees $932.79 |
class PEUniverseSelection(QCAlgorithm):
filteredByPrice = None
def Initialize(self):
self.SetStartDate(2019, 7, 1)
self.SetEndDate(2020, 7, 1)
self.SetCash(100000)
self.AddUniverse(self.CoarseSelectionFilter, self.FineSelectionFilter)
self.UniverseSettings.Resolution = Resolution.Hour
self.SetSecurityInitializer(lambda x: x.SetDataNormalizationMode(DataNormalizationMode.Raw))
self.__numberOfSymbols = 300
self.__numberOfSymbolsFine = 5
def CoarseSelectionFilter(self, coarse):
sortedByDollarVolume = sorted(coarse, key=lambda x: x.DollarVolume, reverse=True)
filteredByPrice = [x.Symbol for x in sortedByDollarVolume if x.Price > 10]
return filteredByPrice[:self.__numberOfSymbols]
def FineSelectionFilter(self, fine):
# sort descending by P/E ratio
sortedByPeRatio = sorted(fine, key=lambda x: x.ValuationRatios.PERatio, reverse=True)
# take the top entries from our sorted collection
return [ x.Symbol for x in sortedByPeRatio[:self.__numberOfSymbolsFine] ]
def OnSecuritiesChanged(self, changes):
self.changes = changes
self.Log(f"OnSecuritiesChanged({self.UtcTime}):: {changes}")
#1. Liquidate removed securities
for security in changes.RemovedSecurities:
if security.Invested:
self.Liquidate(security.Symbol)
#2. We want 10% allocation in each security in our universe
for security in changes.AddedSecurities:
self.SetHoldings(security.Symbol, 0.1)