QuantXの投資アルゴリズムのパフォーマンスをpyfolioで評価する

# はじめに
## 自己紹介
株式会社SmartTradeでインターンをしているmorisonという者です。

理系大学の学部2年で情報系専攻です。

Twitterアカウントは[こちら](https://twitter.com/morison25371553)

##今回やること
QuantXのサンプルアルゴリズムの過去一年間分の日次損益率をもとに、アルゴリムのパフォーマンスをpyfolioで評価します。

※ただし、投資先の銘柄だけはデフォルトの4~5銘柄からTopix Core 30に変更しています。

参考: https://github.com/smartradev/quantx-lab/blob/master/notebooks/pyfolio_sample01.ipynb

Google Colaboratory上でQuantX SDKを使用して実装を行います。

実装に入る前にQuantXとpyfolioについてざっくりと解説します。
## [QuantX](https://quantx.io/top#revenue6mth)
QuantXとは、[株式会社SmartTrade](https://smarttrade.co.jp/)が提供している株価予想アルゴリズムを販売しているサービスです。

QuantX Factoryではpythonを用いて、株価予想アルゴリズムの開発を行うことが出来ます。


・Webブラウザ上で動かすことが出来るので環境構築が不要
・Googleアカウントなどで簡単に登録できる
・バックテスト結果は自動でplotされる

などなど、非常に便利なので、ぜひ使ってみてください。
## pyfolioとは
ポートフォリオのパフォーマンスやリスクの分析に役立つPythonライブラリで、3年ほど前に[Quantopian Inc](https://www.quantopian.com/home)からリリースされました。

主な機能は様々なグラフを描画して、ポートフォリオを全体の分析を助けます。
(個々の複数のグラフをまとめたものをtear sheetと呼びます。)

Googleの日次リターンをもとに、tear sheetを算出した記事を書きました。下に貼っておきます。
[「pyfolioを使ってみる」](https://qiita.com/morison28/items/445553c24861b9930682)

↑の記事は公式のgithubを参考に書きました。そちらも貼っておきますね。

https://github.com/quantopian/pyfolio/blob/master/pyfolio/examples/full_tear_sheet_example.ipynb 

# 実装
QuantXへの登録を済ませてからお願いします。

## tear sheet生成のためのデータを取得
pyfolioでtear sheetを描画するには、アルゴリズムのバックテスト結果の日次リターンをpandasのSeries型で渡す必要があります。

Google Colaboratory上でquantx_sdkを使用するところから始めます。

qunatx labが提供しているこのページと
https://github.com/smartradev/quantx-lab/blob/master/notebooks/firstStep_for_QuantX_SDK.ipynb

このQiita記事
https://qiita.com/katakyo/items/ac01dcd6c692c3585596

を参考にしてみてください。

### サンプルアルゴリズムのバックテスト結果のインスタンスの生成

```python
# quantx_sdkのインストール
pip install quantx_sdk
```
ご自身のアカウントから各種キーを取得して、下記のように変数に格納します。
```python
public_key = '#################'
secret_key = '#################'
```

```python
#sdkをインポート
from quantx_sdk import QX
```

```python
# QuantXのアカウントのオブジェクトを生成
qx = QX(public_key, secret_key)
```
サンプルアルゴリズムのハッシュ番号をもとにプロジェクトを取得します。

```python
# サンプルコードのハッシュ番号の取得
project_hash = "ac5fd8bd84344542985796a04e29ab22"
# ハッシュ番号によるプロジェクトの取得
project = qx.project(project_hash)
# ソースコードも取得できます
source = project.source()
# コメントアウトを外すとソースコードが見を見ることが出来ます
#print(souce)
```

バックテストのパラメータ(期間と初期資金を設定します)

```python
bt_params = {
 'capital_base': 10000000,
 'engine': 'maron-0.0.5',
 'from_date': '2018-01-01',
 'to_date': '2019-01-01'
}
```

`'engine': 'maron-0.0.5'`は使用しているエンジンの名前とバージョンです。

（最近新エンジンへの改装が完了して、色々な機能が備わりました。QuantXを始めて触った方がいたら、これを機に興味をもっていただけると嬉しいです。）



次にバックテストを実行して、バックテスト結果のインスタンスを生成します。

```python
# バックテストの実行
bt = project.backtest()

# バックテスト結果のインスタンスを生成
join = bt.join()

# 結果サマリーを取得
summary = join.summary(bt_params)
summary
```

上の入力で、以下のバックテスト結果のサマリーを得られます。

バックテストサマリーはこんな感じで表示されます。

```python
{'2018': 0.04916299999999918,
 'Alpha': 0.1285752514839626,
 'Beta': [0.4497082518823483],
 'MaxDrawdown': -0.12247080905916585,
 'ReturnRatio': '4.92',
 'ReturnValue': 10491630,
 'SharpeRatio': 0.3909388570491606,
 'SignalCount': 318,
 'TradingDays': 245,
 'Volatility': 0.15884937729053428}
```

###生成したインスタンスを使って日次リターンを取得する

`benchmark()`メソッドでバックテスト期間内の日にちごとの様々なデータを取得します。

```python`
df = join.benchmark()
```

`df`は以下のようなデータで、pandasのDataFrame型となっています。

![スクリーンショット (85).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354177/bc956aac-8979-e327-713b-62cdfa3017e3.png)
・・・
![スクリーンショット (86).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354177/83edf18f-afeb-2096-9017-32d75411d000.png)


ここから日次リターンを取得します。

```python
returns = df['portfolio_daily_returns']
```
これで準備完了です。

次は、pyfolioのtear sheetを描画するメソッドにこの`returns`を引き渡してやれば終了です。

## tear sheetの描画

```python
pf.create_returns_tear_sheet(returns)
```

##出力されたtear sheet

![スクリーンショット (88).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354177/58cc8834-1549-ea3e-56c5-a8d2a1ff2d74.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354177/61c199d5-7339-a5c4-ac3a-79bb843382f1.png)

# まとめ
とりあえずアルゴリズムをpyfolioで評価するという目標は達成することが出来ました。

現在のQuantXで算出できる評価指標よりも種類が多く、様々グラグを描画できることには感激しました。

ただ、この数値やグラフをもとにどんな分析をして、どのようにアルゴリズムを改善していくかを考えなくてはいけませんね。

読んで頂きありがとうございました。

フィードバックやご意見等がございましたらコメントでよろしくお願いします。


おわり