开源量化平台zipline之Data Bundles

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

查看前篇《开源量化交易平台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

......

有了正确格式的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

量化交易