Receivign an error trying to run algorithm in LEAN.

Here's the error. Error: Unable to cast object of type 'System.RuntimeType' to type 'QuantConnect.Data.BaseData'. And output: 

20200928 17:26:26.194 ERROR:: Error invoking IGLN.IGLN data reader. Line: 2011-04-12,29.27,29.27,29.27,29.27,1 Error: Unable to cast object of type 'System.RuntimeType' to type 'QuantConnect.Data.BaseData'. at Python.Runtime.PyObject.As[T]() at QuantConnect.Extensions.GetAndDispose[T](PyObject instance) in C:\Users\cadmin\Lean-master\Lean-master\Common\Extensions.cs:line 425 at QuantConnect.Python.PythonData.Reader(SubscriptionDataConfig config, String line, DateTime date, Boolean isLiveMode) in C:\Users\cadmin\Lean-master\Lean-master\Common\Python\PythonData.cs:line 89 at QuantConnect.Lean.Engine.DataFeeds.TextSubscriptionDataSourceReader.<Read>d__17.MoveNext() in C:\Users\cadmin\Lean-master\Lean-master\Engine\DataFeeds\TextSubscriptionDataSourceReader.cs:line 146

And here is the script.

I thought it may be the Float but seems not, or the dataframe? How to fix? Thanks! 

from clr import AddReference AddReference("System") AddReference("QuantConnect.Algorithm") AddReference("QuantConnect.Common") from System import * from QuantConnect import * from QuantConnect.Algorithm import * from QuantConnect.Securities.Equity import EquityExchange from QuantConnect.Orders import * import math import json from datetime import datetime, timedelta import numpy as np import pandas as pd from scipy.stats import norm from QuantConnect.Python import PythonData # custom data from QuantConnect.Data import SubscriptionDataSource # Risk Premia RW algorithm class RPRWAlgorithm(QCAlgorithm): def Initialize(self): # Initial settings self.SetStartDate(2017, 1, 1) self.SetEndDate(2019, 12, 31) self.SetCash(30000) self.MarketAsset = "SPY" self.WarmupTime = 3 self.Window = 300 #parameters self.vol_lookback = 90 self.corr_lookback = 120 self.formation_periods = np.array([3, 6, 9, 12])*22 self.z_score_cutoff = 0 self.momo_multiplier = 0.1 self.GrowthSymbols = [self.AddData(IGLN, "IGLN", Resolution.Daily).Symbol, # iShares Phys Metals PLC self.AddData(IDTL, "IDTL", Resolution.Daily).Symbol, # iShares $ Treasury Bond 20+yr UCITS ETF self.AddData(VDNR, "VDNR", Resolution.Daily).Symbol, # Vanguard FTSE North America UCITS ETF self.AddData(VWO, "VWO", Resolution.Daily).Symbol, # iShares MSCI Emerging Markets Indx self.AddData(TLT, "TLT", Resolution.Daily).Symbol, # iShares 20+ Year Treasury Bond ETF self.AddData(VNQI, "VNQI", Resolution.Daily).Symbol, # VANGUARD INTL E/GLB EX-US RL EST IX self.AddData(VTI, "VTI", Resolution.Daily).Symbol, # Vanguard Total Stock Market ETF self.AddData(SPY, "SPY", Resolution.Daily).Symbol, self.AddData(EMB, "EMB", Resolution.Daily).Symbol, # iShares J.P. Morgan USD Emerging Markets Bond ETF self.AddData(PUTW, "PUTW", Resolution.Daily).Symbol] # WisdomTree CBOE S&P 500 PutWrite Strategy Fund #"VEA", # VEA - Vanguard FTSE Developed Markets #"UST", # ProShares Ultra 7-10 Year Treasury #"GBTC", #BTC # these are the safety symbols we go to when things are looking bad for growth # this part is not supposed to work # I don't know how to open these assets #self.SafetySymbols = "PUTW", # WisdomTree CBOE S&P 500 PutWrite Strategy Fund # "EMB"] # iShares J.P. Morgan USD Emerging Markets Bond ETF #self.ticker = "PUTW" #self.symbol = self.AddData(TiingoDailyData, self.ticker, Resolution.Daily).Symbol #self.AddEquity("SPY", Resolution.Daily) #if self.LiveMode: # self.Debug("Trading Live!") #self.SafetySymbols = [self.AddData(EMB, "EMB", Resolution.Daily).Symbol, # iShares J.P. Morgan USD Emerging Markets Bond ETF #self.AddData(PUTW, "PUTW", Resolution.Daily).Symbol] # WisdomTree CBOE S&P 500 PutWrite Strategy Fund # all symbols set # self.AllSymbols = list(set(self.GrowthSymbols) | set(self.SafetySymbols)) self.TickerVolTarget = 0.05 self.VolLookback = 60 self.MaxLeverage = 1 self.SetWarmUp(self.VolLookback) # open equity symbols for symbol in self.GrowthSymbols: self.AddEquity(symbol, Resolution.Daily) # this doesn't do anything at the moment. We need to work out how to properly handles these assets #for symbol in self.SafetySymbols: # self.AddOption(symbol, Resolution.Daily) # wait for warming up self.SetWarmUp(self.WarmupTime) # schedule the trading function self.Schedule.On(self.DateRules.EveryDay(self.MarketAsset), self.TimeRules.AfterMarketOpen(self.MarketAsset, 120), Action(self.RebalanceAndTrade)) # schedule the Portfolio Statistics self.Schedule.On(self.DateRules.EveryDay(self.MarketAsset), self.TimeRules.AfterMarketOpen(self.MarketAsset, 10), Action(self.Perfomance)) def OnEndOfDay(self, symbol): self.Plot(str(symbol),'EOD',self.Securities[symbol].Price) #def OnData(self, data): # pass # if self.LiveMode: self.Debug("Running algorithm!!") def OnData(self, slice): #if self.LiveMode: self.Debug("Running algorithm!!") # Make sure all the data we need is in place if self.IsWarmingUp: return # if not slice.ContainsKey("PUTW"): # self.Debug("PUTW not found!!") # return # if not slice.ContainsKey("EMB"): # self.Debug("EMB not found!!") # return #if self.LiveMode: self.Debug("Warm Up Complete Deciding..") def Perfomance(self): slices = self.History(self.GrowthSymbols, self.Window, Resolution.Daily) slices_df = pd.pivot_table(slices, values = 'close', index='time', columns = 'symbol').reset_index() slices_df = slices_df.drop(columns=['time']) #slices_df.columns = [SymbolCache.GetTicker(x) for x in slices_df.columns] returns = slices_df.pct_change() # trading function def RebalanceAndTrade(self): slices = self.History(self.GrowthSymbols, self.Window, Resolution.Daily) slices_df = pd.pivot_table(slices, values = 'close', index='time', columns = 'symbol').reset_index() slices_df = slices_df.drop(columns=['time']) #slices_df.columns = [SymbolCache.GetTicker(x) for x in slices_df.columns] returns = slices_df.pct_change() if self.IsWarmingUp: return #if self.Time.day != 6: return # creating the pandas DataFrame ''' slices = self.History(self.AllSymbols, self.Window, Resolution.Daily) slices_df = pd.pivot_table(slices, values = 'close', index='time', columns = 'symbol').reset_index() slices_df = slices_df.drop(columns=['time']) slices_df.columns = [SymbolCache.GetTicker(x) for x in slices_df.columns] returns = slices_df.pct_change() ''' # for debugging #self.Debug(self.Time) #self.Debug(returns.shape) # weights calculation vol_weights = self.get_srp_weights(returns, self.vol_lookback) cor_adjust = self.get_cor_adjustments(returns, self.corr_lookback) cor_adjust_weights = self.adjust_weights(vol_weights, cor_adjust, shrinkage=1) momo_adjusted_weights = self.get_momo_adjusted_weights(returns, cor_adjust_weights, self.formation_periods, self.z_score_cutoff, self.momo_multiplier) # the following should contain asset EMB instead of EEM capped_weights = self.cap_allocation_and_rescale(momo_adjusted_weights, ticker="EMB", cap=0.15) # the following should VTI and PUTW but I don't know how to handle yet final_weights = self.split_allocation(capped_weights, "VTI", "PUTW", ratio=0.5) self.Debug(final_weights.shape) self.Debug(self.Time) self.Debug(final_weights) # allocating assets for i in range(len(final_weights)): self.Log("{} : asset {}, allocating {}".format(self.Time, slices_df.columns[i], final_weights[i])) self.SetHoldings(slices_df.columns[i], final_weights[i]) def get_srp_weights(self, returns, vol_lookback): """ returns current srp werights given a pandas DataFrame of returns and a vol_lookback period """ n_assets = len(returns.columns) vols = returns.iloc[-vol_lookback:, :].apply(lambda x: np.std(x)*np.sqrt(252), axis=0) raw_weights = 1/vols weights = raw_weights/np.sum(raw_weights) return weights def get_cor_adjustments(self, returns, corr_lookback): """ returns current correlation adjustments given a pandas DataFrame of returns and a corr_lookback period """ cor = returns.iloc[-corr_lookback:, :].corr() pairwise_ave_cor = cor.mean(axis=1) zscore_pairwise_ave_cor = (pairwise_ave_cor - pairwise_ave_cor.mean())/pairwise_ave_cor.std() gauss_scale = 1 - norm.cdf(zscore_pairwise_ave_cor, 0, 1) raw_adjustments = gauss_scale/gauss_scale.sum() norm_adjustments = raw_adjustments - 1./len(returns.columns) return norm_adjustments def adjust_weights(self, vol_weights, corr_adjustments, shrinkage): raw_weights = vol_weights * (1 +corr_adjustments * shrinkage) adj_weights = raw_weights/raw_weights.sum() return adj_weights def get_momo_adjustments(self, returns, formation_period): """ returns current cross-sectional zscore of total return momentum given a pandas DataFrame of returns and formation_period """ synth_prices = (returns+1).cumprod() roc = (synth_prices.iloc[-1,:]/synth_prices.iloc[-formation_period-1,:]-1) momo_adjustments = (roc - roc.mean())/roc.std() return momo_adjustments def get_sma_slope_adjustments(self, returns, formation_period): """ returns current cross-sectional zscore of slope of moving average given a pandes DataFrame of returns and a formation_period """ synth_prices = (returns+1).cumprod() sma = synth_prices.iloc[-formation_period-1:,:].rolling(formation_period).mean() sma_slope = (sma.iloc[-1,:]/sma.iloc[-2,:])-1 momo_adjustments = (sma_slope - sma_slope.mean())/sma_slope.std() return momo_adjustments def adjust_momo_weights(self, base_weights, momo_adjustments, z_score_cutoff, multiplier): raw_weights = base_weights * (1 + ((momo_adjustments >= z_score_cutoff) * multiplier)) adj_weights = raw_weights/raw_weights.sum() return adj_weights def get_momo_adjusted_weights(self, returns, base_weights, formation_periods, z_score_cutoff, multiplier): """ returns current momentum-adjusted weights given a pandes DataFrame of returns and a formation_period """ momo_weights = base_weights for period in formation_periods : momo_adjustments = self.get_momo_adjustments(returns, period) momo_weights = self.adjust_momo_weights(momo_weights, momo_adjustments, z_score_cutoff, multiplier) for period in formation_periods : momo_adjustments = self.get_sma_slope_adjustments(returns, period) momo_weights = self.adjust_momo_weights(momo_weights, momo_adjustments, z_score_cutoff, multiplier) return momo_weights def cap_allocation_and_rescale(self, weights, ticker, cap=0.15): """ cap the allocation into ticker and rescale remaining weights """ if weights[ticker] > cap: weights = (1-cap)*weights.drop(ticker)/weights.drop(ticker).sum() weights[ticker] = cap return weights def split_allocation(self, weights, ticker, split_ticker, ratio=0.5): """ split the allocation into ticker into ticker and split_ticker according to ratio """ weights[split_ticker] = (1-ratio)*weights[ticker] weights[ticker] = ratio*weights[ticker] #global tradeable_universe #if split_ticker not in tradeable_universe: # tradeable_universe.append(split_ticker) return weights class IGLN(PythonData): '''IGLN Custom Data Class''' def GetSource(self, config, date, datafeed): #return SubscriptionDataSource(source, SubscriptionTransportMedium.Rest); return SubscriptionDataSource("https://www.dropbox.com/s/s9a65ecegg8kvu0/IGLN.csv?dl=1", SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, datafeed): if not (line.strip() and line[0].isdigit()): return None # New GoldPhys object igln1 = IGLN() igln1.Symbol = config.Symbol try: # Example File Format: # Date, Open High Low Close Volume # 2011-09-13 7792.9 7799.9 7722.65 7748.7 116534670 data = line.split(',') igln1.Time = datetime.strptime(data[0], "%Y-%m-%d") igln1.Value = data[4] igln1["Open"] = float(data[1]) igln1["High"] = float(data[2]) igln1["Low"] = float(data[3]) igln1["Close"] = float(data[4]) except ValueError: # Do nothing return None return IGLN class IDTL(PythonData): '''IDTL Custom Data Class''' def GetSource(self, config, date, datafeed): return SubscriptionDataSource("https://www.dropbox.com/s/ac9sc2e6px754k5/IDTL.csv?dl=1", SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, datafeed): if not (line.strip() and line[0].isdigit()): return None # New Treas20 object idtl1 = IDTL() idtl1.Symbol = config.Symbol try: # Example File Format: # Date, Open High Low Close Volume # 2011-09-13 7792.9 7799.9 7722.65 7748.7 116534670 data = line.split(',') idtl1.Time = datetime.strptime(data[0], "%Y-%m-%d") idtl1.Value = data[4] idtl1["Open"] = float(data[1]) idtl1["High"] = float(data[2]) idtl1["Low"] = float(data[3]) idtl1["Close"] = float(data[4]) except ValueError: # Do nothing return None return IDTL class VDNR(PythonData): '''VDNR Custom Data Class''' def GetSource(self, config, date, datafeed): return SubscriptionDataSource("https://www.dropbox.com/s/pqwv2psx3qeysl1/VDNR.csv?dl=1", SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, datafeed): if not (line.strip() and line[0].isdigit()): return None # New VanSPY object vdnr1 = VDNR() vdnr1.Symbol = config.Symbol try: # Example File Format: # Date, Open High Low Close Volume # 2011-09-13 7792.9 7799.9 7722.65 7748.7 116534670 data = line.split(',') vdnr1.Time = datetime.strptime(data[0], "%Y-%m-%d") vdnr1.Value = data[4] vdnr1["Open"] = float(data[1]) vdnr1["High"] = float(data[2]) vdnr1["Low"] = float(data[3]) vdnr1["Close"] = float(data[4]) except ValueError: # Do nothing return None return vdnr1 class VWO(PythonData): '''VWO Custom Data Class''' def GetSource(self, config, date, datafeed): return SubscriptionDataSource("https://www.dropbox.com/s/tzk1e1h09a5etq4/VWO.csv?dl=1", SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, datafeed): if not (line.strip() and line[0].isdigit()): return None # New VanSPY object vwo1 = VWO() vwo1.Symbol = config.Symbol try: # Example File Format: # Date, Open High Low Close Volume # 2011-09-13 7792.9 7799.9 7722.65 7748.7 116534670 data = line.split(',') vwo1.Time = datetime.strptime(data[0], "%Y-%m-%d") vwo1.Value = data[4] vwo1["Open"] = float(data[1]) vwo1["High"] = float(data[2]) vwo1["Low"] = float(data[3]) vwo1["Close"] = float(data[4]) except ValueError: # Do nothing return None return vwo1 class TLT(PythonData): '''TLT Custom Data Class''' def GetSource(self, config, date, datafeed): return SubscriptionDataSource("https://www.dropbox.com/s/8shi6ow4be3dzz9/TLT.csv?dl=1", SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, datafeed): if not (line.strip() and line[0].isdigit()): return None # New VanSPY object tlt1 = TLT() tlt1.Symbol = config.Symbol try: # Example File Format: # Date, Open High Low Close Volume # 2011-09-13 7792.9 7799.9 7722.65 7748.7 116534670 data = line.split(',') tlt1.Time = datetime.strptime(data[0], "%Y-%m-%d") tlt1.Value = data[4] tlt1["Open"] = float(data[1]) tlt1["High"] = float(data[2]) tlt1["Low"] = float(data[3]) tlt1["Close"] = float(data[4]) except ValueError: # Do nothing return None return tlt1 class VNQI(PythonData): '''VNQI Custom Data Class''' def GetSource(self, config, date, datafeed): return SubscriptionDataSource("https://www.dropbox.com/s/0b96784rc8b8zh3/VNQI.csv?dl=1", SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, datafeed): if not (line.strip() and line[0].isdigit()): return None # New VanSPY object vnqi1 = VNQI() vnqi1.Symbol = config.Symbol try: # Example File Format: # Date, Open High Low Close Volume # 2011-09-13 7792.9 7799.9 7722.65 7748.7 116534670 data = line.split(',') vnqi1.Time = datetime.strptime(data[0], "%Y-%m-%d") vnqi1.Value = data[4] vnqi1["Open"] = float(data[1]) vnqi1["High"] = float(data[2]) vnqi1["Low"] = float(data[3]) vnqi1["Close"] = float(data[4]) except ValueError: # Do nothing return None return vnqi1 class PUTW(PythonData): '''PUTW Custom Data Class''' def GetSource(self, config, date, datafeed): return SubscriptionDataSource("https://www.dropbox.com/s/ovqzyz5l91524f8/PUTW.csv?dl=1", SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, datafeed): if not (line.strip() and line[0].isdigit()): return None # New VanSPY object putw1 = PUTW() putw1.Symbol = config.Symbol try: # Example File Format: # Date, Open High Low Close Volume # 2011-09-13 7792.9 7799.9 7722.65 7748.7 116534670 data = line.split(',') putw1.Time = datetime.strptime(data[0], "%Y-%m-%d") putw1.Value = data[4] putw1["Open"] = float(data[1]) putw1["High"] = float(data[2]) putw1["Low"] = float(data[3]) putw1["Close"] = float(data[4]) except ValueError: # Do nothing return None return putw1 class EMB(PythonData): '''EMB Custom Data Class''' def GetSource(self, config, date, datafeed): return SubscriptionDataSource("https://www.dropbox.com/s/o4qjcj586woc7m1/EMB.csv?dl=1", SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, datafeed): if not (line.strip() and line[0].isdigit()): return None # New VanSPY object emb1 = EMB() emb1.Symbol = config.Symbol try: # Example File Format: # Date, Open High Low Close Volume # 2011-09-13 7792.9 7799.9 7722.65 7748.7 116534670 data = line.split(',') emb1.Time = datetime.strptime(data[0], "%Y-%m-%d") emb1.Value = data[4] emb1["Open"] = float(data[1]) emb1["High"] = float(data[2]) emb1["Low"] = float(data[3]) emb1["Close"] = float(data[4]) except ValueError: # Do nothing return None return emb1 class VTI(PythonData): '''VTI Custom Data Class''' def GetSource(self, config, date, datafeed): return SubscriptionDataSource("https://www.dropbox.com/s/mg222g0ykrhk6ul/VTI.csv?dl=1", SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, datafeed): if not (line.strip() and line[0].isdigit()): return None # New VanSPY object vti1 = VTI() vti1.Symbol = config.Symbol try: # Example File Format: # Date, Open High Low Close Volume # 2011-09-13 7792.9 7799.9 7722.65 7748.7 116534670 data = line.split(',') vti1.Time = datetime.strptime(data[0], "%Y-%m-%d") vti1.Value = data[4] vti1["Open"] = float(data[1]) vti1["High"] = float(data[2]) vti1["Low"] = float(data[3]) vti1["Close"] = float(data[4]) except ValueError: # Do nothing return None return vti1 class SPY(PythonData): '''SPY Custom Data Class''' def GetSource(self, config, date, datafeed): return SubscriptionDataSource("https://www.dropbox.com/s/5e9eon88l91nxge/SPY.csv?dl=1", SubscriptionTransportMedium.RemoteFile) def Reader(self, config, line, date, datafeed): if not (line.strip() and line[0].isdigit()): return None # New VanSPY object spy1 = SPY() spy1.Symbol = config.Symbol try: # Example File Format: # Date, Open High Low Close Volume # 2011-09-13 7792.9 7799.9 7722.65 7748.7 116534670 data = line.split(',') spy1.Time = datetime.strptime(data[0], "%Y-%m-%d") spy1.Value = data[4] spy1["Open"] = float(data[1]) spy1["High"] = float(data[2]) spy1["Low"] = float(data[3]) spy1["Close"] = float(data[4]) except ValueError: # Do nothing return None return spy1