開源量化交易平臺zipline初探

通過之前的Quantopian系列文章,大家已經瞭解Quantopian是一個在線構建量化交易策略的平臺,而zipline則是Quantopian開源的python量化交易庫,提供了Quantopian大部分的功能(如回測、研究)。

本文就帶大家快速的搭建一個zipline環境。

可以通過pip或者conda安裝zipline,這裡推薦大家使用conda, 因為conda同時提供了環境與包的管理,使用起來更為方便。

安裝Anaconda

Anaconda 是包含了conda、python及常用可用計算庫的一個一體化的安裝包,同時也提供了一個UI界面供使用。

下載地址:

https://www.anaconda.com/download/#linux

windows直接下載exe安裝,linux用戶下載後直接執行該shell

$ chmod +x Anaconda3-5.2.0-Linux-x86_64.sh

$ ./Anaconda3-5.2.0-Linux-x86_64.sh

同時由於國內網速的原因,推薦切換至清華源

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/

conda config --set show_channel_urls yes

確認是否安裝成功

$ conda -V

conda 4.5.4

安裝zipline

首先使用 conda創建一個單獨的環境供使用,可指定python版本,在環境中安裝的包不會影響其他環境

# 構建名為env_zipline的環境,指定python版本為3.5

$ conda create -n env_zipline python=3.5

切換至該環境

$ source activate env_zipline

可以看到shell前綴已經顯示在該環境中

(env_zipline) $

使用conda安裝zipline

# -c 表示指定channel

(env_zipline) $ conda install -c Quantopian zipline

數據準備

在寫算法策略前,我們需要一些數據,本文通過Quandl API 來獲取,你可以去網站免費註冊一個賬號(獲取API_KEY),並使用如下命令將數據灌入zipline。

$ QUANDL_API_KEY= zipline ingest [-b ]

其中 是數據包的名稱,默認為 quandl。

國內速度感人,可以自己想想辦法 o( ̄︶ ̄)o,提示如下

$ QUANDL_API_KEY=api_key proxychains4 zipline ingest -b quandl

可參考之前的番前篇

在執行zipline ingest時,處理進程莫名被killed,最後通過系統日誌/var/log/*發現為OOM(Out of memory)被系統殺死,可調大虛擬機內存/swap,或調整OOM-Killer配置。

開源量化交易平臺zipline初探

進程被殺

經常會失敗,可能需要清理 data bundles

$ zipline clean [-b ] --keep-last 0 #數字表示保留最近的n次數據

編寫算法策略

每個算法策略包含兩個函數

  • initialize(context)
  • handle_data(context, data)

在算法執行前,zipline首先會調用 initialize() 傳入context,context是算法執行過程中共用的上下文信息,可以用來存儲算法執行不同階段的需要保存的數據。

初始化後,zipline會根據事件調用 handle_data(),每次調用,都會傳入context與data,context是執行過程中唯一的一份,但data則與該次調用的事件相關,通常會包含此刻的開盤,最高、最低及收盤價。

來嘗試寫一個最簡單的算法策略

from zipline.api import order, record, symbol

def initialize(context):

pass

def handle_data(context, data):

order(symbol('AAPL'), 10)

record(AAPL=data.current(symbol('AAPL'), 'price'))

首先需要引入使用的函數,所使用的函數大部分來自zipline.api。當前算法中我們使用了order和record兩個函數,order有兩個參數——證券對象和買賣數量(為正標識買,為負表示賣),本例中我們買了10股蘋果的股票。

record函數用來記錄每次迭代過程中的你希望保存的數據,使用key=value的方式設置,當算法執行完後你就可以通過key來獲取保存的數據。

執行算法策略

zipline提供了三種執行算法策略的方式:

  1. 命令行
  2. Jupyter Notebook
  3. run_algorithm()函數

命令行

首先我們使用命令行來執行下:

zipline run -f ../../zipline/examples/buyapple.py --start 2016-1-1 --end 2018-1-1 -o buyapple_out.pickle

run首先會調用initialize函數,然後使用handle_data()對歷史股票價格數據逐天處理,每調用一次,本策略就會買入10股蘋果的股票。每次調用order()時,zipline就會在委託訂單中新增10股蘋果股票,handle_data執行結束後,zipline就會去尋找尚未成交的委託,並嘗試去成交,如果交易數量巨大,通常需要考慮佣金及滑點的影響(簡單來說,就是你會花費比股價*數量更多的錢)。

現在我們來看看結果,結果類型為pandas中的Dataframe。

import pandas as pd

perf = pd.read_pickle('buyapple_out.pickle') # read in perf DataFrame

perf.head()

開源量化交易平臺zipline初探

結果Dataframe

可以使用matplotlib將蘋果股價與我們策略的運行結果繪製出來。

%pylab inline

figsize(12, 12)

import matplotlib.pyplot as plt

ax1 = plt.subplot(211)

perf.portfolio_value.plot(ax=ax1)

ax1.set_ylabel('Portfolio Value')

ax2 = plt.subplot(212, sharex=ax1)

perf.AAPL.plot(ax=ax2)

ax2.set_ylabel('AAPL Stock Price')

開源量化交易平臺zipline初探

圖示

因為我們的策略中只是單純的買入蘋果股票,可以看到兩圖基本保持一致。

Jupyter Notebook

Jupyter Notebook為python解釋器提供了非常強大的瀏覽器界面,現在業界很多的quant都在使用,在notebook中也可以方便的執行zipline。

在notebook中,需要先加載zipline,然後使用魔術方法%%zipline來執行zipline命令,參數與命令行完全相同。

%load_ext zipline

%%zipline --start 2016-1-1 --end 2018-1-1

from zipline.api import symbol, order, record

def initialize(context):

pass

def handle_data(context, data):

order(symbol('AAPL'), 10)

record(AAPL=data[symbol('AAPL')].price)

在notebook中我們就不在需用單獨定義一個文件,會自動使用當前cell中的算法,同時,輸出也不在需要單獨定義,可以使用_.head() 直接獲取。

至此,我們就完整搭建了一套zipline的環境,後續就可以隨意玩耍了。

感謝閱讀,歡迎訂閱~

開源量化交易平臺zipline初探

量化投資

開源量化交易平臺zipline初探

配圖


分享到:


相關文章: