仮想通貨の自動取引入門 ~環境構築~

Yuya Sugano
19 min readAug 15, 2019

--

仮想通貨に限らず自動取引は取引時に人手を介さず、リスクをコントロールしつつコストの削減およびリターンを機械的に追求することであると考える。本稿では金融商品(特に仮想通貨)における自動取引について、なぜ仮想通貨で自動取引なのかといった理由。およびDockerを使用した仮想通貨の自動取引環境の構築について説明する。

Image by TeroVesalainen from Pixabay

目次を記載する。

  • 自動取引とは
  • 仮想通貨取引所における自動取引
  • APIによる板情報の収集
  • Docker環境の構築

自動取引とは

金融商品における自動取引とはシステムトレードの非裁量取引を、特にプログラムを用いて自動化しまた定例化することでリスクのコントロールもしくはリターンの追求を省力化した上で達成することであると考える。

システムトレードやアルゴリズム取引という語には使用する組織や文脈に応じて複数の意味があること、また意味の混ざることがあるためにここでは単純に自動取引という用語のみ使用する。[1]

アルゴリズムを使用しないものも含め、自動取引という用語の意味はより広義に捉えて頂いて問題ない。プログラムを介して、取引機会を発見し、それを自動化しているものを自動取引と呼びたいと思う。非裁量性や高頻度取引(High Frequency Trading)など様々な利点のある自動取引であるが、まず大分類としてコストの削減を目指すものとリターンの追求を実現するものの2種類がある。[2]

  • コストの削減
    ・取引コストの削減(執行系アルゴリズム、VAMPなどのベンチマーク系アルゴリズム)
    ・マーケット・メイクやバスケット取引などの定型的な業務の自動化による内部コストの削減
    ・マーケット・インパクトによるコストの削減
    ・最適な市場の選択をすることによる手数料の削減
  • リターンの追求
    ・収益機会の発見(裁定アルゴリズム、ディレクショナル・アルゴリズムなど)
    ・リベートの獲得(メイカー・テイカー手数料)
    ・スプレッド収益の発見(マーケット・メイキング・アルゴリズム)

個人投資家についてはよほど大口でない限り、リターン追求のために自動取引を導入すると考えられることから、ここでは収益機会の発見を達成する自動取引をプログラムでどのように記述していくかを考えていく。主に裁定アルゴリズム、ディレクショナルアルゴリズム、マーケット・メイキング・アルゴリズムを個人投資家は利用する。自動取引に限らないが以下のPDCAを回して行くことで(自動取引においては自動的に行うことが好ましい)、効率よく収益機会の発見および収益の発生を実現することが理想である。

1.情報の収集および整理
2.自動取引と約定の確認
3.バックテスト(ベンチマーク)

仮想通貨取引所における自動取引

仮想通貨取引所は証券市場とは異なり、証券取引所やPTS(私設取引システム)、ダークプールといった場は存在しない(と認識している)。取引所自体がプログラムのコードを主として動き、取り扱われている仮想通貨自体も電子的なものである。従って市場は24時間開放されており、仮想通貨自体は取引所を介することなく、個人対個人でも遠隔から送信が可能である。仮想通貨取引所はザラバ方式で、価格優先および時間優先の原則通りに注文を相対して行くだけである。一般的な仮想通貨取引所では特殊な注文形態はないと認識している。

また取り扱う商品である仮想通貨の性質上、自動取引が行いやすく、取引だけでなく仮想通貨の取り扱い自体を全て電子化しておくことができる(例として秘密鍵・公開鍵やウォレット、Mnemonicの管理など)。

本稿では主に『仮想通貨』を売買の対象として取り扱っていく。株式、債券、為替や各種コモディティなどインターネットを通じて取引を行うことができる銘柄は今では多いが、仮想通貨はAPI(Application Programming Interface)の使用が容易で、市場が実際に24時間動いているため(フォローザサンなどを意識する必要がない)、自動取引との親和性が高いことを改めて繰り返しておく。株やその他の証券についてはSBI証券が先物・オプションAPIを提供している程度であり、APIによる自動取引は仮想通貨かFXしか選択肢がないのが現状である。APIを用いない手法としてはウェブのUIテストツールのSelenium Webdriverによるシステムトレードなどが有名である。[3]

また東証においてはアローネットと呼ばれる日本取引所グループの売買システムと取引参加者を繋ぐネットワーク環境が提供されているが、当然ながら個人の投資家でアローネットに参加することは困難であると思われる。仮想通貨取引所では同様の特殊な接続を設けていないことから(認識している限りにおいて)、API(Application Programming Interface)のエンドポイントに近接する場所が低レイテンシとなり、個人投資家の自動取引においてもベターな条件を追求することが可能となる(はずである)。

例えば板情報を取得するエンドポイントと注文を出すエンドポイントが別である場合、それぞれに近い地域のクラウドやVPSを契約し、レイテンシを測定するといったテストが可能である。次にbitbankのAPIを使用した簡単な情報の取得を試していく。

APIによる板情報の収集

仮想通貨取引所の口座開設にあたって手数料の安さや板の厚さ、またセキュリティの堅牢さの指標などに基づき選択すべきと思われるが、APIの使用の容易さ、ドキュメントの分かりやすさも手伝ってbitbankの口座を開設した。[4]

APIを活用する様々な言語のライブラリやツールが既に用意されている。

Libraries and tools of bibank.cc API

ローカル環境のpython3.6.xを使用してpythonのライブラリをインストールした。ティッカー情報や板情報など、情報を取得するだけのパブリックAPIと注文を出すなどキーの必要なプライベートAPIがあるが、ここではパブリックAPIを使用して情報取得のみテストする。pythonベースでコードを記述していくが、ライブラリがサポートする言語に合わせて書き換えることは容易である。

pipでライブラリのv0.0.4をインストールした。

$ pip install git+https://github.com/bitbankinc/python-bitbankcc.git
Collecting git+https://github.com/bitbankinc/python-bitbankcc.git
Cloning https://github.com/bitbankinc/python-bitbankcc.git to /tmp/pip-req-build-0s0gb1vu
Running command git clone -q https://github.com/bitbankinc/python-bitbankcc.git /tmp/pip-req-build-0s0gb1vu
Building wheels for collected packages: python-bitbankcc
Building wheel for python-bitbankcc (setup.py) ... done
Stored in directory: /tmp/pip-ephem-wheel-cache-g_oyyuaz/wheels/1d/7b/8f/fad3cd137c97f092c0fbe9379877880593d4cd7d3b5c6f03e7
Successfully built python-bitbankcc
Installing collected packages: python-bitbankcc
Successfully installed python-bitbankcc-0.0.4

パブリックAPIの get_tickerget_depth というメソッドでそれぞれティッカー情報と板情報が取得できる。

$ touch public.py

public.py という名前のファイルを作成してそこにコードを書いていく。

#!/usr/bin/python
import json
import python_bitbankcc
# Ticker information
def get_btc(obj):
ret = obj.get_ticker('btc_jpy')
return ret
# Depth board information
def get_btcd(obj):
ret = obj.get_depth('btc_jpy')
return ret
def main():
pub = python_bitbankcc.public()
print(json.dumps(get_btc(pub), indent=4, separators=(',', ': ')))
print(json.dumps(get_btcd(pub), indent=4, separators=(',', ': ')))
if __name__ == '__main__':
main()

pythonはコンパイルせずにそのまま実行することができる。上部のJSONがティッカー情報、下部が板情報である。板情報は asks の買い板と bids の売り板があり、それぞれ配列で価格と数量が格納される。

$ python public.py
{
"sell": "1084000",
"buy": "1083834",
"high": "1130000",
"low": "1007468",
"last": "1084000",
"vol": "3631.9551",
"timestamp": 1565868961562
}
{
"asks": [
[
"1084000",
"0.3397"
],
[
"1084001",
"3.8944"
],
...

APIキーの取得やプライベートAPIについては以下に詳細な方法やプログラム例が豊富にある。[5]

Docker環境の構築

板情報の取得で見たように自動取引自体にはそれほど多くのパッケージは必要ない。しかし一方で、統計的手法、時系列解析、機械学習やディープラーニングなど数理的に洗練されたアルゴリズムを数値データへ適用させることを考えるとAnacondaのようなデータサイエンス向けのパッケージを用意したほうが良いと考える。以下はAnaconda公式のDocker Hubレポジトリである。

Jupyter Notebookも含む、Python 3.7.3ベースのイメージで単体でデータサイエンスや機械学習の使用に耐え得るがイメージサイズが2G以上あるためポータブルな使用にはあまり向かない。

continuumio/anaconda3  latest  2 weeks ago  2.6GB

以下はDockerfileのgithubリポジトリである。Dockerfileを編集して独自のイメージを作成しても良い。

また一般に作成されたDockerイメージも複数ある。以下、tiangolo/python-machine-learningのイメージはプル数も少なくなく比較的軽量である(しかし1G以上はあるが)。環境に合わせて複数のタグが用意されているため、用途に応じてイメージの選択が可能な点は嬉しい。

TensorflowのサポートやGPUがある場合は、CUDAなどもサポートできる。

https://hub.docker.com/r/tiangolo/python-machine-learning
$ docker pull tiangolo/python-machine-learning:python3.6
python3.6: Pulling from tiangolo/python-machine-learning
c5e155d5a1d1: Pull complete
221d80d00ae9: Pull complete
4250b3117dca: Pull complete
3b7ca19181b2: Pull complete
425d7b2a5bcc: Pull complete
aecb883a7ba1: Pull complete
cd157bc268b2: Pull complete
fb8dcb3732a4: Pull complete
2bc41d47dd50: Pull complete
f11c489c752b: Pull complete
a87f13baa26e: Pull complete
Digest: sha256:19cabe911312a6431670dcc4b4944c3917af1242ffa27b31f7eca3a6d494e6e6
Status: Downloaded newer image for tiangolo/python-machine-learning:python3.6

今回はこのイメージを編集して、python-bitbankccのライブラリがインストールされたDockerイメージを作成してみる(condaのbaseの仮想環境にあるpipでライブラリをインストールしてコミットしたのみ)。

$ docker run -it tiangolo/python-machine-learning:python3.6 /bin/bash
(base) root@63486ec3896a:/# pip -V
pip 19.1.1 from /opt/conda/lib/python3.6/site-packages/pip (python 3.6)
(base) root@63486ec3896a:/# pip install git+https://github.com/bitbankinc/python-bitbankcc.git
Collecting git+https://github.com/bitbankinc/python-bitbankcc.git
Cloning https://github.com/bitbankinc/python-bitbankcc.git to /tmp/pip-req-build-0s0gb1vu
Running command git clone -q https://github.com/bitbankinc/python-bitbankcc.git /tmp/pip-req-build-0s0gb1vu
Building wheels for collected packages: python-bitbankcc
Building wheel for python-bitbankcc (setup.py) ... done
Stored in directory: /tmp/pip-ephem-wheel-cache-g_oyyuaz/wheels/1d/7b/8f/fad3cd137c97f092c0fbe9379877880593d4cd7d3b5c6f03e7
Successfully built python-bitbankcc
Installing collected packages: python-bitbankcc
Successfully installed python-bitbankcc-0.0.4

bitbankccというイメージが作成できた。

$ docker commit 63486ec3896a bitbankcc:python3.6
sha256:95fa485da446d6e482382fc3ecf1d4b84fcd166fb54b074ff48490a64235dbdc
$ docker images bitbankcc
REPOSITORY TAG IMAGE ID CREATED SIZE
bitbankcc python3.6 95fa485da446 7 seconds ago 1.08GB

前述の板情報を取得するコードをホスト側からコンテナ側へ渡して実行をテストしてみる。ホスト側に bitbankcc というフォルダを作成して、その中に public.py を配置した。以下のコマンドでコンテナとホスト側のディレクトリのバインディングが可能である。

$ docker run --rm -it -v $(pwd)/bitbankcc:/home bitbankcc:python3.6 /bin/bash

/home 配下にある public.py を実行する。現在のティッカー情報と売買の板情報が表示できた。

(base) root@f9e11f9ba67b:/# python /home/public.py
{
"sell": "1192226",
"buy": "1191251",
"high": "1222500",
"low": "1190501",
"last": "1191275",
"vol": "964.5229",
"timestamp": 1565609886758
}
{
"asks": [
[
"1192226",
"0.1191"
],
...

ここでは手動でプログラムを実行しているがcronやジョブ管理のシステムを使った自動実行(Digdag/Embulk)、Pubnubを使用したリアルタイム処理も可能である。

データ分析やグラフ描画に matplotlibseaborn を使いたい場合、Jupyter Notebookが便利なため公式の anaconda3 のイメージを試しておく。

このコンテナではJupyter Notebookを立ち上げることができる。手元の環境でポート番号だけ 3000 へ変更してコンテナを立ち上げた(このコマンドはDocker Hubのイメージ公式に掲載されている)。

$ docker run -i -t -p 3000:8888 continuumio/anaconda3 /bin/bash -c "/opt/conda/bin/conda install jupyter -y --quiet && mkdir /opt/notebooks && /opt/conda/bin/jupyter notebook --notebook-dir=/opt/notebooks --ip='*' --port=8888 --no-browser"

ブラウザからアクセスしてJupyter Notebookを開く(トークンが必要となるので docker logs でトークン文字列を確認する必要がある)。

Jupyter Notebook

コンテナ内部で同様にpython-bitbankccのライブラリをインストールする。

$ docker exec -it continuumio/anaconda3 /bin/bash
(base) root@63486ec3896a:/# pip install git+https://github.com/bitbankinc/python-bitbankcc.git

Jupyter Notebookで板情報を取得して seaborn で表示したのが下図で、買い板、売り板双方の散布図である。意外にも仲値以外に広く注文が分布していることが見て取れる。

以下がサンプルコードである。[6]

https://gist.github.com/yuyasugano/0a53043bd26e217e550832c690a487e9

以上、次回以降でテクニカル指標や自動取引の構築へ取り組みたい。

--

--

Yuya Sugano
Yuya Sugano

Written by Yuya Sugano

Cloud Architect and Blockchain Enthusiast, techflare.blog, Vinyl DJ, Backpacker. ブロックチェーン・クラウド(AWS/Azure)関連の記事をパブリッシュ。バックパッカーとしてユーラシア大陸を陸路横断するなど旅が趣味。

No responses yet