从backtrader中的pandas datafeed提取数据帧

时间:2018-11-15 14:26:44

标签: python pandas

我创建并通过以下方式传入了我的熊猫回传者数据供稿:

data = bt.feeds.PandasData(dataname= **my_data.candles_to_backtrader(pandas))
cerebro.adddata(data)

我正在创建一个新的indicator,需要从dataframe撤回data feed

或实际上只对数据执行minmax之类的操作。

在我的指标中,我有:

def next(self):
    ...
    minr = datas[0].min()
    ...

这不起作用,提到:

AttributeError: 'Lines_LineSeries_DataSeries_OHLC_OHLCDateTime_Abst' object has no attribute 'min'
有什么线索吗?

3 个答案:

答案 0 :(得分:0)

backtrader 不是pandas,因此不被认为是Dataframe

根据您的示例:

def next(self):
    ...
    minr = datas[0].min()
    ...

实际上应该是self.datas[0]甚至更好的self.data0self.data,这可以简化事情,但这不是重点。

关键点在这里

    minr = datas[0].min()

第一:

  • 当您指的是self.datas[0]时,您指的是close的价格。为什么?因为该行业很久以前就解决了这一问题,而且还可以开发不必引用特定字段的通用指标(当您在 Indicators 上具有 Indicators Indicators 很明显,通用是要走的路)

第二:

  • 您显然要求的是已完成的全部系列的最小值。

    设想的指标具有回溯期,并且(通常,但您可能)不回头看整个系列。

第三:

  • 即使您使用Dataframe作为输入, backtrader 在内部也不适用此结构(这是有意识的设计决策),并且每个构成价格的元素条形图或指标的输出是单独的数组。

不。 backtrader 不是Dataframe,并且不能用作一个。您始终可以对所需的进行切片,并根据它们创建一个DataframeSeries

请参阅: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对象的最小值

此问题的原因可能是

  

您可能有一个2.0帐户,并且代码无法从服务器接收合同明细。您需要一个旧帐户。

来自:backtrader link

的Qutoe

所以解决方案是找到正确的序列以获得最小值

  

minr = datas [“ something different”]。min()

如果您可以提供数据示例,我可以提供详细信息

或者如果您真的想对datetime进行排序,那么您始终可以先尝试将其转换为unix时间戳