用Zipline回测国内数据

我们都知道zipline目前只能很好的支持国外市场,针对国内市场如何修改来进行回测,我看了一些文章来简单的说下自己的看法。

为什么不能支持国内市场

  • 数据:zipline自带的bundle都只支持国外数据,quandl只包含美国市场,而yahoo经过配置也只勉强下载到国内的数据
  • 交易日历:TrandingCalendar在zipline中和很多组件都相关联,如果日历不匹配那么回测的结果肯定是不正确的。zipline默认使用的是美国纽交所的交易日历,同时也提供了CME(芝加哥商品交易所),ICE(洲际交易所),us_futures(美国期货)等,但是同样都不适合国内的数据
  • 基准数据和国债利率曲线:zipline默认使用的美国标普500作为基准,显然无法使用国内市场

Databudle

对于如何更好的回测国内数据,我只针对第一部分databudle数据部分说一下自己的看法。
引入国内的数据源进行回测,有一下两种方案:
1. 不ingest数据源,直接在构建TradingAlgorithm时引入从csv或者数据库里读取的pd.Dataframe作为DataPortal的datasource
2. 自己定制data bundle,然后ingest

写一个新的bundle数据包,主要是ingest函数

ingest(environ,asset_db_writer,minute_bar_writer,daily_bar_writer,adjustment_writer,calendar,start_session,end_session,cache,show_progress,output_dir)
参数 作用
environ 代表环境变量的映射,如果需要一些额外的参数引入,可以在这里通过环境变量指定,如quandl的API key
asset_db_writer AssetDBWriter的实例,通过它的write函数可以把一个证券的基础信息,主要是码表名称起止日期等写入到数据库中,并且为每个证券分配一个sid作为唯一标识,这个sid在系统的其他地方也会成为股票的主要索引方式。默认保存在sqlite数据库中
daily_bar_writer 写入每日行情信息的BcolzDailyBarWriter的实例,通过调用write方法写入股票的开高低收和成交量等信息,这里的信息也需要使用sid与基本信息进行关联。默认使用bcolz的格式保存
minute_bar_writer 写入每分钟行情数据
adjustment_writer 处理一些拆分,合并,送股,分红等事件的信息。默认使用sqlite数据库
calendar 你当前使用的交易日历,数据的获取是以交易日历作为索引的
start_session/end_session 获取数据的起止日期
cache dataframe_cache的实例,你可以使用它来缓存在获取过程中的原始信息,在多次ingest的时候起到加速作用
show_progress 一个布尔值,是否显示ingest的过程,如果你的获取数据时间较长,可以判断show_progress变量来显示进度
output_dir data bundle的输出目录

其中最主要的是三个参数:
1. asset_db_writer 获取基础信息
2. daily_bar_writer/minute_bar_writer 写入行情信息:将数据转换为dataframe格式,index按日递增,cloumns为open、high、low、close、volume,writer可以将dataframe转换为zipline内部的bcolz格式进行保存。
3. adjuestment_writer 写入split,didividend信息

总结一下:用户可以讲任何本地的数据首先转换为DataFrame,其中index按日递增,columns分别为open、high、low、close、volume。然后讲DataFrame作为value,数据ticker为key来构建对应的Panel作为回测本地化的标准数据输入。

最后特别感谢这篇文章对zipline的详细讲解https://www.gitbook.com/book/rainx/-zipline

你可能感兴趣的:(量化交易,zipline,国内市场)