TypeError: super(type, obj): obj must be an instance or subtype of type
-
Hello, I'm starting to use Backtrader library. I had code some lines to download data from Yahoo Finance and add to cerebro.
But when I run the code I have this error, how can I fix it?start = datetime.datetime(2014, 1, 1) end = datetime.datetime(2019, 3, 1) df = data.get_data_yahoo('UBI.MI', start, end) df.to_csv('/Users/giovannicaridi/.spyder-py3/UBI.csv') if __name__ == '__main__': cerebro = bt.Cerebro() cerebro.addstrategy(Cross_Medie) modpath = os.path.basename(os.path.abspath(sys.argv[0])) datapath = os.path.join(modpath,'/Users/giovannicaridi/.spyder-py3/UBI.csv') data = bt.feeds.YahooFinanceData( dataname = datapath, fromdate = datetime.datetime(2015,1,1), todate = datetime.datetime(2018,12,31), reverse=False) File "/Users/giovannicaridi/opt/anaconda3/lib/python3.7/sitepackages/backtrader/feeds/yahoo.py", line 94, in start super(YahooFinanceCSVData, self).start() TypeError: super(type, obj): obj must be an instance or subtype of type
Thanks for you support
Regards,
Giovanni -
Read about it here. You can do it just like in this.
data = bt.feeds.YahooFinanceData( dataname="FB", fromdate=datetime.datetime(2020, 1, 1), todate=datetime.datetime(2020, 6, 30), reverse=False)
-
@run-out I changed my code but same error occured:
if __name__ == '__main__': # Inizializzo istanza Cerebro cerebro = bt.Cerebro() # Aggiungo una strategia cerebro.addstrategy(Cross_Medie) # Inizializzo il file (inserisco i dati storici mettendo il percorso completo del file modpath = os.path.basename(os.path.abspath(sys.argv[0])) # Salvo i dati nella variabile data (Create a Data Feed) data = bt.feeds.YahooFinanceData( dataname = "FB", fromdate = datetime.datetime(2015,1,1), # Do not pass values before this date todate = datetime.datetime(2018,12,31), # Do not pass values after this date reverse=False) # Aggiungiamo i dati a Cerebro cerebro.adddata(data) # Imposto il portafoglio depositando il capitale iniziale capitale_iniziale = 100000 cerebro.broker.setcash(capitale_iniziale) # Imposto il numero di azioni che traderò cerebro.addsizer(bt.sizers.FixedSize, stake=1000) # Imposto il valore delle commissioni cerebro.broker.setcommission(commission=0.0002) # Stampo le condizioni iniziali print('Valore iniziale Portafoglio: %.2f' % cerebro.broker.getvalue()) # Avvio l'instanza (il programma) cerebro.run() # Stampo le condizioni finali print('Valore del Portafoglio iniziale: %.2f' % cerebro.broker.getvalue()) cerebro.broker.getvalue()
-
I lifted your code;
data = bt.feeds.YahooFinanceData( dataname = "FB", fromdate = datetime.datetime(2015,1,1), # Do not pass values before this date todate = datetime.datetime(2018,12,31), # Do not pass values after this date reverse=False)
verbatum into my module and it works. So this means your setup must be missing something.
I had a look at the backtrader class for
bt.feeds.YahooFinanceData
and it indicates you must have the request library installed.except ImportError:
msg = ('The new Yahoo data feed requires to have the requests '
'module installed. Please use pip install requests or '
'the method of your choice')Have a look to see if you have requests installed.
-
@run-out said in TypeError: super(type, obj): obj must be an instance or subtype of type:
YahooFinanceData
I have these setting:
pip install backtrader
from future import (absolute_import, division, print_function,unicode_literals)
import backtrader as bt
import backtrader.indicators as btind
import backtrader.analyzers as btanalyzers
import datetime # For datetime objects
import os.path # To manage paths
import sys # To find out the script name (in argv[0])import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
pd.core.common.is_list_like = pd.api.types.is_list_like
from pandas_datareader import data, wb
import yfinance as yf
import datetime -
I run the code into Jupyter using CSV file saved after Yahoo importing but no trades happened, porfolio values before and after the test is egual and no print out appear:
class Cross_Medie(bt.Strategy): params = (('Med_vel',50), ('Med_len', 100)) # Inizializzo le due medie def __init__(self): self.sma_vel = btind.SMA(period = self.p.Med_vel) self.sma_len = btind.SMA(period = self.p.Med_len) # Definisco il segnale di acquisto/vendita self.buysig = btind.CrossOver(self.sma_vel, self.sma_len) # Salvo i dati di closing (self.datas[0] è l'orologio del sistema, # utile per verificare se una candela in chiusura rompre una media/indicatore) # Keep a reference to the "close" line in the data[0] dataseries self.dataclose = self.datas[0].close def next(self): if self.position.size: # verifico se sono in posizione if self.buysig < 0: # vuol dire che sono dentro long (incrocio a ribasso) self.close() # chiudo la posizione esistente self.sell() elif self.buysig > 0: # vuol dire che sono dentro short (incrocio a rialzo) self.close() # chiudo la posizione esistente self.buy() else: # non sono in posizione if self.buysig > 0: # segnale positivo self.buy() # acquisto elif self.buysig < 0: # segnale negativo self.sell() # vendo def stampa(self, txt, dt=None): dt = dt or self.datas[0].datetime.date(0) print('%s, %s' % (dt.isoformat(), txt)) def notify_order(self, order): if order.status in [order.Submitted, order.Accepted]: # ordine acquisto/vendita accettato return # Verifica se ordine completato if order.status in [order.Completed]: if order.isbuy(): # Stampo dettaglio di quantità, prezzo e commissioni self.stampa('ACQ ESEGUITO, QTY: %.2f, PREZZO: %.2f, COSTO: %.2f, COMM: %.2f') % (order.executed.size,order.executed.price,order.executed.comm)) self.buyprice = order.executed.price self.buycomm = order.executed.comm else: # Vendita self.stampa('VEND ESEGUITA, QTY: %.2f, PREZZO: %.2f, COSTO: %.2f, COMM: %.2f') % (order.executed.size,order.executed.price,order.executed.comm)) self.bar_executed = len(self) elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.stampa('Ordine Cancellato') self.order = None def notify_trade(salef, trade): if not trade.isclosed: return self.stampa('PROFITTO OPERAZIONE, LORDO %.2f, NETTO %.2f' % (trade.pnl, trade.pnlcomm)) dataAAPL = yf.download("AAPL", start="2015-01-01", end="2019-04-30") dataAAPL.to_csv('/Users/giovannicaridi/.spyder-py3/AAPL.csv')
if __name__ == '__main__': # Inizializzo istanza Cerebro cerebro = bt.Cerebro() # Aggiungo una strategia cerebro.addstrategy(Cross_Medie) # Inizializzo il file (inserisco i dati storici mettendo il percorso completo del file modpath = os.path.basename(os.path.abspath(sys.argv[0])) datapath = os.path.join(modpath, '/Users/giovannicaridi/.spyder-py3/AAPL.csv') # Salvo i dati nella variabile data (Create a Data Feed) data = bt.feeds.YahooFinanceData( dataname = datapath, fromdate = datetime.datetime(2016,1,1), # Do not pass values before this date todate = datetime.datetime(2018,12,31), # Do not pass values after this date reverse=False) # Aggiungiamo i dati a Cerebro cerebro.adddata(data) capitale_iniziale = 100000 cerebro.broker.setcash(capitale_iniziale) # Imposto il numero di azioni che traderò cerebro.addsizer(bt.sizers.FixedSize, stake=1000) # Imposto il valore delle commissioni cerebro.broker.setcommission(commission=0.0002) # Stampo le condizioni iniziali print('Valore iniziale Portafoglio: %.2f' % cerebro.broker.getvalue()) cerebro.run() # Stampo le condizioni finali print('Valore del Portafoglio finale: %.2f' % cerebro.broker.getvalue()) cerebro.broker.getvalue()
[100%**] 1 of 1 completed
Valore iniziale Portafoglio: 100000.00
Valore del Portafoglio finale: 100000.00 -
I tried now to re-run and appear this error:
File "<tokenize>", line 140
dataname = datapath,
^
IndentationError: unindent does not match any outer indentation level -
@Giovanni-Caridi said in TypeError: super(type, obj): obj must be an instance or subtype of type:
if name == 'main':
After the if name == 'main': line, you must indent all of the following code by 4 spaces.
-
@run-out Done, but I have this output:
[100%**] 1 of 1 completed
Valore iniziale Portafoglio: 100000.00
Valore del Portafoglio finale: 100000.00No print out, no trades happened..
-
In Spyder I have the same initial error:
File "/Users/giovannicaridi/opt/anaconda3/lib/python3.7/site-packages/backtrader/feeds/yahoo.py", line 94, in start
super(YahooFinanceCSVData, self).start()TypeError: super(type, obj): obj must be an instance or subtype of type
-
This could be the solution?
In Python 3, using the new
super().__init__()
instead ofsuper(Derived, self).__init__()
solves the problem.
Source: https://stackoverflow.com/a/52898473/2476373