从backtrad中的pandas datafeed中提取数据帧

2024-09-30 14:33:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了pandas backtrader数据源并通过以下方式传入:

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

我正在创建一个新的indicator,它需要从data feed中取出{}

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

在我的指标中我有:

^{pr2}$

这是行不通的,提到:

AttributeError: 'Lines_LineSeries_DataSeries_OHLC_OHLCDateTime_Abst' object has no attribute 'min'

有什么线索吗?在


Tags: topandasdatamy方式min数据源bt
3条回答

backtrader不是pandas,也不被认为是Dataframe。在

从你的例子来看:

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

它实际上应该是self.datas[0]或更好的self.data0或{},这简化了事情,但这不是重点。在

关键点在这里

^{pr2}$

第一个:

  • 当你指的是self.datas[0]并用它做某事时,你指的是close价格。为什么?因为这个行业很久以前就解决了这个问题,而且它还可以开发不必引用特定领域的通用指标(当你有指标关于指标的指标时,很明显,通用性才是必由之路)

第二:

  • 显然,你要求的是整个系列的最低要求。在

    所设想的指标有一个回溯期,不需要(通常,但你可以)回顾整个系列。

第三:

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

不。backtrader不是一个Dataframe,也不打算作为一个。您总是可以将所需的行分割为并从中创建一个Dataframe或{}。在

请参见:Backtrader Documentation - Platform Concepts和部分:切片

我从几个来源得到,backtrader不(也不会)支持pandas dataframe的计算。在

下面是将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],而{}可以是{}

希望这有帮助

AttributeError: 'Lines_LineSeries_DataSeries_OHLC_OHLCDateTime_Abst' object has no attribute 'min'

这意味着你试图得到一个或多个Abst对象的最小值

可能是这个问题的原因

You probably have a 2.0 account and the code is failing to receive the contractdetails from the server. You need a legacy account.

来自:backtrader link

所以解决方法是找到正确的级数,得到最小值

minr = datas["something different"].min()

如果你能提供数据样本,我可以帮助细节

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

相关问题 更多 >