Overall Statistics |
Total Trades 1587 Average Win 0.33% Average Loss -0.28% Compounding Annual Return 14.649% Drawdown 22.000% Expectancy 0.161 Net Profit 50.868% Sharpe Ratio 0.934 Probabilistic Sharpe Ratio 45.043% Loss Rate 47% Win Rate 53% Profit-Loss Ratio 1.20 Alpha 0.125 Beta -0.036 Annual Standard Deviation 0.129 Annual Variance 0.017 Information Ratio 0.024 Tracking Error 0.176 Treynor Ratio -3.331 Total Fees $3189.72 |
import talib from Selection.EmaCrossUniverseSelectionModel import EmaCrossUniverseSelectionModel class ModulatedOptimizedProcessor(QCAlgorithm): def Initialize(self): self.SetStartDate(2016, 11, 30) # Set Start Date self.SetCash(100000) # Set Strategy Cash self.SetBenchmark("SPY") #self.UniverseSettings.Resolution = Resolution.Daily self.UniverseSettings.Leverage = 1 fastPeriod = 10 slowPeriod = 30 count = 10 #self.SetUniverseSelection(EmaCrossUniverseSelectionModel(fastPeriod, slowPeriod, count)) #self.AddUniverse(self.Universe.Index.QC500) self.AddUniverse(self.CoarseSelectionFunction, self.FineSelectionFunction) def CoarseSelectionFunction(self, coarse): sortedByDollarVolume = sorted(coarse, key=lambda x: x.DollarVolume, reverse=True) filtered = [ x.Symbol for x in sortedByDollarVolume if x.HasFundamentalData ] return filtered[:50] def FineSelectionFunction(self, fine): filtered_fine = [x for x in fine if x.EarningReports.TotalDividendPerShare.ThreeMonths > 0 and x.ValuationRatios.PriceChange1M > 0 and x.ValuationRatios.BookValuePerShare and x.ValuationRatios.PERatio < 18 and x.ValuationRatios.FCFYield] # sortedByfactor1 = sorted(filtered_fine, key=lambda x: x.EarningReports.TotalDividendPerShare.ThreeMonths, reverse=True) # sortedByfactor2 = sorted(filtered_fine, key=lambda x: x.ValuationRatios.PriceChange1M, reverse=False) # sortedByfactor3 = sorted(filtered_fine, key=lambda x: x.ValuationRatios.BookValuePerShare, reverse=True) # sortedByfactor4 = sorted(filtered_fine, key=lambda x: x.ValuationRatios.FCFYield, reverse=True) sortedByPeRatio = sorted(filtered_fine, key=lambda x: x.ValuationRatios.PERatio, reverse=False) stocks = [ x.Symbol for x in sortedByPeRatio[:50] ] return stocks def OnData(self, data): '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. Arguments: data: Slice object keyed by symbol containing the stock data ''' # if we have no changes, do nothing if self._changes is None: return # liquidate removed securities for security in self._changes.RemovedSecurities: if security.Invested: self.Liquidate(security.Symbol) # we want 10% allocation in each security in our universe for security in self._changes.AddedSecurities: self.SetHoldings(security.Symbol, 0.15) self._changes = None #self.next_rebalance = Expiry.EndOfMonth(self.Time) # this event fires whenever we have changes to our universe def OnSecuritiesChanged(self, changes): self._changes = changes # if not self.Portfolio.Invested: # self.SetHoldings("SPY", 1)