如何使用 ccxt 为 backtrader 创建 pandasData

问题描述

我正在尝试使用 backTrader 对策略进行回溯测试。我所看到的大多数示例都只使用了 csv 文件。我想知道是否可以从交易所获取数据并将其转换为 Pandas 数据帧,然后使用 backTrader?当我运行它时,我收到一个错误 AttributeError: 'numpy.int64' object has no attribute 'lower',它指的是 pandafeed.py

import ccxt,os
from dotenv import load_dotenv
import backTrader

class Trader:
    def __init__(self) -> None:
        load_dotenv()
        self.connect()

    """ Creates Binance client """
    def connect(self):
        self.exchange = ccxt.binance({
            'apiKey': os.getenv('BINANCE_API_KEY'),'secret': os.getenv('BINANCE_API_SECRET')
        })

klines = Trader().exchange.fetch_ohlcv(symbol=Trading_pair,timeframe=interval)
dataFrame = pd.DataFrame(klines)
dataFrame[0] = [datetime.fromtimestamp(t/1000) for t in dataFrame[0]]
data = backTrader.Feeds.PandasData(dataname=dataFrame)

cerebro = backTrader.Cerebro()
cerebro.broker.set_cash(10000)
cerebro.adddata(data)
cerebro.run()

如果我使用列名并将代码更改为以下内容

colums = ['datetime','open','high','low','close','volume']
dataFrame = pd.DataFrame(klines,columns=colums)
dataFrame["datetime"] = [datetime.fromtimestamp(t/1000) for t in dataFrame["datetime"]]
data = backTrader.Feeds.PandasData(dataname=dataFrame)

我收到此错误

AttributeError: 'int' 对象没有属性 'to_pydatetime'

pandafeed.py

我的问题是: 如何将列表转换为可用于运行 backTrader 的内容?谢谢。

附言klines 返回的示例数据结构类似于

[ [1621152000000,49375.28,49795.89,48656.0,49014.99,10956.006583],[1621166400000,49249.06,47566.01,47727.26,14166.961995],[1621180800000,48097.59,44444.44,45549.26,36819.653456],[1621195200000,45553.24,46480.0,43825.39,46431.5,28724.055984],[1621209600000,46426.83,46686.0,42777.0,42915.46,28171.858447],[1621224000000,45400.0,42196.97,45149.18,40557.45817],[1621238400000,45143.28,45800.0,44291.84,45731.39,23851.50751],[1621252800000,45733.55,45791.04,43156.0,43362.75,23137.989315],[1621267200000,43357.0,44400.0,42001.0,44197.73,30883.162039],[1621281600000,44939.2,42500.0,43538.04,20055.197255],[1621296000000,43538.02,45281.34,43150.79,44779.83,19252.919453],[1621310400000,44774.78,45799.29,44738.26,45172.7,17218.430549],[1621324800000,45172.69,45420.0,44607.08,45225.71,8427.020047] ]

解决方法

我认为 backtrader 正在尝试读取没有标题的标题。尝试告诉 PandasData 没有标题。请参阅docs

data = backtrader.feeds.PandasData(dataname=dataFrame,header=None)
,

我遇到了同样的问题,在调试之后我发现它附加了,因为 backtrader 期望您的数据框按日期时间(以使其简单)建立索引。 然后要解决它,只需添加到您的代码中:

...
dataFrame = dataFrame.set_index('datetime')
...

就我而言,我还必须更改“日期时间”字段的类型,我这样做了:

...
dataFrame["datetime"] = dataFrame["datetime"].values.astype(dtype='datetime64[ms]')
dataFrame = dataFrame.set_index('datetime')
...

我希望这对您有所帮助,即使您在 2 个月前问过这个问题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...