I've set up a universe and some filters and was wondering how I would go about replacing the symbol for "SPY" with the results of the filter 

import numpy as np class MyCoarseUniverseAlgorithm(QCAlgorithm): def Initialize(self): self.AddUniverse(self.MyCoarseFilterFunction) self.UniverseSettings.Resolution = Resolution.Daily self.SetStartDate(2020, 6, 10) self.SetCash(100000) self.lookback = 20 self.ceiling, self.floor = 30, 10 self.initialStopRisk = 0.98 self.trailingStopRisk = 0.9 self.Schedule.On(self.DateRules.EveryDay(self.symbol), \ self.TimeRules.AfterMarketOpen(self.symbol, 20), \ Action(self.EveryMarketOpen)) self.symbol = self.AddEquity("SPY", Resolution.Daily).Symbol def MyCoarseFilterFunction(self, coarse): pass # setup state storage in initialize method class SelectionData(object): def __init__(self, symbol, period): self.volume = 0 self.symbol = symbol self.ema = ExponentialMovingAverage(period) self.is_above_ema = False def update(self, time, price, volume): self.volume = volume if self.ema.Update(time, price): self.is_above_ema = price > ema def MyCoarseFilterFunction(self, coarse): # We are going to use a dictionary to refer the object that will keep the moving averages for c in coarse: if c.Symbol not in self.stateData: self.stateData[c.Symbol] = SelectionData(c.Symbol, 200) # Updates the SymbolData object with current EOD price avg = self.stateData[c.Symbol] avg.update(c.EndTime, c.AdjustedPrice, c.DollarVolume) # Filter the values of the dict to those above EMA and more than $1B vol. values = [x for x in self.stateData.values() if x.is_above_ema and x.volume > 1000000000] # sort by the largest in volume. values.sort(key=lambda x: x.volume, reverse=True) # we need to return only the symbol objects return [ x.symbol for x in values[:10] ] def OnData(self, data): # Plot security's price self.Plot("Data Chart", self.symbol, self.Securities[self.symbol].Close) def EveryMarketOpen(self): # Dynamically determine lookback length based on 30 day volatility change rate close = self.History(self.symbol, 31, Resolution.Daily)["close"] todayvol = np.std(close[1:31]) yesterdayvol = np.std(close[0:30]) deltavol = (todayvol - yesterdayvol) / todayvol self.lookback = round(self.lookback * (1 + deltavol)) # Account for upper/lower limit of lockback length if self.lookback > self.ceiling: self.lookback = self.ceiling elif self.lookback < self.floor: self.lookback = self.floor # List of daily highs self.high = self.History(self.symbol, self.lookback, Resolution.Daily)["high"] # Buy in case of breakout if not self.Securities[self.symbol].Invested and \ self.Securities[self.symbol].Close >= max(self.high[:-1]): self.SetHoldings(self.symbol, 1) self.breakoutlvl = max(self.high[:-1]) self.highestPrice = self.breakoutlvl # Create trailing stop loss if invested if self.Securities[self.symbol].Invested: # If no order exists, send stop-loss if not self.Transactions.GetOpenOrders(self.symbol): self.stopMarketTicket = self.StopMarketOrder(self.symbol, \ -self.Portfolio[self.symbol].Quantity, \ self.initialStopRisk * self.breakoutlvl) # Check if the asset's price is higher than highestPrice & trailing stop price not below initial stop price if self.Securities[self.symbol].Close > self.highestPrice and \ self.initialStopRisk * self.breakoutlvl < self.Securities[self.symbol].Close * self.trailingStopRisk: # Save the new high to highestPrice self.highestPrice = self.Securities[self.symbol].Close # Update the stop price updateFields = UpdateOrderFields() updateFields.StopPrice = self.Securities[self.symbol].Close * self.trailingStopRisk self.stopMarketTicket.Update(updateFields) # Print the new stop price with Debug() self.Debug(updateFields.StopPrice) # Plot trailing stop's price self.Plot("Data Chart", "Stop Price", self.stopMarketTicket.Get(OrderField.StopPrice))