1

当我尝试将数据摄取到 zipline 包中时,因为我无法获得一分钟的数据,而只有 5 分钟的 klines 数据。看起来标准的 zipline 不支持它?引用自http://www.zipline.io/bundles.html

摄取(环境,asset_db_writer,minute_bar_writer,daily_bar_writer,adjustment_writer,日历,start_session,end_session,缓存,show_progress,output_dir)

minute_bar_writer minute_bar_writer 是 BcolzMinuteBarWriter 的一个实例。此编写器用于将数据转换为 zipline 的内部 bcolz 格式,以便稍后由 BcolzMinuteBarReader 读取。如果提供了分钟数据,用户应该使用 (sid, dataframe) 元组的可迭代调用 write()。show_progress 参数也应该转发给这个方法。如果数据源不提供分钟级数据,则无需调用write方法。将一个空的迭代器传递给 write() 以表示没有分钟数据也是可以接受的。

无论如何,我使用此界面将 5 分钟 klines 摄取到 zipline 中。但是当我调用 run_algorithm 时,无论我输入什么 data_frequency,它都会提示错误。

data = run_algorithm(start=start,
                     end=end,
                     initialize=initialize,
                     capital_base=100000,
                     handle_data=handle_data,
                     bundle="poloniex_csv",
                     data_frequency='60min',
                     trading_calendar=PoloniexExchangeCalendar())

AssertionError:所有读者必须共享目标 trading_calendar。Reader= for type= 使用 calendar= 与所需的共享日历不匹配=

如何解决这个问题?例如让 BcolzMinuteBarReader 支持 5minutes 数据。我可以处理 zipline handle_data 函数中的 5 分钟数据。谢谢!

4

1 回答 1

0

对此的答案是,PoloniexExchangeCalendar()在这里不应直接使用日历类,而是应该调用get_calendar(calendar_name)以从日历工厂获取日历的实例。理论上,这将保证框架只使用一个日历实例,因此该行

assert trading_calendar == r.trading_calendar

在 dispatch_bar_reader.py 中总是会解析为 true。就我而言,出于某种原因,即使 usingget_calendar(calendar_name)还不够充分,而且我正在比较同一日历类的两个不同实例,这不可避免地会解析为False. 因此我得到了同样的错误。我通过在自定义日历类中添加以下行来让我的日历类实现自己的相等比较来解决这个问题

__hash__ = ExchangeCalendar.__hash__

def __eq__(self, other):
    return all(self.all_sessions == other.all_sessions) if isinstance(other, CoinbaseExchangeCalendar) else False

通过绕过比较两个实例的技术细节,这对我起到了作用,但不可否认的是,实际上并没有弄清楚为什么get_calendar(cal_name)不返回自定义日历类的单例实例。

于 2022-02-14T08:30:01.890 回答