 Hello everyone,

I got stuck on my current project trying to use the symbols from my coarse and fine universe for further analysis. Here is what I plan to do:

1. Filter for HasFundamentalData and Volume
2. Filter for FCFRatio, ROIC, ROE and TotalDebtEquityRatio
3. Take the 250 stocks with the highest ROE and calculate SMAs for them. I use a scoring system where whenever one of my criteria is met the score of this particular stock gets increased by one. My criteria is: Price > 20 day SMA; 20 day SMA > 50 day SMA and 50 day SMA > 200 day SMA. The highest sccore a stock can get is 3.
4. Then I want to take only stocks with a score of 3 and filter for those which are near a new 52 week high.
5. The remaining stocks should be compared to each other on a momentum basis. The best performing stocks over the last year make up the final basket of stocks I want to take a long position in.

How do I go about putting this process into code? I already tried to do it (see below) but I always get errors.

Can someone please help me figure out my mistakes and give me some hints on how to implement that type of workflow in an algorithm?

Best,

JD

from clr import AddReferenceAddReference("System")AddReference("QuantConnect.Algorithm")AddReference("QuantConnect.Indicators")AddReference("QuantConnect.Common")from QuantConnect.Data.UniverseSelection import *import numpy as npfrom System import *from QuantConnect import *from QuantConnect.Algorithm import QCAlgorithmfrom QuantConnect.Data.Market import *from QuantConnect.Data.UniverseSelection import *class BasicTemplateAlgorithm(QCAlgorithm):def Initialize(self):self.SetStartDate(2012, 1, 1)self.SetEndDate(2012, 1, 31)self.SetCash(10000)self.SetWarmUp(250)self.stock_score = {}self.returns = {}self.stock_52w = []self.fine = []self.basket = []self.sma_20 = Noneself.sma_50 = Noneself.sma_200 = Noneself.changes = Noneself.AddEquity('SPY', Resolution.Daily)self.UniverseSettings.Resolution = Resolution.Dailyself.AddUniverse(self.CoarseSelectionFunction, self.FineSelectionFunction)self.Schedule.On(self.DateRules.WeekStart('SPY'), self.TimeRules.AfterMarketOpen('SPY', 1), Action(self.Rebalance))self.weekly_rebalance = Falsedef CoarseSelectionFunction(self, coarse):if self.weekly_rebalance:CoarseWithFundamental = [x for x in coarse if (x.HasFundamentalData) and (int(x.Volume) > 100000)]return CoarseWithFundamentalelse:return []def FineSelectionFunction(self, fine):if self.weekly_rebalance:fine = [x for x in fine if (float(x.ValuationRatios.FCFRatio) < 20) and(float(x.OperationRatios.ROIC.OneYear) > 0) and(float(x.OperationRatios.ROE.OneYear) > 0) and(float(x.OperationRatios.TotalDebtEquityRatio.OneYear) < 1)]sortedByROE = sorted(fine, key = lambda x: x.OperationRatios.ROE.OneYear, reverse = True)[:250]self.fine = [x.Symbol for x in sortedByROE]self.weekly_rebalance = Falseself.Debug(str(self.Time) + ' Fine Universe: ' + str(self.fine))self.stock_score = {}for stock in self.fine:self.sma_20 = self.SMA(stock, 20, Resolution.Daily)self.sma_50 = self.SMA(stock, 50, Resolution.Daily)self.sma_200 = self.SMA(stock, 200, Resolution.Daily)if not self.sma_200.IsReady:returnelse:score = 0score += np.where(self.Securities[stock].Price > self.sma_20.Current.Value, 1, 0)score += np.where(self.sma_20.Current.Value > self.sma_50.Current.Value, 1, 0)score += np.where(self.sma_50.Current.Value > self.sma_200.Current.Value, 1, 0)self.stock_score[stock] = scoreself.stocks = [key for key, value in self.stock_score.items() if value == 3]slices = self.History(self.stocks, 253, Resolution.Daily)self.stocks_52w = []if not slices.empty:for i in self.stocks:df = slices.loc[i]if self.Securities[i].Price >= df['high'].nlargest(1) * 0.98:self.stocks_52w.append(i)self.returns = {}if not slices.empty:for i in self.stocks_52w:df = slices.loc[i]prev = df['close']curr = df['close'][-1]self.returns[i] = ((curr - prev) / prev) * 100self.rank_returns = {key: rank for rank, key in enumerate(sorted(self.returns, key = self.returns.get, reverse = True), 1)}self.basket = [key for key, value in self.rank_returns.items() if value <= 10]return self.basketelse:return []def Rebalance(self):self.weekly_rebalance = Truedef OnData(self, data):stock_weight = 0.099if self.changes is None:returnfor security in self.changes.RemovedSecurities:if security.Invested:self.Liquidate(security.Symbol)for security in self.changes.AddedSecurities:if not security.Invested:self.SetHoldings(security.Symbol, stock_weight)self.changes = Nonedef OnSecuritiesChanged(self, changes):self.changes = changes