我创建了我的pandas backtrader数据,并通过以下方式传递:
data = bt.feeds.PandasData(dataname= **my_data.candles_to_backtrader(pandas))
cerebro.adddata(data)我正在创建一个新的indicator,它需要从data feed中取出dataframe
或者实际上只是对数据执行min、max等操作。
在我的指标中,我有:
def next(self):
...
minr = datas[0].min()
...这是不起作用的,提到:
AttributeError: 'Lines_LineSeries_DataSeries_OHLC_OHLCDateTime_Abst' object has no attribute 'min'有什么线索吗?
发布于 2018-11-21 02:27:15
我从几个来源得到,backtrader不(也不会)支持使用pandas数据帧进行计算。
下面是将self.datas[0]转换为pandas数据帧的方法,同时传入len(self),以支持正确的回测。
代码如下:
def __bt_to_pandas__(self, btdata, len):
get = lambda mydata: mydata.get(ago=0, size=len)
fields = {
'open': get(btdata.open),
'high': get(btdata.high),
'low': get(btdata.low),
'close': get(btdata.close),
'volume': get(btdata.volume)
}
time = [btdata.num2date(x) for x in get(btdata.datetime)]
return pd.DataFrame(data=fields, index=time)其中btdata可以是简单的self.datas[0],len可以是len(self)
希望这能有所帮助
发布于 2018-11-20 22:23:05
backtrader不是pandas,也不打算用作Dataframe。
从您的示例中可以看出:
def next(self):
...
minr = datas[0].min()
...它实际上应该是self.datas[0],甚至更好的self.data0或self.data,这简化了事情,但这不是重点。
关键点在这里
minr = datas[0].min()首先:
self.datas[0]并用它做一些事情时,你指的是close价格。为什么?因为这个行业很久以前就确定了这一点,而且它还支持开发不需要引用特定字段的通用指标(当您在指标上有指标时,很明显,通用化是可行的)第二:
所设想的指标有一个回顾周期,并且不会(通常,但你也可以)回顾整个系列。
第三:
Dataframe作为输入,backtrader在内部也无法使用此结构(这是有意识的设计决策),并且构成价格栏或指标输出的每个元素都是单独的数组。不是的。backtrader不是Dataframe,也不打算用作backtrader。您始终可以对所需的行进行切片,并根据它们创建Dataframe或Series。
发布于 2018-11-15 22:40:49
min对象:'Lines_LineSeries_DataSeries_OHLC_OHLCDateTime_Abst‘对象没有属性“
AttributeError”
这意味着您正在尝试获取一个或多个Abst对象的最小值
这个问题的原因可能是
您可能有一个2.0帐户,但代码无法从服务器接收到契约详细信息。您需要一个传统帐户。
qutoe来源:backtrader link
因此,解决方案是找到正确的级数来获得最小值
minr =datas“不同的东西”.min()
如果你能提供数据样本,我可以提供细节。
或者,如果您真的想对日期时间进行排序,您可以尝试先将其转换为unix时间戳。
https://stackoverflow.com/questions/53321608
复制相似问题