Hi friends,

I'm having troubles when making backtest. I find quite error messages related to data for some symbols, so I would like you to help me.

I have the following strategy:

import numpy as np class BetaAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2020, 8, 20) # Set Start Date self.SetEndDate(2020, 10, 26) # Set End Date self.SetCash(10000) # Set Strategy Cash self.ReductionCoeff = 0.98 # Coefficient to avoid leverage self.SetWarmup(22) self.PositionsNumber = 5 # Max. number of active positions for this strategy self.spy = self.AddEquity("QQQ", Resolution.Daily) # Add equity to use for trends # Dow 30 companies. self.symbols = [self.AddEquity(ticker).Symbol for ticker in [ 'FVRR', # FIVERR 'GH', # Guardant Health 'GWRE', # Guidewire Software 'HUBS', # HubSpot 'HUYA', # HUYA 'IBKR', # Interactive Brokers Group 'INCY', # Incyte Corporation 'IONS', # Ionis Pharmaceuticals 'IOVA', # Iovance Biotherapeutics 'IRDM', # Iridium Communications 'KTOS', # Kratos Defense & Security Solutions 'LMND', # Lemonade 'LSPD', # Lightspeed POS 'MCRB', # Seres Therapeutics 'MKL', # Markel Corporation ] ] # Benchmark - Security used as reference to beat. In this case QQQ (NASDAQ index) self.benchmark = Symbol.Create('QQQ', SecurityType.Equity, Market.USA) # Set number days to trace back self.lookback = 1 # Schedule Event: trigger the event at the begining of each month. self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.AfterMarketOpen(self.symbols[0]), self.Rebalance) #QQQ trend filter: only trades if benchmark trends # Very fast moving average of benchmark self.spy_ma_vfast = self.EMA("QQQ", 5) # Fast moving average of benchmark self.spy_ma_fast = self.EMA("QQQ", 13) # Slow moving average of benchmark self.spy_ma_slow = self.EMA("QQQ", 21) def Rebalance(self): # Defines benchmark in a trend (fast ma over slow ma) self.trend_up = self.spy_ma_vfast > self.spy_ma_fast and self.spy_ma_fast > self.spy_ma_slow # Fetch the historical data to perform the linear regression history = self.History( self.symbols + [self.benchmark], self.lookback, Resolution.Daily).close.unstack(level=0) symbols = self.SelectSymbols(history) # Liquidate positions that are not held by selected symbols and liquidates if benchmark is not in a trend for holdings in self.Portfolio.Values: symbol = holdings.Symbol if symbol not in symbols and holdings.Invested: self.Liquidate(symbol) # Invest in the selected symbols is benchmark/reference is in a trend for symbol in symbols: if self.trend_up: # Position size is calculated based on active strategies, max positions number and some coeffs to avoid leverage self.SetHoldings(symbol, (1*self.ReductionCoeff)/self.PositionsNumber) if not self.trend_up: self.Liquidate(symbol) def SelectSymbols(self, history): '''Select symbols with the highest intercept/alpha to the benchmark''' alphas = dict() # Get the benchmark returns benchmark = history[self.benchmark].pct_change().dropna() # Conducts linear regression for each symbol and save the intercept/alpha for symbol in self.symbols: # Get the security returns returns = history[symbol].pct_change().dropna() returns = np.vstack([returns, np.ones(len(returns))]).T # Simple linear regression function in Numpy result = np.linalg.lstsq(returns, benchmark) alphas[symbol] = result[0][1] # Select symbols and number of them with the highest intercept/alpha to the benchmark selected = sorted(alphas.items(), key=lambda x: x[1], reverse=True)[:self.PositionsNumber] return [x[0] for x in selected]

 

But I'm getting the following error:

BacktestingRealTimeHandler.Run(): There was an error in a scheduled event EveryDay: FVRR: 0 min after MarketOpen. The error was KeyError : 'LSPD XHRUTPA72AG5'

If I try an older Start Date, it shows more error in different tickers.

Is there any way to fix this or pass the error? It happens even in other strategies using coarse and fine selection but at this moment this is the one I would like to fix.

Thanks in advance and kind regards.

 

Author