読者です 読者をやめる 読者になる 読者になる

Pythonと機械学習

Pythonも機械学習も初心者ですが、頑張ってこのブログで勉強してこうと思います。

PoloniexのPush APIを使ってみる

Bitcoin Python

PoloniexのAPIを使ってデータを取得する際にPush APIというものがあるらしいです。

PoloniexのAPI解説ページに行くと、いきなりPush APIの説明が出てきてWAMP protocolで通信する必要があり、環境をセットアップしなければならない等ややこしいので挫折していましたが、頑張って読んでみました。

Push APIとは

通常API(Public APIと呼びます)を使ってデータを取得する際には、自分のPCからPoloniexのサーバーに対して、コマンドを打ってやるのが普通です。

Push APIを使うと自分のPCを待機状態にしておいて、Poloniexサーバーが配信するデータを取得する様になります。

Poloniex側からすると、頻繁にユーザー側からアクセスされるとサーバーの負荷が高くなるので、自分からデータを配信した方が都合がいいのでしょうね。

先ずこれを使え!ということでAPI解説ページの一番最初にどどーんと書いてあるのだと思います。

ちなみに通常のPublic APIを使ってこちら側からPoloniexにアクセスする際は、1秒間に6回以上アクセスしたり、不必要なアクセスを頻繁に繰り返したりすると、そのIPアドレスでの通信が拒否されてしまうみたいなので気を付けましょう。

環境セットアップ

Windows環境での注意点

Push APIでは、twistedという、ウェブ通信の際にイベントを制御するモジュールが必要です。

Python 2.7.x(windows 32bit)環境では、twistedのインストールの際に、VCForPython27.msiが必要になるので前もってインストールしておきます。

また、Windows環境ではtwistedがSSL通信の際に、適切なpemファイルを利用していないらしいです。pipでcertifiモジュールをインストールして、C:\Python27\Lib\site-packages\certifi\cacert.pem環境変数SSL_CERT_FILEに追加してやる必要があります。

pip install -U certifi

f:id:darden:20160914214118p:plain

Linux環境では、これらの設定は不要です。

結局Push APIを使うためには、以下3つのモジュールが必要になります。

  • service_identity : 安全な通信を確保するモジュール(twistedの中で使われます)
  • twisted:ウェブ通信の際にイベントを制御するモジュール
  • autobahn : WAMP protocol通信モジュール

全部pipでインストールできます。

pip install -U service_identity

pip install -U autobahn[twisted]

autobahnのインストール時に、後ろに[twisted]を付けてやるとtwistedも一緒にインストールしてくれます。

twistedの代わりにasyncioというモジュールを使ってもいいみたいですが、私の環境ではインストールに失敗するのでやめときました。

Push APIの使い方

Githubpython-poloniexにいい使用例がありました。

Tickerデータの取得

python-poloniex/examples/localticker/tickcatcher.pyを実行した例です。 (なぜかmasterリポジトリから消されちゃっていたので、リポジトリの履歴からとってきて私のGistにコピーしておきました。)

以下のようにTicker情報がひたすら出てきます。

2016-09-14T21:30:40+0900 ["ETH_ETC", "0.10500012", "0.10637008", "0.10518075", "-0.03958980", "6266.83006829", "58319.20657130", 0, "0.10990009", "0.10500012"]
2016-09-14T21:30:40+0900 ["USDT_ETC", "1.27740052", "1.27780053", "1.26747443", "-0.04076603", "16024.85629873", "12307.82375842", 0, "1.33168817", "1.26373645"]
2016-09-14T21:30:41+0900 ["BTC_LTC", "0.00627324", "0.00627324", "0.00627209", "0.00137278", "164.92006178", "26214.53106657", 0, "0.00632822", "0.00624042"]
2016-09-14T21:30:41+0900 ["BTC_NAUT", "0.00063991", "0.00063999", "0.00062800", "-0.04829114", "186.86501724", "284203.50349198", 0, "0.00071498", "0.00060952"]
2016-09-14T21:30:41+0900 ["BTC_XMG", "0.00005128", "0.00005129", "0.00005020", "-0.06763636", "13.33193161", "260676.12426660", 0, "0.00005527", "0.00005000"]
2016-09-14T21:30:41+0900 ["USDT_DASH", "12.68820773", "12.68820773", "12.57185946", "0.01928693", "4118.61847032", "322.92564384", 0, "13.20000000", "12.14683296"]
2016-09-14T21:30:41+0900 ["USDT_LTC", "3.85000026", "3.88920632", "3.85300001", "-0.00413281", "1946.92357809", "503.35815704", 0, "3.88999336", "3.83000000"]
2016-09-14T21:30:41+0900 ["USDT_XRP", "0.00598212", "0.00599828", "0.00591834", "-0.00581177", "464.17317620", "77778.74832706", 0, "0.00603519", "0.00586408"]
2016-09-14T21:30:41+0900 ["XMR_BLK", "0.00315705", "0.00332562", "0.00308308", "-0.00772248", "55.81983362", "17724.81799374", 0, "0.00361906", "0.00300000"]
2016-09-14T21:30:41+0900 ["XMR_NXT", "0.00194450", "0.00196945", "0.00184514", "-0.04699591", "168.94234545", "89703.10494068", 0, "0.00200265", "0.00178366"]
2016-09-14T21:30:41+0900 ["XMR_QORA", "0.00001076", "0.00001291", "0.00001113", "0.45997286", "189.02721224", "15666138.21376823", 0, "0.00001400", "0.00000803"]
2016-09-14T21:30:41+0900 ["USDT_ETH", "12.05000000", "12.09999999", "12.00000840", "-0.01067323", "254119.56442651", "20668.19933673", 0, "12.89887766", "11.98000001"]
2016-09-14T21:30:41+0900 ["BTC_RADS", "0.00080161", "0.00080601", "0.00080096", "0.05636234", "26.20361079", "33459.37374748", 0, "0.00085702", "0.00071620"]
2016-09-14T21:30:41+0900 ["BTC_STEEM", "0.00094508", "0.00095939", "0.00094508", "-0.08727606", "212.75679225", "217668.35081231", 0, "0.00105676", "0.00094003"]
2016-09-14T21:30:41+0900 ["ETH_ETC", "0.10500012", "0.10637007", "0.10518075", "-0.03958980", "6266.83006829", "58319.20657130", 0, "0.10990009", "0.10500012"]
2016-09-14T21:30:41+0900 ["USDT_ETC", "1.27740052", "1.27780053", "1.26747445", "-0.04076603", "16024.85629873", "12307.82375842", 0, "1.33168817", "1.26373645"]
2016-09-14T21:30:42+0900 ["BTC_BTM", "0.00052629", "0.00052629", "0.00050086", "0.61156872", "109.51679080", "223362.83019093", 0, "0.00062999", "0.00028601"]
OrderBookとTradesデータの取得

5行目のonTick関数の引数に、**kwargsを追加してやります。

def onTick(*args, **kwargs): 

また、11行目の'ticker'を好きな通貨ペアに変えてやります。

yield self.subscribe(onTick, 'USDT_BTC')

以下スクリプトの出力になります。

2016-09-14T21:58:28+0900 [{"data": {"rate": "646.09650000", "type": "ask"}, "type": "orderBookRemove"}, {"data": {"rate": "646.07550000", "type": "ask", "amount": "4.55650500"}, "type": "orderBookModify"}]
2016-09-14T21:58:28+0900 [{"data": {"rate": "613.81200516", "type": "bid", "amount": "0.04731174"}, "type": "orderBookModify"}]
2016-09-14T21:58:28+0900 [{"data": {"rate": "598.42055622", "type": "bid"}, "type": "orderBookRemove"}]
2016-09-14T21:58:28+0900 [{"data": {"rate": "612.68840855", "type": "bid", "amount": "0.02270308"}, "type": "orderBookModify"}]
2016-09-14T21:58:28+0900 [{"data": {"rate": "612.68840855", "type": "bid"}, "type": "orderBookRemove"}]
2016-09-14T21:58:30+0900 [{"data": {"rate": "613.81200516", "type": "bid"}, "type": "orderBookRemove"}]
2016-09-14T21:58:31+0900 [{"data": {"rate": "613.82200516", "type": "bid", "amount": "0.04731174"}, "type": "orderBookModify"}]
2016-09-14T21:58:31+0900 [{"data": {"rate": "646.07550000", "type": "ask"}, "type": "orderBookRemove"}, {"data": {"rate": "646.06500000", "type": "ask", "amount": "4.55650500"}, "type": "orderBookModify"}]
2016-09-14T21:58:31+0900 [{"data": {"rate": "612.68840854", "type": "bid", "amount": "0.02270308"}, "type": "orderBookModify"}]
2016-09-14T21:58:31+0900 [{"data": {"rate": "613.81200516", "type": "bid", "amount": "0.00013651"}, "type": "orderBookModify"}]
2016-09-14T21:58:31+0900 [{"data": {"rate": "602.82340202", "type": "bid", "amount": "0.00103474"}, "type": "orderBookModify"}]
2016-09-14T21:58:31+0900 [{"data": {"rate": "612.68840854", "type": "bid"}, "type": "orderBookRemove"}]
Trollbox Messages(チャットメッセージ)の取得

11行目の'ticker''trollbox'に変えてやります。

yield self.subscribe(onTick, 'trollbox')

以下スクリプトの出力です。

2016-09-14T22:06:16+0900 ["trollboxMessage", 10422633, "Skellige", "GRC soon +50%", 3]
2016-09-14T22:06:16+0900 ["trollboxMessage", 10422634, "mpet85", "xem ?", 0]
2016-09-14T22:06:18+0900 ["trollboxMessage", 10422635, "tobidooptizaebal", "jyri64, i stop i cant luagh", 0]
2016-09-14T22:06:19+0900 ["trollboxMessage", 10422636, "beammeup", "howdoyoulikedemapples, the hairy edge? your guess?", 15]
2016-09-14T22:06:22+0900 ["trollboxMessage", 10422637, "StrattonOakmont", "it just won't do it heh-  but at least on the bright side it's not going below 550", 179]
2016-09-14T22:06:26+0900 ["trollboxMessage", 10422638, "medeirosbr", "Today BURST with a big volume", 0]
2016-09-14T22:06:28+0900 ["trollboxMessage", 10422639, "Zoner", "MrGoodlife, As they claim, you cash gone really become a shadow  :p", 51]
2016-09-14T22:06:34+0900 ["trollboxMessage", 10422640, "tobidooptizaebal", "jyri64, hey ,man you are funny as hell", 0]
2016-09-14T22:06:39+0900 ["trollboxMessage", 10422641, "StrattonOakmont", "I've observed FCT to live in teh upper 400's for  a month or so", 179]