開源量化平臺zipline之Data Bundles

Zipline中Data Bundles是指一組包含價格、調整(如分紅送股,拆分合並等)及資產信息的數據集合。使用bundles我們可以將數據預先加載進zipline中,從而在以後的回測中可以直接使用。

查看前篇《開源量化交易平臺zipline初探

開源量化平臺zipline之Data Bundles

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

本文就到這裡,感謝閱讀,歡迎訂閱:)

開源量化平臺zipline之Data Bundles

quant

開源量化平臺zipline之Data Bundles

量化交易


分享到:


相關文章: