通過之前的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配置。
經常會失敗,可能需要清理 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提供了三種執行算法策略的方式:
- 命令行
- Jupyter Notebook
- 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()
可以使用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')
因為我們的策略中只是單純的買入蘋果股票,可以看到兩圖基本保持一致。
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的環境,後續就可以隨意玩耍了。
感謝閱讀,歡迎訂閱~