025_株グラフ

仮想通貨の価格を取得して分析するプログラミング解説~データベース構築&コード解説編~

株や仮想通貨などの金額を定期的に自動で取得したり、取得した金額を分析したいと思ったことはありませんか?

そんな方に、おススメの自動で価格を取得できるコードをご紹介します(^_-)-☆しかも同時に3つの仮想通貨を表示できちゃいます。

こんな方におススメ(*´▽`*)
・株や仮想通貨を分析したい
・決まった時間にデータを取得する方法を知りたい
・データベースを作ってみたい

今回も使用する技術のカギとなるのはWeb APIですが、前回のように取得したデータを文字列として表示するだけに留まらず、なんと今回は取得したデータをデータベースに保存し、グラフを作成するところまでやっちゃいます!

しかも、10分に1回取得するといった決まった時間に取得できるように設定していきます('◇')ゞ つまり細かな値動きをローカル上で視覚化できるコードです。

概要

今回作成するコードの仕様を少し詳しく説明すると、次のようになります(=゚ω゚)ノ

1、bitbank(仮想通貨取引所)のAPIを利用して10分に1回の間隔で仮想通貨の価格を自動で取得して、データベース(postgresSQL)に保存
https://docs.bitbank.cc/
2、取得する仮想通貨はビットコイン、イーサリアム、モナの3つ
3、データベースに保存した金額をグラフで表示させて分析
(PCのローカル上でのグラフ表示)

今回学べる技術は、(・・?

・簡単な処理を定期的に自動的に実行するスケジューラの設定方法
・簡易データベースの構築(データベースへのデータ挿入方法)


です!

以前ご紹介した空室検索アプリ、レストラン検索アプリに続き、サーバーは今回もHerokuを使いますが、この記事を読んでいただければ、スケジューラの設定やデータベースへのデータ挿入方法の基本イメージがおわかりいただけるようになると思います( `ー´)ノ
なおHerokuの設定方法や作成したソースコードの実行方法は後編の記事(無料)にて解説しています。

データベース構築とそのグラフ化は様々なシーンで活用できると思います('ω')ぜひ基となる部分を覚えて、自分なりにカスタマイズしてみてください。

完成したグラフのサンプル

コード解説の前に、最終的に出力されるグラフとその表示形式をご紹介します!
BTC、ETH、MONAの3つの価格を取得しますので、グラフも1つ表示、2つ表示、3つの価格をまとめて表示させるそれぞれの方法をご紹介します(*^^)v

①1つだけ表示させる場合

画像1

横軸に取得時間、縦軸に金額を表示させるシンプルなグラフです。

②2つ表示させる場合

画像2

横軸は1つの場合と変わらず取得時間ですが、縦軸は右と左にそれぞれの単価を表示させるグラフになります。
2つのグラフの選択は実行時に任意に設定できるコードになっています。

③3つ全部表示させる場合

画像3

このグラフも横軸は他と同様ですが、縦軸は3つを比較して分析できるようにそれぞれを正規化(標準化)して表示させています。

3つの価格を分析する際には、
・3つの価格の相関係数を算出
・相関がある場合は、正規化(標準化)して比較すると相対的に割安な通貨がわかる

という仮説が立てられるので、つまりグラフを見るとどの通貨を買うべきかがわかるということなんですね。あくまで仮説が正しく、今後も値動きが同様であれば、ということですが…( ゚Д゚)

相関係数とは (´・ω・)?
-1から1までの値をとり、-1や1に近いほど強い相関を表し、0に近いほど相関がないという指標だよ~
正規化とは (´・ω・)?
統計における標準化のことだよ。
平均0、分散1に変換する操作のことを言うんだけど、こうすることで本来別々の仮想通貨であるそれぞれの価格を比較しやすくできるんです。

今回は、以上紹介した3種類のグラフの表示方法をそれぞれ解説していきますが、3つも必要ないという方はご自身が希望するグラフの表示方法だけ覚えてみてくださいね。

プログラムの全体像を決める

まず、いつものようにプログラムの全体像を決めます。今回も、メンテナンスのしやすさ等を考慮して、次の2つのファイルに分けて、作成することとします。①APIから仮想通貨の価格を取得して、データベースに保存するプログラム②保存したデータをデータベースから取り出してグラフを表示させるプログラムの大きく2つに分けます。

ファイルの構成

ファイル構成は以下のようにしています。

画像4

メインのファイルは先にご説明したbitbank_api.pybitbank_graph.pyの2つに分けていますが、それ以外のファイルとして、以下の2つを用意しています。

runtime.txt

python-3.7.3

requirements.txt

requests
psycopg2

“psycopg2”はデータベース(postgresSQL)に接続・実行するためのモジュールの一つで、その中でも特にポピュラーなものとされています。
続いてはいよいよメインのファイル2つです。まず次のファイルでは、bitbankのAPIをたたき、データを取得する処理を行っています。

bitbankのAPIを利用してデータを取得するプログラムを作る(bitbank_api.py)

まずは、bitbankのAPIからデータを取得するまでを考えましょう。
APIからデータ取得する際にはいつものようにまず公式のドキュメントを確認して、どんな値を入力パラメータとして設定すればいいかを確認します。

今回取得したいのは、「ビットコイン」「イーサリアム」「モナコイン」の価格になりますので、それらの価格の取得方法を確認します。

https://public.bitbank.cc/{pair}/ticker

ドキュメントを確認すると上記のようにURLに取得したい通貨ペアのパラメーター及び"/ticker"をつけることで価格を取得できることがわかります。

試しにURLをたたいてみましょう。

https://public.bitbank.cc/btc_jpy/ticker

{
 "success": 1,
 "data": {
   "sell": "902249",
   "buy": "901478",
   "high": "950000",
   "low": "896001",
   "last": "901474",
   "vol": "941.5685",
   "timestamp": 1570850881887
 }
}

するとこのように正常なレスポンスが確認できます。bitbankのAPIは他のAPIと違って、登録してAPIキーを入力パラメーターとして設定する必要がありませんので、だれでもこのURLをたたけばAPIからデータを取得することができます。(2019年7月時点)。いちいち情報の入力やメール確認をしなくて済むのは助かりますね(^^♪

URLとURLパラメータを設定

今回もrequestsライブラリーを使ってURLとパラメーターを設定します。

import requests

urls = ["https://public.bitbank.cc/btc_jpy/ticker",\
      "https://public.bitbank.cc/eth_btc/ticker",\
      "https://public.bitbank.cc/mona_jpy/ticker"]

まずは、上記のようにURLに取得したいパラメーター(ビットコイン、イーサリアム、モナコイン)を指定しますが、今回はそれぞれ別々にデータを取得したいので、3つのURLを用意し、リスト型でそれぞれを取得できるようにします。

APIへ接続し辞書形式でデータを得る

次にいつものように、APIに接続するための処理を書きます。

 try:
      r = requests.get(url, timeout=5)
      r = r.json()
  except:
      print("Error!")

まず、GET通信で、requestsライブラリの関数json()により変数contentにデコードしたjsonデータを辞書として格納します。

 results = []
 
 try:
      r = requests.get(url, timeout=5)
      r = r.json()
      results.append(r)
  except:
      print("Error!")

一定時間(10分間隔など)間隔で、データを取得したいので、取得したデータを入れる箱として変数"results"を空のリストとして用意します。そして、順番に入れられるように、appendで追加していきます。appendで追加しないと、取得するたびに上書かれてしまうので注意しましょう。

万が一、データが取得できなかった時のためにプログラムが止まらないようにtry~except文として、エラーの場合は、コンソール上に「Error!」と表示させるようにして、

さらに、3つの通貨を順番に取得したいので、try~except文をfor文で囲み、3つの通貨を順番に取得できるようにします。

エラーの書き方については、様々な方法があり、以下のサイトで詳しく解説していますので、ぜひご覧ください。

import requests

urls = ["https://public.bitbank.cc/btc_jpy/ticker",\
      "https://public.bitbank.cc/eth_btc/ticker",\
      "https://public.bitbank.cc/mona_jpy/ticker"]
results = []

for url in urls:
  try:
      r = requests.get(url, timeout=5)
      r = r.json()
      results.append(r)
  except:
      print("Error!")
      results = False
      break

ココまででできたコードが上記になりますので、一旦プログラムを実行してエラーが出ないか確認しましょう。

>>> print(results)

[{'data': {'buy': '903481',
          'high': '950000',
          'last': '903482',
          'low': '896001',
          'sell': '903482',
          'timestamp': 1570852359547,
          'vol': '934.1306'},
 'success': 1},
{'data': {'buy': '0.02205821',
          'high': '0.02260000',
          'last': '0.02206077',
          'low': '0.02163124',
          'sell': '0.02208384',
          'timestamp': 1570852272684,
          'vol': '1432.8622'},
 'success': 1},
{'data': {'buy': '126.610',
          'high': '129.500',
          'last': '126.893',
          'low': '124.457',
          'sell': '126.893',
          'timestamp': 1570852341476,
          'vol': '1037209.0508'},
 'success': 1}]

上記のように取得できました。取得できたJSON内には記載がありませんが、ビットコイン、イーサリアム、モナコインの順番にデータを取得しているので、その順番通りに3つ同じ出力形式で出力されています。

取得データを加工

それでは、取得したデータの中から必要なデータを取得して、加工していきます。
まず、ビットコインの価格を取得したいのですが、ビットコインは、3つある'data'の中の0番目のdataを使います。その中の(key:'last')を使うこととします。同様にイーサリアムは1番目、モナコインは2番目になるので、コードにすると以下のようになります。

if results: 
  btc = results[0]["data"]["last"] 
  eth = results[1]["data"]["last"] 
  mona = results[2]["data"]["last"] 

ココで、今まで解説していませんでしたが、実は、ビットコインとモナコインは、それぞれの通貨当たりの日本円での価格で取得していますが、イーサリアムは、1イーサリアムあたりのビットコイン価格になっているので、他のコインと同様に、それぞれの通貨当たりの日本円価格に変換します。

from decimal import Decimal

-----中略------

eth = Decimal(btc) * Decimal(eth) 

そこで、正確な数値を算出できるモジュールの"decimal”を利用します。1ビットコイン当たりの日本円価格と、1イーサリアム当たりのビットコイン価格を掛けると、イーサリアム当たりの日本円価格が取得できます。

ここから先は

11,809字 / 6画像

¥ 1,200

この記事が気に入ったらサポートをしてみませんか?