タイトル
fin-pyもくもく会 #6 - connpass (2017.6.24)
fin-py.connpass.com
主催
会場
株式会社インタートレード
東京都中央区新川一丁目17番21号 茅場町ファーストビル3階
全体の感想など
「fin-py もくもく会」に初参加してきました。
11時から19時までの長丁場だったのですが、前日に夜間リリースがあったので、徹夜明けでの参加となりました。
朝の5時にリリース作業が終わり、「食のテーマパーク」になるとかいう噂の築地で朝食を食べて、一旦チャージ。
- ジャンル:定食・食堂
- 住所: 中央区築地6-26-1 3F
- このお店を含むブログを見る |
- (写真提供:ドライチッチ)
- 小田保をぐるなびで見る | 築地の定食・食事処をぐるなびで見る
まだまだ時間があったので、銀座のマンガ喫茶で「アイアムアヒーロー」を軽い気持ちで読み始めたら、続きを読まないと気持ち悪くなってきてあまり寝れず。。
という感じで、あまり体調の良くない中での参加となりました。
会場に行ってみると、20人ほどのメンバーでほぼ満員。常連の方が多いように見えましたが、私を含め初参加の方もちらほら。プログラマやエンジニアの方が多かったでしょうか、肌に合っている感じがしました。
やりたかったこと
「Poloniex API を使ったロボアドを作ろう」
Poloniex で取り引き可能な数あるオルトコインの中から、ある程度の売買ボリュームがあり、ボリンジャーバンドのマイナス 2σ 近くに下がってきたコインの情報を教えてくれるロボアドバイザーを作ってみよう、というテーマで進めてみました。
きっかけは、日経ソフトウェア 7月号で「Python で「ビットコイン」システムトレード」という連載が始まったということを知り、早速買って読んだところから。
私のバックグラウンドとしては、Python歴は 5〜6年。ただし、EdTech 方面が中心で FinTech は全く経験無し。
投資はピカピカの一年生で、最近何冊か本を読んだだけ。メンバーの FinTech 用語(株用語?)に何度か着いていけなくなりましたが、まだまだこれから勉強です。
実行環境
- 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
(参考)
- GitHub - s4w3d0ff/python-poloniex: Poloniex API wrapper for Python 2.7 & 3
- PoloniexのAPIを使ってBitcoin価格データの取得 - Pythonと機械学習
小手調べに、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'])
売買ボリュームとチャートに関連があるか見たかったので、同じグラフにプロットしてみます。「secondary_y」オプションを使うと便利です。
ax = df.plot(x='date', y='close') df.plot(ax=ax, x='date', y='volume', secondary_y=True)
最後に、移動平均からの乖離が「何σ」かを算出してみます。
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])
という感じで進めていきました。
他の LT からの情報
Dash
https://plot.ly/dash/getting-started
pandas のデータが食える。
中身は plotly。フリーで使える(PRICING はサポート?)。D3.js を使っているので SVGではなく HTML。
同じようなプロット機能を持つ bokeh は、オンマウスとかを作り込まないといけないのでその点がイケてないとか。