Overall Statistics |
Total Trades 432 Average Win 1.72% Average Loss -1.91% Compounding Annual Return 34.646% Drawdown 51.400% Expectancy 0.188 Net Profit 81.444% Sharpe Ratio 0.962 Probabilistic Sharpe Ratio 38.837% Loss Rate 38% Win Rate 62% Profit-Loss Ratio 0.90 Alpha 0.113 Beta 1.178 Annual Standard Deviation 0.398 Annual Variance 0.159 Information Ratio 0.518 Tracking Error 0.296 Treynor Ratio 0.325 Total Fees $1086.98 Estimated Strategy Capacity $2600000.00 Lowest Capacity Asset KNDI U11WBD8I5YLH |
class WellDressedSkyBlueSardine(QCAlgorithm): def Initialize(self): self.SetStartDate(2019, 1, 1) self.SetEndDate(2021, 1, 1) self.SetCash(100000) self.rebalanceTime = datetime.min self.activeStocks = set() self.AddUniverse(self.CoarseFilter, self.FineFilter) self.UniverseSettings.Resolution = Resolution.Hour self.portfolioTargets = [] def CoarseFilter(self, coarse): # Rebalancing monthly if self.Time <= self.rebalanceTime: return self.Universe.Unchanged self.rebalanceTime = self.Time + timedelta(30) sortedByDollarVolume = sorted(coarse, key=lambda x: x.DollarVolume, reverse=True) return [x.Symbol for x in sortedByDollarVolume if x.Price > 10 and x.HasFundamentalData][:200] def FineFilter(self, fine): sortedByPE = sorted(fine, key=lambda x: x.MarketCap) return [x.Symbol for x in sortedByPE if x.MarketCap > 0][:10] def OnSecuritiesChanged(self, changes): # close positions in removed securities for x in changes.RemovedSecurities: self.Liquidate(x.Symbol) self.activeStocks.remove(x.Symbol) # can't open positions here since data might not be added correctly yet for x in changes.AddedSecurities: self.activeStocks.add(x.Symbol) # adjust targets if universe has changed self.portfolioTargets = [PortfolioTarget(symbol, 1/len(self.activeStocks)) for symbol in self.activeStocks] def OnData(self, data): if self.portfolioTargets == []: return for symbol in self.activeStocks: if symbol not in data: return self.SetHoldings(self.portfolioTargets) self.portfolioTargets = []