问题描述
我正在尝试使用 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'
我的问题是: 如何将列表转换为可用于运行 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 个月前问过这个问题。