Jupyter-notebookからziplineを利用する

#環境構築
####ziplineを利用するための環境として、Anacondaをインストールし、Jupyter-notebook上でPython3の環境構築を行った。下記のブログを参考に、Python3とPython2の環境を切り替えできるように設定。

- https://ameblo.jp/nekketsu-engineer/entry-12143280349.html

####ziplineを動かすための注意点として、幾つかのライブラリはダウングレードが必要であった。

- empyrical0.3.0 → empyrical0.2.0

- zipline1.1.2 → zipline1.0.2

####この他にもバージョン修正が必要なものがあったかもしれないがメモに残っているのはこの2点。


#サンプルコード

####とにかくエラーを出さずに、グラフのアウトプットを出すまでに苦労したので、最後まで動いたコードとグラフを添付。主に下記のソースを参考にコードをつぎはぎ。

- https://www.quantinsti.com/blog/introduction-zipline-python
- https://www.quantinsti.com/blog/importing-csv-data-zipline-backtesting/
- https://stackoverflow.com/questions/42059478/zipline-error-keyerror-type-zipline-assets-assets-equity


```python:Data_from_goole.py
import pytz
import pandas as pd
from pandas.io.data import DataReader
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
from pylab import *
import zipline as zp
from zipline.algorithm import TradingAlgorithm
from zipline.api import order, symbol, record, order_target
from talib import MA
from collections import OrderedDict

#googleからSPYデータを取得
data = OrderedDict()
start_date = '2014-09-17'
end_date = '2015-06-24'
data['SPY'] = DataReader('SPY',data_source='google',start=start_date, end=end_date)
print(data['SPY'].head())
data['SPY'].to_csv('SPY.csv')
type(data['SPY'])

#取得したデータをCSVにoutput
import pandas as pd
datas = OrderedDict()
data['SPY'] = pd.read_csv('SPY.csv', index_col=0, parse_dates=['Date'])
print(data['SPY'].head())
type(data['SPY'])

#CSVデータをpanel形式に変換
panel = pd.Panel(data)
panel.minor_axis = ['Open', 'High', 'Low', 'close', 'Volume']
panel.major_axis = panel.major_axis.tz_localize(pytz.utc)

#initialize
def initialize(context):
    context.i = 0
    context.security = symbol('SPY')

#handle_data
def handle_data(context, data):
    context.i += 1
    if context.i < 101:
        return
    trailing_window = data.history(assets=context.security, fields='price', bar_count=100, frequency='1d')
    MA1 = MA(trailing_window.values, 50)[-1]
    MA2 = MA(trailing_window.values, 100)[-1]
    date = str(data[context.security].datetime)[:10]
    current_price = data[context.security].price
    current_positions = context.portfolio.positions[symbol('SPY')].amount
    cash = context.portfolio.cash
    value = context.portfolio.portfolio_value
    current_pnl = context.portfolio.pnl

    if (MA1 > MA2) and current_positions == 0:
        number_of_shares = int(cash/current_price)
        order(context.security, number_of_shares)
        record(date=date,MA1 = MA1, MA2 = MA2, Price=current_price,status="buy",shares=number_of_shares,PnL=current_pnl,cash=cash,value=value)

    elif (MA1 < MA2) and current_positions != 0:
        order_target(context.security, 0)
        record(date=date,MA1 = MA1, MA2 = MA2, Price= current_price,status="sell",shares="--",PnL=current_pnl,cash=cash,value=value)

    else:
        record(date=date,MA1 = MA1, MA2 = MA2, Price= current_price,status="--",shares="--",PnL=current_pnl,cash=cash,value=value)

#initializing trading enviroment
algo_obj = TradingAlgorithm(initialize=initialize, handle_data=handle_data, capital_base = 100000.0)

#run algo
perf_manual = algo_obj.run(panel)

#plot
perf_manual[["MA1","MA2","Price"]].plot()
plt.show()
```

####下記はアウトプットされたグラフ

![output.png](https://qiita-image-store.s3.amazonaws.com/0/191566/4b501d0d-b846-773b-3a15-b4b4ea07d138.png)

####SPYのPriceと50日、100日移動平均線がプロットされている模様。
####このコードをベースに、バックテスト機能を実現してみる。