извлечь фрейм данных из pandas datafeed в backtrader - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть канал данных моего бандер-пандера, созданный и переданный через:

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'

какие-нибудь подсказки?

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

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 и не предназначен для использования как единое целое.Вы всегда можете нарезать нужные строки и создать из них Dataframe или Series.

См. Документация Backtrader - Концепции платформы и Раздел: нарезка

0 голосов
/ 20 ноября 2018

Из нескольких источников я узнал, что backtrader не поддерживает (и не собирается) поддерживать расчеты с пандами данных.

Вот метод преобразования 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)

надеюсь, это поможет

0 голосов
/ 15 ноября 2018

AttributeError: 'Lines_LineSeries_DataSeries_OHLC_OHLCDateTime_Abst' объект не имеет атрибута 'min'

это означает, что вы пытаетесь получить минимум объекта или объектов Abst

причина этой проблемы может быть

У вас, вероятно, есть учетная запись 2.0, и код не может получить подробности контракта с сервера. Вам нужен старый аккаунт.

qutoe from: ссылка для возврата

так что решение найти правильную серию, чтобы получить мин

minr = datas ["что-то другое"]. Min ()

если вы можете предоставить образец данных, я могу помочь подробно

или, если вы действительно хотите отсортировать дату и время, вы всегда можете сначала попытаться преобразовать его в метку времени Unix

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...