Overall Statistics |
Total Trades 8 Average Win 0.37% Average Loss -1.03% Compounding Annual Return -0.029% Drawdown 2.600% Expectancy -0.323 Net Profit -0.091% Sharpe Ratio -0.013 Probabilistic Sharpe Ratio 1.512% Loss Rate 50% Win Rate 50% Profit-Loss Ratio 0.35 Alpha -0 Beta 0.015 Annual Standard Deviation 0.011 Annual Variance 0 Information Ratio 0.014 Tracking Error 0.169 Treynor Ratio -0.009 Total Fees $8.00 Estimated Strategy Capacity $390000.00 Lowest Capacity Asset TRY R735QTJ8XC9X |
from QuantConnect.Data.UniverseSelection import * class PriceEarningsAnamoly(QCAlgorithm): def Initialize(self): self.SetStartDate(1999, 1, 2) self.SetWarmUp(timedelta(7)) # Warm up 7 days of data. self.SetEndDate(2002, 3, 1) self.SetCash(100000) self.SetBenchmark("SPY") self.UniverseSettings.Resolution = Resolution.Daily self.UniverseSettings.Leverage = 1.0 self.UniverseSettings.MinimumTimeInUniverse = timedelta(days=365) self.symbols = [] # record the year that have passed since the algorithm starts self.month = -1 self._ratioCoarseFilter = .9 self._NumStocksInPortfolio = 2 self.AddUniverse(self.CoarseSelectionFunction, self.FineSelectionFunction) def CoarseSelectionFunction(self, coarse): if self.Time.month == self.month: return self.symbols # drop stocks which have no fundamental data or have no price CoarseWithFundamental = [x for x in coarse if x.HasFundamentalData and x.Price > 0] sortedByDollarVolume = sorted(CoarseWithFundamental, key=lambda x: x.DollarVolume, reverse=True) coarse = [i.Symbol for i in sortedByDollarVolume[:int(len(sortedByDollarVolume)*self._ratioCoarseFilter)]] return coarse def FineSelectionFunction(self, fine): if self.Time.month == self.month: return self.symbols self.month = self.Time.month self.Debug(f"Use ROE") fine = [x for x in fine if (self.Time - x.SecurityReference.IPODate).days > 180 and x.MarketCap > 5e8] sortedPERatio = sorted(fine, key=lambda x: x.OperationRatios.ROE.OneYear, reverse=True) self.symbols = [i.Symbol for i in sortedPERatio[:self._NumStocksInPortfolio]] return self.symbols def OnSecuritiesChanged(self, change): # liquidate securities that removed from the universe for security in change.RemovedSecurities: if self.Portfolio[security.Symbol].Invested: self.Liquidate(security.Symbol) count = len(change.AddedSecurities) # evenly invest on securities that newly added to the universe for security in change.AddedSecurities: self.SetHoldings(security.Symbol, .8/(self._NumStocksInPortfolio*12))