Zipline中Data Bundles是指一组包含价格、调整(如分红送股,拆分合并等)及资产信息的数据集合。使用bundles我们可以将数据预先加载进zipline中,从而在以后的回测中可以直接使用。
发现可用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/
,注入过程可能会花费你一定时间,如果你使用默认的Quandl
bundle,你需要去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
本文就到这里,感谢阅读,欢迎订阅:)