目次
はじめに
誰でも簡単に暗号通貨トレーディングプログラムを作成できるEnigma Catalystについて、環境構築から導入までやってみます。
動作環境
- macOS High Sierra 10.13.3
- Python 3.6.4
- conda 4.4.10
- catalyst 0.5.5
Enigmaとは?
Ethereum(イーサリアム)のセカンドレイヤープロジェクトであり、スマートコントラクトの課題であったプライバシー問題のソリューションとして注目されています。
ENGというERC20ベースのトークンを発行している暗号通貨プロジェクトでもあります。
暗号化されたままデータを取引できるデータマーケットプロトコルを提供しています。
Enigma Catalystとは?
CatalystはEnigmaプロトコルを使った最初のアプリケーションとして公式から提供されているものです。
具体的には暗号通貨トレードのためのPythonライブラリです。
過去のデータを使ってアルゴリズムをテストすることで、独自のトレーディング戦略を構築出来るようになっています。(あくまでシミュレーション用のデータを提供しているだけでアルゴリズムは自分で実装する必要がある)
現在サポートしている取引所は限定されていますが、今後開発が進めばあらゆる取引所に対して実際にトレーディングすることも出来るようになります。
Catalystインストール
Catalystを使用するには一般的なデータ分析ライブラリ群が必要になります。まずは実行環境を整えるために、必要なライブラリ郡がインストールされた仮想環境を準備します。
- MiniCondaをダウンロード
MiniCondaからインストーラーのシェルをダウンロードします。
Enigma Data MarketplaceにはPython3が必要なため、Python 3.6をダウンロードしましょう。
シェルをダウンロードしたディレクトリに移動し、インストーラーを実行します。
12$ bash Miniconda3-latest-MacOSX-x86_64.sh設定は後から変えられるので、基本的にインストーラーの通りで進みます。
conda list
でパッケージリストが表示されればインストールは完了しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ source ~/.bash_profile $ conda list # packages in environment at /Users/xxxxx/miniconda3: # # Name Version Build Channel asn1crypto 0.24.0 py36_0 ca-certificates 2017.08.26 ha1e5d58_0 certifi 2018.1.18 py36_0 cffi 1.11.4 py36h342bebf_0 chardet 3.0.4 py36h96c241c_1 . . . |
-
実行環境準備
公式で提供されている設定ファイルから仮想環境を作成します。
任意のディレクトリに設定ファイルをダウンロードします。
次にcondaコマンドで設定ファイルから仮想環境を作成します。
123$ wget https://raw.githubusercontent.com/enigmampc/catalyst/master/etc/python3.6-environment.yml$ conda env create -f python3.6-environment.ymlこれでCatalystが動作する環境が整いました。
仮想環境をアクティベートして、catalystのバージョンを確認します。catalystのバージョンが確認できれば成功しています。
1234$ source activate catalyst$ catalyst --versioncatalyst, version 0.5.5仮想環境を非アクティブにする場合は次のコマンドを実行します。
12$ source deactivateこれで必要なライブラリが全て含まれた仮想環境の準備が整いました。
Pycharm設定
Catalystの実行にIDEは必須ではありませんが、せっかくなのでPyCharmを導入します。
ここからMac用のPyCharm Communityをダウンロードして、PCにインストールします。
インストール出来たら、Pycharmを起動して新しいプロジェクトを作成します。
“Existing interpreter”を選択し、詳細設定から”Add Local”に進みます。
“Conda Environment”タブから先程作成した仮想環境のPythonバイナリファイルを指定します。
専用の仮想環境で実行するPythonプロジェクトが作成されました。
バックテスティングの実行
バックテストとは
Catalystでは、バックテスト、ペーパートレーディング、ライブトレーディングの3つのモードを実行することが出来ます。
ライブトレーディングでは作成したアルゴリズムを用いて実際にトレードを行います。それに対して、ペーパートレーディングでは、リアルタイムのデータを使ってシミュレーションを実行することが出来ます。
今回は、過去のデータを対象としてシミュレーションを実行することが出来るバックテストというものをやってみます。
バックテストを実行するためには、プログラムの実装→テスト用データの取得→プログラムの実行という流れで進めます。
トレーディングプログラムの実装
Catalystを用いたトレーディングプログラムでは2つの関数を実装する必要があります。
- initialize(context)
まず最初に呼び出されるのがinitialize()関数で、プログラムの実行に必要な値をはcontextにセットします。contextはアルゴリズム実行時に使用する変数を格納しておくための名前空間です。 -
handle_data(context, data)
初期化が完了するとイテレーション毎にhandle_data()が呼ばれます。イテレーションはデータによって日毎や分毎で実行されます。
イテレーション毎にcontextと、始値/高値/低値/終値を含むdataを受け取ります。
通常ここで独自のアルゴリズムを適用してトレードします。ここでは公式で提供されているサンプルを参考に進めていきます。
まずは1BTCを注文するだけのシンプルなトレードアルゴリズムを実装します。
1 2 3 4 5 6 7 8 9 10 |
from catalyst.api import order, record, symbol def initialize(context): context.asset = symbol('btc_usd') def handle_data(context, data): order(context.asset, 1) record(btc=data.current(context.asset, 'price')) |
order()
は暗号通貨のアセットオブジェクトと、取引する量を引数として受け取り、トレード処理を実行する関数です。
record()
は各イテレーションにおける値を記録しておく関数です。
テスト用データを取得
トレーディングアルゴリズムを実行するためには、適用するデータセットを取得する必要があります。
ingest-exchange
コマンドを使って、指定した取引所や期間などで絞り込んだデータセットを取得します。
1 2 3 |
(catalyst)$ catalyst ingest-exchange -x bitfinex -f daily -i btc_usdt Ingesting exchange bundle bitfinex... [====================================] Ingesting daily price data on bitfinex: 100% |
その他の引数についてはhelpオプションで調べてみてください。
1 2 |
(catalyst)$ catalyst ingest-exchange --help |
プログラムの実行
それではシンプルなトレーディングを実行してみます。
実行の際に、-o
オプションで出力先のファイルを指定することで解析用の結果ファイルを生成することが出来ます。
1 2 |
(catalyst)$ catalyst run -f buy_btc_sample.py -x bitfinex --start 2016-1-1 --end 2017-9-30 -c usd --capital-base 100000 -o buy_btc_sample_out.pickle |
結果ファイルが出力できたら、後はpandasなどの分析ツールを使って色々な分析を試すことが出来ます。
matplotlibで可視化
analyze()関数内でデータの可視化処理を実装することが出来ます。
ここではmatplotlibを使って可視化する例を紹介します。
matplotlibは構築した仮想環境ならそのまま使えるはずですが、自分の環境だとそのまま動かなかったので、もしmatplotlib絡みのエラーが出たら最新バージョンをインストールし直してみてください。
1 2 3 |
(catalyst)$ pip uninstall matplotlib (catalyst)$ pip install matplotlib |
先程のプログラムにanalyze()を追加して可視化処理を実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import matplotlib.pyplot as plt from catalyst.api import order, record, symbol def initialize(context): context.asset = symbol('btc_usd') def handle_data(context, data): order(context.asset, 1) record(btc=data.current(context.asset, 'price')) def analyze(context, perf): ax1 = plt.subplot(211) perf.portfolio_value.plot(ax=ax1) ax1.set_ylabel('Portfolio Value') ax2 = plt.subplot(212, sharex=ax1) perf.btc.plot(ax=ax2) ax2.set_ylabel('Bitcoin Price') plt.show() |
先ほどと同じ条件でプログラムを実行します。
1 2 |
(catalyst)$ catalyst run -f buy_btc_sample.py -x bitfinex --start 2016-1-1 --end 2017-9-30 -c usd --capital-base 100000 |
毎回1BTCを買っているだけの単純なアルゴリズムなので、BTCの価格チャートに連動していることがグラフから読み取れます。
最後に
最初はデータマーケットからEnigmaプロトコルに興味を持って、実際にプロトコル使ったアプリが動くのをやってみてすげえwってなりました笑
実際裏側でどう動いているのか分かっていないので、もう少しその辺も調べたいなと思ってます。
データ分析ごりごりやる人なら中々楽しめると思います。
次はJupyter Notebook使って色々試してみようかな。
それでは。