Overall Statistics |
Total Trades 2257 Average Win 1.02% Average Loss -1.20% Compounding Annual Return 4.295% Drawdown 62.200% Expectancy 0.042 Net Profit 58.875% Sharpe Ratio 0.275 Probabilistic Sharpe Ratio 0.365% Loss Rate 44% Win Rate 56% Profit-Loss Ratio 0.86 Alpha -0.085 Beta 1.287 Annual Standard Deviation 0.285 Annual Variance 0.081 Information Ratio -0.233 Tracking Error 0.207 Treynor Ratio 0.061 Total Fees $4634.14 Estimated Strategy Capacity $1300000.00 Lowest Capacity Asset JWS XFXVVFRVXQP1 |
class WellDressedSkyBlueSardine(QCAlgorithm): def Initialize(self): self.SetStartDate(2010, 1, 1) self.SetEndDate(2020, 12, 31) 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 = []