I'm trying to add all columns of a pandas dataframe into backtrader Cerebro. Without putting Cerebro into a class, everything was fine. I'm getting error when putting Cerebro into a class. Because Cerebro cannot pick class inside init, I put PandasExtend at the outside.
import backtrader as bt
import backtrader.feeds as btfeeds
import pandas as pd
import numpy as np
import os
def make_data(ticker):
data = pd.read_csv("data/" + ticker)
data = data.loc[:, ~data.columns.str.contains('^Unnamed')]
data = data.rename(columns = {"trade_date" : "Date"})
data['Date'] = data['Date'].astype(str)
data['Date'] = pd.to_datetime(data['Date'], format = "%Y%m%d")
data = data.set_index('Date')
data = data.apply(pd.to_numeric, errors = 'coerce')
return data
global_lines = []
global_params = []
data = pd.read_csv("data/data.csv")
for f in data.columns.to_list():
if not f in ['open', 'close', 'high', 'low', 'ts_code']:
global_lines.append(f)
global_params.append((f, -1))
class PandasExtend(btfeeds.PandasData):
lines = tuple(global_lines)
params = tuple(global_params)
class test:
def __init__(self):
data = make_data("data.csv")
data = PandasExtend(dataname = data)
cerebro = bt.Cerebro()
cerebro.adddata(data)
cerebro.broker.setcash(100000)
self.cerebro = cerebro
def run(self):
self.cerebro.strats.clear()
self.cerebro.analyzers.clear()
self.cerebro.optstrategy(strategy, a = [1,2,3])
self.cerebro.run()
class strategy(bt.Strategy):
params = dict(a = 10)
def __init__(self):
pass
def next(self):
pass
t = test()
t.run()
Error message:
Process SpawnPoolWorker-1956:
Process SpawnPoolWorker-1957:
Traceback (most recent call last):
Traceback (most recent call last):
File "/Users/gs/opt/anaconda3/lib/python3.9/multiprocessing/process.py", line 315, in _bootstrap
self.run()
File "/Users/gs/opt/anaconda3/lib/python3.9/multiprocessing/process.py", line 315, in _bootstrap
self.run()
File "/Users/gs/opt/anaconda3/lib/python3.9/multiprocessing/process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "/Users/gs/opt/anaconda3/lib/python3.9/multiprocessing/process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "/Users/gs/opt/anaconda3/lib/python3.9/multiprocessing/pool.py", line 114, in worker
task = get()
File "/Users/gs/opt/anaconda3/lib/python3.9/multiprocessing/pool.py", line 114, in worker
task = get()
File "/Users/gs/opt/anaconda3/lib/python3.9/multiprocessing/queues.py", line 367, in get
return _ForkingPickler.loads(res)
File "/Users/gs/opt/anaconda3/lib/python3.9/multiprocessing/queues.py", line 367, in get
return _ForkingPickler.loads(res)
AttributeError: Can't get attribute 'PandasExtend' on <module '__main__' (built-in)>
AttributeError: Can't get attribute 'PandasExtend' on <module '__main__' (built-in)>
Process SpawnPoolWorker-1958:
Traceback (most recent call last):
File "/Users/gs/opt/anaconda3/lib/python3.9/multiprocessing/process.py", line 315, in _bootstrap
...
task = get()
File "/Users/gs/opt/anaconda3/lib/python3.9/multiprocessing/queues.py", line 367, in get
return _ForkingPickler.loads(res)
AttributeError: Can't get attribute 'PandasExtend' on <module '__main__' (built-in)>
How to fix the error? Or is there any ways to add new columns without extending the class?