Overall Statistics |
Total Orders 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Start Equity 50000 End Equity 50000 Net Profit 0% Sharpe Ratio 0 Sortino Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset Portfolio Turnover 0% |
from AlgorithmImports import * from QuantConnect.DataSource import * import math #endregion import datetime import calendar import numpy class StockSelectionStrategyBasedOnFundamentalFactorsAlgorithm(QCAlgorithm): def Initialize(self): self.todaysDate = 22 self.thisMonth = 11 self.thisYear = 2024 self.SetStartDate(self.thisYear, self.thisMonth, self.todaysDate) # Set Start Date self.SetEndDate(self.thisYear, self.thisMonth, self.todaysDate) # Set End Date self.SetCash(50000) # Set Strategy Cash self.roe = {} self.rsRating = {} self.weightedRoc = {} self.sortedSymbol = [] self.weight1 = 3 self.weight2 = 2 self.weight3 = 2 self.weight4 = 3 self.topXPercent = 0.2 self.volumeThreshold = 1000000 self.priceThreshold = 10 self.AddUniverse(self.CoarseSelectionFunction) self.universe_settings.resolution = Resolution.Daily self.Debug("==================") def CoarseSelectionFunction(self, fine): self.Debug("-------------") fine = [x for x in fine if x.HasFundamentalData and x.earning_reports.diluted_eps.twelve_months] sorted_by_volume = sorted(fine, key=lambda x: x.dollar_volume, reverse=True) sorted_by_volume = [x.Symbol for x in sorted_by_volume] return sorted_by_volume def OnData(self, data): for symbol, tradeBar in data.bars.items(): history = self.History(symbol, 252, Resolution.Daily) count = 1 closeList = [] for time, row in history.loc[symbol].iterrows(): if count == 1 or count == 121 or count == 189 or count == 229: closeList.append(row['close']) if count == 252: roc1 = self.roc(closeList[0],row['close']) roc2 = self.roc(closeList[1],row['close']) roc3 = self.roc(closeList[2],row['close']) roc4 = self.roc(closeList[3],row['close']) self.weightedRoc[symbol] = roc1 * self.weight1 + roc2 * self.weight2 + roc3 * self.weight3 + roc4 * self.weight4 count += 1 self.weightedRoc = {k: v for k, v in sorted(self.weightedRoc.items(), key=lambda x: x[1])} count = 0 for k, v in self.weightedRoc.items(): self.sortedSymbol.append(k) symbolSize = len(self.sortedSymbol) for j in range(symbolSize): self.rsRating[self.sortedSymbol[j]] = ((j + 1) / symbolSize) self.rsRating = {k: v for k, v in sorted(self.rsRating.items(), key=lambda x: x[1], reverse=True)} numberOfTopPercent = symbolSize * self.topXPercent rsCount= 1 # sma filter outputList = [] for symbol in self.rsRating.keys(): if rsCount > numberOfTopPercent: break history = self.History(symbol, 252, Resolution.Daily) max = -1 min = 999999 closeList = [] volumeList = [] for time, row in history.loc[symbol].iterrows(): volumeList.append(row['volume']) closeList.append(row['close']) if row['high'] > max: max = row['high'] if row['low'] < min: min = row['low'] if numpy.average(volumeList) > self.volumeThreshold and closeList[0] > self.priceThreshold: closeList.reverse() dmax = (closeList[0] - max) / max dmin = (closeList[0] - min) / min if dmax < 0.25: if dmin > 0.3: #sma tempList = closeList[:50] sma50 = numpy.average(tempList) tempList = closeList[:150] sma150 = numpy.average(tempList) tempList = closeList[:200] sma200 = numpy.average(tempList) if closeList[0] > sma50 and sma50 > sma200 and sma50 > sma150 and sma150 > sma200: outputList.append(symbol.value) rsCount+=1 self.debug(outputList) return def roc(self, old, new): result = ((new - old) / old) return result