开源量化平台zipline之Data Bundles

Zipline中Data Bundles是指一组包含价格、调整(如分红送股,拆分合并等)及资产信息的数据集合。使用bundles我们可以将数据预先加载进zipline中,从而在以后的回测中可以直接使用。


data bundles

发现可用Bundles

Zipline有几个默认的bundles,同时你也可以注册建立自定义的bundles。
使用zipline bundles命令可以查看可用的bundles。

~$ zipline bundles
csvdir 
quandl 2018-07-29 14:12:49.799438
quantopian-quandl 

bundle名称后的时间戳信息表示数据注入的时间。

数据注入

在使用bundles的数据前,我们需要先行进行数据注入。Zipline默认bundle的存储路径在$ZIPLINE_ROOT/data/,注入过程可能会花费你一定时间,如果你使用默认的Quandlbundle,你需要去Quandl注册获取一个API_KEY。
使用zipline ingest命令进行注入。

$ QUANDL_API_KEY= zipline ingest -b  quandl

清理老数据

因为数据源可能不断在更新,多次注入后可能存在多份不同时间点的数据($ZIPLINE_ROOT/data/路径下,时间戳目录),可以使用zipline clean命令清理。

# 清理date前所有数据
$ zipline clean [-b ] --before 

# 清零date后所有数据
$ zipline clean [-b ] --after 

# 清理after~before的数据
$ zipline clean [-b ] --before  --after 

# 只保留最近num次的注入数据
$ zipline clean [-b ] --keep-last 

使用bundles进行回测

在执行回测时zipline run,可以使用--bundle参数指定bundles,
存在多个时间戳数据时,使用--bundle-timestamp指定

$ zipline run --bundle  --bundle-timestamp --algofile algo.py ...

自建Data Bundle

Zipline使用Data Bundles方式组织数据,使得我们可以轻松得整合不同数据源。自定义一个Data Bundle只需要实现一个ingest方法。
ingest方法负责将数据加载到内存,并传给各种writer来写入zipline,数据源可以来自quandl这种在线api,也可以来自本地的文件、数据库等。
zipline内部保证了注入过程的事务性,如果存在失败情况,不会导致数据最终的不一致性。

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
    environ是一个表示环境变量的map,这里传入了注入过程需要使用的环境变量,如在quandl注入时,就需要传入api_key的参数。
  • asset_db_writer
    asset_db_writer用于写入金融资产的元数据(存在时间区间,证券代码与zipline内部sid的映射),通常也包含名称、交易所及其他一些数据。将相关数据写入Dataframe后,调用write()方法写入。
  • minute_bar_writer
    minute_bar_writer可以将数据转换为zipline内部使用的bcolz格式文件。如果有分钟行情数据,需要循环调用将(sid,dataframe)的数据写入。show_progress参数会传入write方法。
  • daily_bar_writer
    daily_bar_writer用来写入每日收盘行情数据,与minute_bar_writer类似。
  • adjustment_writer
    adjustment_writer用来写入分拆合并、分红、送股等信息。
  • calendar
    canlendar表示交易日期,会影响某些日期计算。
  • start_session
    start_session 表示需要注入数据的起始时间。
  • end_session
    end_session 表示需要注入数据的结束时间。
  • cache
    防止注入失败后重复加载数据,重试时优先从cache中取。
  • show_progress
    表示是否需要给用户反馈进度
  • output_dir
    指定注入路径,为$ZIPLINE_ROOT下相对路径。

从csv文件导入数据

Zipline提供了一个名为csvdir的bundle,允许用户直接使用csv格式的文件导入数据。csv文件需要满足OHLCV(Open,High,Low, Close, Volumn)格式,同时也需要包含日期、分红及分拆信息,zipline/tests/resources/csvdir_samples路径提供了csv模板示例。

date,open,high,low,close,volume,dividend,split
2012-01-03,58.485714,58.92857,58.42857,58.747143,75555200,0.0,1.0
2012-01-04,58.57143,59.240002,58.468571,59.062859,65005500,0.0,1.0
2012-01-05,59.278572,59.792858,58.952858,59.718571,67817400,0.0,1.0
2012-01-06,59.967144,60.392857,59.888573,60.342857,79573200,0.0,1.0
2012-01-09,60.785713,61.107143,60.192856,60.247143,98506100,0.0,1.0
2012-01-10,60.844284,60.857143,60.214287,60.462856,64549100,0.0,1.0
2012-01-11,60.382858,60.407143,59.901428,60.364285,53771200,0.0,1.0

有了正确格式的csv文件后,需要修改~/.zipline/extension.py,同时需要引入csvdir与pandas。

import pandas as pd

from zipline.data.bundles import register
from zipline.data.bundles.csvdir import csvdir_equities

使用pandas指定起始结束时间

start_session = pd.Timestamp('2016-1-1', tz='utc')
end_session = pd.Timestamp('2018-1-1', tz='utc')

使用register()注册该bundle

register(
    'custom-csvdir-bundle',
    csvdir_equities(
        ['daily'],
        '/path/to/your/csvs',
    ),
    calendar_name='NYSE', # US equities
    start_session=start_session,
    end_session=end_session
)

下面就可以注入该csv数据文件。

$ zipline ingest -b custom-csvdir-bundle
Loading custom pricing data:   [############------------------------]   33% | FAKE: sid 0
Loading custom pricing data:   [########################------------]   66% | FAKE1: sid 1
Loading custom pricing data:   [####################################]  100% | FAKE2: sid 2
Loading custom pricing data:   [####################################]  100%
Merging daily equity files:  [####################################]

# 也可以通过环境变量传入路径
$ CSVDIR=/path/to/your/csvs zipline ingest -b custom-csvdir-bundle

本文就到这里,感谢阅读,欢迎订阅:)


quant

量化交易

你可能感兴趣的:(开源量化平台zipline之Data Bundles)