我创建并通过以下方式传入了我的熊猫回传者数据供稿:
data = bt.feeds.PandasData(dataname= **my_data.candles_to_backtrader(pandas))
cerebro.adddata(data)
我正在创建一个新的indicator
,需要从dataframe
撤回data feed
或实际上只对数据执行min
,max
之类的操作。
在我的指标中,我有:
def next(self):
...
minr = datas[0].min()
...
这不起作用,提到:
AttributeError: 'Lines_LineSeries_DataSeries_OHLC_OHLCDateTime_Abst' object has no attribute 'min'
有什么线索吗?
答案 0 :(得分:0)
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
的价格。为什么?因为该行业很久以前就解决了这一问题,而且还可以开发不必引用特定字段的通用指标(当您在 Indicators 上具有 Indicators Indicators 很明显,通用是要走的路)第二:
您显然要求的是已完成的全部系列的最小值。
设想的指标具有回溯期,并且(通常,但您可能)不回头看整个系列。
第三:
Dataframe
作为输入, backtrader 在内部也不适用此结构(这是有意识的设计决策),并且每个构成价格的元素条形图或指标的输出是单独的数组。不。 backtrader 不是Dataframe
,并且不能用作一个。您始终可以对所需的行进行切片,并根据它们创建一个Dataframe
或Series
。
请参阅:Backtrader Documentation - Platform Concepts和以下部分:切片
答案 1 :(得分:0)
我从多个来源得知,backtrader不(也不打算)支持pandas数据框的计算。
这是将self.datas[0]
转换为熊猫数据帧并传递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)
希望这会有所帮助
答案 2 :(得分:-1)
AttributeError:“ Lines_LineSeries_DataSeries_OHLC_OHLCDateTime_Abst” 对象没有属性“ min”
这意味着您正在尝试获取一个或多个Abst对象的最小值
此问题的原因可能是
的Qutoe您可能有一个2.0帐户,并且代码无法从服务器接收合同明细。您需要一个旧帐户。
所以解决方案是找到正确的序列以获得最小值
minr = datas [“ something different”]。min()
如果您可以提供数据示例,我可以提供详细信息
或者如果您真的想对datetime进行排序,那么您始终可以先尝试将其转换为unix时间戳