akiyoko blog

akiyoko の IT技術系ブログです

「fin-pyもくもく会 #6」に参加してきました

主催

fin-py

会場

株式会社インタートレード
東京都中央区新川一丁目17番21号 茅場町ファーストビル3階

Twitter

twitter.com



Poloniex ではないですが、Coincheck様にはいつもお世話になっています。


ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin
ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin



 

全体の感想など

「fin-py もくもく会」に初参加してきました。
11時から19時までの長丁場だったのですが、前日に夜間リリースがあったので、徹夜明けでの参加となりました。

朝の5時にリリース作業が終わり、「食のテーマパーク」になるとかいう噂の築地で朝食を食べて、一旦チャージ。

小田保

食べログ小田保


まだまだ時間があったので、銀座のマンガ喫茶で「アイアムアヒーロー」を軽い気持ちで読み始めたら、続きを読まないと気持ち悪くなってきてあまり寝れず。。


という感じで、あまり体調の良くない中での参加となりました。


会場に行ってみると、20人ほどのメンバーでほぼ満員。常連の方が多いように見えましたが、私を含め初参加の方もちらほら。プログラマやエンジニアの方が多かったでしょうか、肌に合っている感じがしました。




 

やりたかったこと

「Poloniex API を使ったロボアドを作ろう」

Poloniex で取り引き可能な数あるオルトコインの中から、ある程度の売買ボリュームがあり、ボリンジャーバンドのマイナス 2σ 近くに下がってきたコインの情報を教えてくれるロボアドバイザーを作ってみよう、というテーマで進めてみました。


きっかけは、日経ソフトウェア 7月号で「Python で「ビットコイン」システムトレード」という連載が始まったということを知り、早速買って読んだところから。



私のバックグラウンドとしては、Python歴は 5〜6年。ただし、EdTech 方面が中心で FinTech は全く経験無し。

投資はピカピカの一年生で、最近何冊か本を読んだだけ。メンバーの FinTech 用語(株用語?)に何度か着いていけなくなりましたが、まだまだこれから勉強です。


参考

Poloniex API
https://poloniex.com/support/api/


実行環境

  • macOS Sierra 10.12.6
  • Python 3.5.2(Anaconda 4.2.0)
  • Jupyter Notebook


 

やったこと

まずは、実行環境の構築から。
Python や Jupyter Notebook の構築には、Pyenv を使っています。

$ pyenv install anaconda2-4.2.0
$ pyenv global anaconda2-4.2.0
$ pyenv rehash

《過去記事》
akiyoko.hatenablog.jp


次に、「python-poloniex」という非公式ライブラリをインストールします。

$ pip install https://github.com/s4w3d0ff/python-poloniex/archive/v0.4.3.zip

(参考)


小手調べに、Poloniex API が扱っているアルトコインのリストを出してみます。

% matplotlib inline

import time
from datetime import datetime

import matplotlib.pyplot as plt
import pandas as pd
import poloniex

pd.options.display.max_rows = 20
plt.style.use('ggplot')

polo = poloniex.Poloniex(timeout=10, coach=True)
[(k, v['name']) for (k, v) in polo.returnCurrencies().items()]
[(u'XVC', u'Vcash'),
 (u'SRCC', u'SourceCoin'),
 (u'EXE', u'Execoin'),
 (u'WC', u'WhiteCoin'),
 (u'MIL', u'Millennium Coin'),
 (u'MIN', u'Minerals'),
 (u'NOBL', u'NobleCoin'),
 (u'NAS', u'NAS'),
 (u'NOTE', u'DNotes'),
 (u'CCN', u'Cannacoin'),
    ・
    ・

ということで、285種類ほどありました。



次に、BTC/USD のチャートデータから、5分足チャートを100本分取得してみます。
「coach=True」を使うことで、API の利用制限に引っ掛からないように調整しながら API コールをしてくれるようです。

polo = poloniex.Poloniex(timeout=10, coach=True)
period = polo.MINUTE * 5  # polo.DAY
tick = 100
chart_usdt_btc = polo.returnChartData('USDT_BTC', period=period, start=time.time() - period * tick)
chart_usdt_btc
[{u'close': u'2547.88327288',
  u'date': 1498401300,
  u'high': u'2562.35094814',
  u'low': u'2540.9878283',
  u'open': 2560,
  u'quoteVolume': u'178.68276651',
  u'volume': u'455680.07147934',
  u'weightedAverage': u'2550.21835837'},
 {u'close': u'2534.75773305',
  u'date': 1498401600,
  u'high': u'2547.93614683',
  u'low': u'2529.50957325',
  u'open': u'2547.88327288',
  u'quoteVolume': u'96.17031996',
  u'volume': u'243915.59281282',
  u'weightedAverage': u'2536.28762922'},
    ・
    ・

といったチャートデータが取得できます。


取得したデータを線グラフとしてプロットします。

'rmean' は移動平均を計算しています。

df = pd.DataFrame(chart_usdt_btc)
df['date'] = df['date'].apply(lambda x: datetime.fromtimestamp(x))
df['open'] = df['open'].astype(float)
df['close'] = df['close'].astype(float)
df['volume'] = df['volume'].astype(float)
# SMA (Simple Moving Average) is explained at https://coins.newbium.com/post/1873-indicator-on-poloniex-what-is-that
df['rmean'] = df['close'].rolling(window=50).mean()
df['rstd'] = df['close'].rolling(window=50).std()
df['upper_band'] = df['rmean'] + df['rstd'] * 2
df['lower_band'] = df['rmean'] - df['rstd'] * 2
df.plot(x='date', y=['close', 'rmean', 'upper_band', 'lower_band'])

f:id:akiyoko:20170731003928p:plain



売買ボリュームとチャートに関連があるか見たかったので、同じグラフにプロットしてみます。「secondary_y」オプションを使うと便利です。

ax = df.plot(x='date', y='close')
df.plot(ax=ax, x='date', y='volume', secondary_y=True)

f:id:akiyoko:20170731004901p:plain



最後に、移動平均からの乖離が「何σ」かを算出してみます。

df_latest = df.tail(5)
((df_latest['close'] - df_latest['rmean']) / df_latest['rstd']).values
array([-0.04303016,  0.52402959,  0.31290352, -0.33566383, -0.22423144])


という感じで進めていきました。


github.com



他の LT からの情報

Dash
https://plot.ly/dash/getting-started

pandas のデータが食える。
中身は plotly。フリーで使える(PRICING はサポート?)。D3.js を使っているので SVGではなく HTML。
同じようなプロット機能を持つ bokeh は、オンマウスとかを作り込まないといけないのでその点がイケてないとか。