Overall Statistics |
Total Trades 600 Average Win 0.49% Average Loss -0.04% Compounding Annual Return 29.717% Drawdown 33.600% Expectancy 9.686 Net Profit 268.050% Sharpe Ratio 1.035 Probabilistic Sharpe Ratio 43.039% Loss Rate 18% Win Rate 82% Profit-Loss Ratio 12.03 Alpha 0.099 Beta 1.206 Annual Standard Deviation 0.219 Annual Variance 0.048 Information Ratio 1.287 Tracking Error 0.094 Treynor Ratio 0.188 Total Fees $607.00 Estimated Strategy Capacity $240000000.00 Lowest Capacity Asset CVS R735QTJ8XC9X |
# Top Dollar Volume Top EMAR universe from AlgorithmImports import * # -------------------------------------------------------- N_DV = 20; N_MOM = 10; FAST = 50; SLOW = 200; LEV = 1.00; # -------------------------------------------------------- class DollarVolumeEmacUniverse(QCAlgorithm): def Initialize(self): self.SetStartDate(2017, 6, 1) self.SetEndDate(2022, 6, 2) self.SetCash(100000) self.UniverseSettings.Resolution = Resolution.Daily self.AddUniverse(self.CoarseSelectionFunction) self.dollar_volume_top = [] self.ema_f = {} self.ema_s = {} self.emar = {} self.universeMonth = -1 self.SetWarmUp(5*SLOW, Resolution.Daily) def CoarseSelectionFunction(self, universe): if self.Time.month == self.universeMonth: return self.dollar_volume_top stocks = [x for x in universe if (x.HasFundamentalData)] price_above_10 = [x for x in stocks if (x.Price > 10)] dollar_volume = sorted(price_above_10, key = lambda c: c.DollarVolume, reverse=True) self.dollar_volume_top = [c.Symbol for c in dollar_volume[:N_DV]] return self.dollar_volume_top def OnSecuritiesChanged(self, changes): for x in changes.RemovedSecurities: if x.Symbol in self.dollar_volume_top: del self.dollar_volume_top[x.Symbol] for symbol in self.dollar_volume_top: self.ema_f[symbol] = self.EMA(symbol, FAST, Resolution.Daily) self.ema_s[symbol] = self.EMA(symbol, SLOW, Resolution.Daily) def OnData(self, data): if self.IsWarmingUp: return if self.Time.month == self.universeMonth: return self.selectedSymbols = [] for symbol in self.dollar_volume_top: self.emar[symbol] = self.ema_f[symbol].Current.Value / self.ema_s[symbol].Current.Value if self.ema_s[symbol].Current.Value > 0 else 1.0 self.selectedSymbols = sorted(self.emar, key = lambda x: self.emar[x])[:N_MOM] self.Plot("Universe", "top_dv_top_emar_symbols", len(self.selectedSymbols)) for symbol in self.Portfolio.Keys: if symbol not in self.selectedSymbols: self.Liquidate(symbol) for symbol in self.selectedSymbols: wt = LEV/len(self.selectedSymbols) if len(self.selectedSymbols) > 0 else 0 self.SetHoldings(symbol, wt) self.universeMonth = self.Time.month