from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
import numpy as np
class AlphaFiveUSTreasuries(QCAlgorithm):

    def Initialize(self):

        #1. Required: Five years of backtest history
        self.SetStartDate(2014, 1, 1)
    
        #2. Required: Alpha Streams Models:
        self.SetBrokerageModel(BrokerageName.AlphaStreams)
    
        #3. Required: Significant AUM Capacity
        self.SetCash(100000)

        self.AddUniverse(self.CoarseSelectionFunction)
        self.UniverseSettings.Resolution = Resolution.Hour
    
        self.spy = self.AddEquity("SPY", Resolution.Hour).Symbol
        
        #4. Required: Benchmark to SPY
        self.SetBenchmark("SPY")
        
        self.SetPortfolioConstruction(InsightWeightingPortfolioConstructionModel())
        
        self.SetExecution(ImmediateExecutionModel())
    
        # self.assets = ["IEF", "SHY", "TLT", "IEI", "SHV", "TLH", "EDV", "BIL",
        #               "SPTL", "TBT", "TMF", "TMV", "TBF", "VGSH", "VGIT",
        #               "VGLT", "SCHO", "SCHR", "SPTS", "GOVT"]

        self.assets = []

        self.symbols = {}
        
        self.portfolioValue = RollingWindow[Decimal](500)
        
        self.SetWarmup(500)
        
        # Add Equity ------------------------------------------------ 
        # add equities from coarse universe to self.symbols
        # for i in range(len(self.assets)):
        #     self.symbols[self.assets[i]] = self.AddEquity(self.assets[i],Resolution.Hour).Symbol 
        
        # test different timings after market opens affects the returns
        self.Schedule.On(self.DateRules.Every(DayOfWeek.Monday), self.TimeRules.AfterMarketOpen("SPY", 0), self.EveryDayAfterMarketOpen)
    
    def CoarseSelectionFunction(self, coarse):
        # add the top 20 assets
        # Sort symbols by Dollar Volume and if fundamental data exists, descending
        sortedByDollarVolume = sorted([x for x in coarse if x.HasFundamentalData and x.Price > 10],
                key=lambda x: x.DollarVolume, reverse=True)

        # for y in range(20):
        #     self.Debug(sortedByDollarVolume[y])
        #     self.Debug(f"Test going into range")

        # if self.lastMonth == algorithm.Time.month:
        #     return Universe.Unchanged
        # self.lastMonth = algorithm.Time.month
        self.Debug(f"before dictionary completion")
        
        self.assets = sortedByDollarVolume[:20]
        
        for x in range(20):
            if self.assets[x].Value is None:
                self.assets.RemoveSecurity(self.assets[x])
        
        self.Debug(f"test went through assets list")
        
        # for asset in self.assets:
        for x in self.assets:
            self.Debug(x)
            # if not self.Securities.ContainsKey(asset.Symbol):
            # self.symbols[self.assets[x]] = self.AddEquity(self.assets[x],Resolution.Hour).Symbol 
                

        # add assets list 
        # for asset in self.assets:
        #     self.Debug(f"test going in")
        #     self.Debug(asset)
            # self.Debug("{}".format(type(self.assets[x])))
            # create symbols and tickers dictionary
            #self.symbols[self.assets[x]] = self.AddEquity(self.assets[x],Resolution.Hour).Symbol 

        
        # add tickers and symbols to dictionary
        # for i in range(len(self.assets)):
        #     self.symbols[self.assets[x]] = self.AddEquity(self.assets[x],Resolution.Hour).Symbol 
        
        self.Debug(f"test dictionary completion")
        # for ticker, symbol in self.symbols:
        #     self.Debug(symbol)
        #     self.Debug(ticker)
        
        # return self.symbols
        # return [x.Symbol for x in sortedByDollarVolume[:10]]
        
    def EveryDayAfterMarketOpen(self):
        for symbol, ticker in self.symbols.items():
            self.Debug(symbol, ticker)
            
        # for ticker, symbol in self.symbols:
        #     self.Debug(f"test going in")
        #     self.Debug(ticker, symbol)
        
        # training for model 
        # if not self.Portfolio.Invested:
        #     insights = []
        #     for ticker, symbol in self.symbols.items():
        #         insights.append( Insight.Price(symbol, timedelta(days=5), InsightDirection.Up, 0.01, None, None, 1/len(self.symbols)) )
        #     self.EmitInsights(insights)
        # else:
        #     qb = self 
        #     #==============================
        #     # Initialize instance of Random Forest Regressor
        #     regressor = RandomForestRegressor(n_estimators=100, min_samples_split=5, random_state = 1990)
    
        #     # Fetch history on our universe
        #     df = qb.History(qb.Securities.Keys, 500, Resolution.Hour)
            
        #     # Get train/test data
        #     returns = df.unstack(level=1).close.transpose().pct_change().dropna()
        #     X = returns
        #     y = [x for x in qb.portfolioValue][-X.shape[0]:]
        #     X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 1990)
            
        #     # Fit regressor
        #     regressor.fit(X_train, y_train)
            
        #     # Get long-only predictions
        #     weights = regressor.feature_importances_
        #     symbols = returns.columns[np.where(weights)]
        #     selected = zip(symbols, weights)
        #     # ==============================
            
        #     insights = []
        #     for symbol, weight in selected:
        #         insights.append( Insight.Price(symbol, timedelta(days=5), InsightDirection.Up, 0.01, None, None, weight) )
        #     self.EmitInsights(insights)
        
    def OnData(self, data):
        self.portfolioValue.Add(self.Portfolio.TotalPortfolioValue)

Hi guys, I'm trying to create a universe sorted by dollar volume. Subsequently, the ticker and corresponding symbols will be the key value pairs of a dictionary "self.symbols". However, I am not able to append all 20 symbols I want to from the sorted dollar volume list to self.assets. I am being thrown the error "System.ArgumentNullException: Value cannot be null.
Parameter name: source". 

I have tried removing values that are null from my self.assets list but I'm still getting the error. Any help is appreciated (new to QuantConnect), thank you!