zipline 銘柄データをcsvファイルより読み込みバックテストを行う

#1 この記事は？

ziplineにて銘柄データを読み込みバックテストを実施する場合、zipline上に「bundle」を作りそこで銘柄データを管理をする方法がありますが、銘柄データをcsvファイルから直接読み込みバックテストを行う方法もあります。この記事では、銘柄データをcsvファイルから直接読み込みバックテストを行う方法を書きます。


#2 内容

#2-1 トレーディングカレンダーのインストール
まず、各取引所のトレーディングカレンダーをインストールします。

```console:
(python355) C:\Users\***\anaconda3>conda install -c quantopian trading-calendars
```
#2-2 トレーディングカレンダーのインストール

下記のコードを実行します。下記ののコード実行時に使用した銘柄n1570とn7752のcsvファイルは
[こちらから取得ください](https://github.com/fdfpy/zipline1)


```python:
from zipline.api import order, record, symbol,set_benchmark
import pandas as pd
from datetime import datetime
import zipline
import pytz  # timezoneの設定 https://narito.ninja/blog/detail/81/
from trading_calendars import get_calendar #各取引所のカレンダーを取り込む
from collections import OrderedDict

HDIR="xxxxxxxxxxxxxx" #csvファイル（銘柄データ)を置くディレクトリを指定する
 
data=OrderedDict() #順序付き辞書に順番を持たせる。
tickers=["n1570","n7752"] #読み込む銘柄に対応するcsvファイル名をここで指定する。

#csvファイルから銘柄の株価を読み込む
for ticker in tickers:
    DIR=HDIR + ticker +".csv" #読み込む銘柄(csvファイル)を指定する。
    data[ticker]= pd.read_csv(DIR, index_col=0,parse_dates=True) #csvファイルを読み込む。

panel=pd.Panel(data)  #3次元配列panelに銘柄データを入れる。
panel.major_axis=panel.major_axis.tz_localize(pytz.utc) #時刻をUTCゾーンにする。(便宜的にUTCゾーンにしないとエラーになる)

def initialize(contect):
    set_benchmark(symbol("n1570")) #銘柄n1570をベンチマークに指定する。

def handle_data(context,data):
    order(symbol("n1570"),1) #毎日大引けで1株購入する。
    record(N1570=data.current(symbol("n1570"),"price")) #銘柄n1570のclose値を記録する。

    
#バックテストを実行する。(毎日大引けで銘柄n1570を1株購入する。)
perf=zipline.run_algorithm(start=datetime(2020,1,4,0,0,0,0,pytz.utc),
                            end=datetime(2020,3,4,0,0,0,0,pytz.utc),
                            initialize=initialize,
                            capital_base=1000000, #スタート時のアセットを指定する。
                            handle_data= handle_data,
                            data=panel,
                            trading_calendar=get_calendar('XTKS') #東京証券取引所のカレンダーを読み込む
                           )

perf.to_csv("********") #バックテストの実行結果をcsvファイルに書き込む

print(perf.head())
```

★補足
・OrderedDict() #順序付き辞書に順番を持たせる　・・・[解説はこちら](#https://note.nkmk.me/python-collections-ordereddict/)
・Panel 3次元配列をつくる・・・[解説はこちら](https://qiita.com/sawadyrr5/items/2ec516435d69064102c5)
・タイムゾーンの設定pytz・・・[解説はこちら](https://narito.ninja/blog/detail/81/)


下記は実行結果です。

```console:
                           N1570  algo_volatility  algorithm_period_return  \
2020-01-06 06:00:00+00:00  21510              NaN                 0.000000   
2020-01-07 06:00:00+00:00  22200         0.000125                -0.000011   
2020-01-08 06:00:00+00:00  21530         0.006189                -0.000692   
2020-01-09 06:00:00+00:00  22480         0.017575                 0.001197   
2020-01-10 06:00:00+00:00  22730         0.015535                 0.001936   

                              alpha  benchmark_period_return  \
2020-01-06 06:00:00+00:00       NaN                -0.042724   
2020-01-07 06:00:00+00:00 -0.001598                -0.012016   
2020-01-08 06:00:00+00:00 -0.046605                -0.041834   
2020-01-09 06:00:00+00:00  0.071751                 0.000445   
2020-01-10 06:00:00+00:00  0.084250                 0.011571   

                           benchmark_volatility      beta  capital_used  \
2020-01-06 06:00:00+00:00                   NaN       NaN         0.000   
2020-01-07 06:00:00+00:00              0.839647 -0.000148    -22211.101   
2020-01-08 06:00:00+00:00              0.635930  0.003357    -21540.766   
2020-01-09 06:00:00+00:00              0.692524  0.017970    -22491.241   
2020-01-10 06:00:00+00:00              0.604182  0.018330    -22741.366   

                           ending_cash  ending_exposure  \
2020-01-06 06:00:00+00:00  1000000.000              0.0   
2020-01-07 06:00:00+00:00   977788.899          22200.0   
2020-01-08 06:00:00+00:00   956248.133          43060.0   
2020-01-09 06:00:00+00:00   933756.892          67440.0   
2020-01-10 06:00:00+00:00   911015.526          90920.0   

                                   ...            short_exposure  short_value  \
2020-01-06 06:00:00+00:00          ...                       0.0          0.0   
2020-01-07 06:00:00+00:00          ...                       0.0          0.0   
2020-01-08 06:00:00+00:00          ...                       0.0          0.0   
2020-01-09 06:00:00+00:00          ...                       0.0          0.0   
2020-01-10 06:00:00+00:00          ...                       0.0          0.0   

                           shorts_count    sortino  starting_cash  \
2020-01-06 06:00:00+00:00             0        NaN    1000000.000   
2020-01-07 06:00:00+00:00             0 -11.224972    1000000.000   
2020-01-08 06:00:00+00:00             0  -9.313364     977788.899   
2020-01-09 06:00:00+00:00             0  13.968067     956248.133   
2020-01-10 06:00:00+00:00             0  20.185869     933756.892   

                           starting_exposure  starting_value  trading_days  \
2020-01-06 06:00:00+00:00                0.0             0.0             1   
2020-01-07 06:00:00+00:00                0.0             0.0             2   
2020-01-08 06:00:00+00:00            22200.0         22200.0             3   
2020-01-09 06:00:00+00:00            43060.0         43060.0             4   
2020-01-10 06:00:00+00:00            67440.0         67440.0             5   

                                                                transactions  \
2020-01-06 06:00:00+00:00                                                 []   
2020-01-07 06:00:00+00:00  [{'amount': 1, 'sid': Equity(0 [N1570]), 'orde...   
2020-01-08 06:00:00+00:00  [{'amount': 1, 'sid': Equity(0 [N1570]), 'orde...   
2020-01-09 06:00:00+00:00  [{'amount': 1, 'sid': Equity(0 [N1570]), 'orde...   
2020-01-10 06:00:00+00:00  [{'amount': 1, 'sid': Equity(0 [N1570]), 'orde...   

                          treasury_period_return  
2020-01-06 06:00:00+00:00                    0.0  
2020-01-07 06:00:00+00:00                    0.0  
2020-01-08 06:00:00+00:00                    0.0  
2020-01-09 06:00:00+00:00                    0.0  
2020-01-10 06:00:00+00:00                    0.0  
```