0

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?

StaEx_G
  • 1
  • 3

0 Answers0