Coingecko APIとGridDBを用いて、暗号市場からヒストリカルデータを収集する
暗号通貨は、ビットコインなどの主要なものの価格が記録的な価格に達して以来、世界中の注目を集めています。従来の金融市場とは異なり、暗号通貨はブロックチェーンと呼ばれるオープンな台帳が基盤となっており、マイナーのネットワークによって取引が検証され、暗号技術によって安全性が確保されています。
金融市場の分析は、その仕組みを理解することで予測を立てたり、理解を深めたり、あるいはより広く正確な知識を持って投資を行うための前提条件となるため、適切なものです。
特に、分散型の仕組み、高いボラティリティ、暗号通貨の短・中期的な動きへの関心の高まりから、このダイナミックな市場で分析や予測を行うことができる、信頼性の高い高速な分析ツールを探すようになってきています。
この記事では、GridDBの機能を使って、ビットコインの価格変動のヒストリカルデータを保存したいと思います。そのために、Coingecko APIに接続します。
また、APIからの情報取得とGridDBへの保存を自動化するPythonスクリプトを開発します。
どのような技術を使用するのか?
この記事では以下の環境を前提に開発を進めることにします。
- OS: Ubuntu 18.04
- Python 3.6!
- GridDB サーバー: last version available v4.5.2
- GridDB C クライアント: v4.5.0
- GridDB Python クライアント: 0.8.3
環境を構築する
まず、Python 3.6をUbuntu 18.04で動作させることから始めます。そして、GridDBサーバーとクライアントの両方が必要になります。
公式リポジトリの指示に従い、まず、公式リリースリンクから.debパッケージをダウンロードし、以下のコマンドでインストールします。
パッケージを取得し、
wget https://github.com/griddb/griddb/releases/download/v4.5.2/griddb_4.5.2_amd64.deb
そして、通常通りインストールします。
sudo apt install ./griddb_4.5.2_amd64.deb
GridDBの環境変数を定義することが重要です。また、gsadmユーザとしてログインし、管理者のパスワードを定義し、ノードを起動する必要があります。
次のステップは、GridDB C クライアントをダウンロードしてインストールすることです。
wget https://download.opensuse.org/repositories/home:/knonomura/xUbuntu_18.04/amd64/griddb-c-client_4.5.0_amd64.deb
sudo apt install ./griddb-c-client_4.5.0_amd64.deb
GridDBのPythonクライアントを使用するための前提条件として、NumpyとPandas、およびSWIGをインストールする必要があります。
wget https://prdownloads.sourceforge.net/swig/swig-3.0.12.tar.gz
tar xvfz swig-3.0.12.tar.gz
cd swig-3.0.12
./configure
make
sudo make install
PythonクライアントはすでにPythonパッケージマネージャで利用可能なので、Ubuntu 18.04でのインストール作業はpipで簡単にできます。
python3.6 -m pip install griddb_python
Pythonコンソールにアクセスすると、griddb_pythonのパッケージが正しくインストールされていることがわかります。
データを取得する
毎日、暗号通貨の市場で生成されるデータを取得するには、いくつかの選択肢があります。今回は説明のために、主要な暗号通貨であるビットコインのヒストリカルデータに焦点を当てます。
ビットコインのようなフィアット通貨の価格の挙動を研究するのは非常に興味深いことです。ビットコインは2009年に正式に誕生しましたが、当初は公的に交換されていなかったため、現在は最初の数年間のデータはありません。もちろん、チェーンの最初のブロックに保存されている取引はありますが、価格は市場によってコントロールされていませんでした。
それでは、Coingeckoからこれらのヒストリカルデータを取得する方法を見てみましょう。まずはPythonクライアントをインストールすることから始めましょう。
python3.6 -m pip install pycoingecko
このAPIの使用方法についての情報が記載されたリポジトリはこちらです。
スクリプトを書くときには、このようにしてCoingeckoライブラリをインポートします。
from pycoingecko import CoinGeckoAPI
同様にPandasもインポートして、データフレームとしてデータを操作できるようにしましょう。
import pandas as pd
まず最初に行うことは、Coingecko API のインスタンスを作成することです。
coingecko = CoinGeckoAPI()
次に、使用する関数を定義します。
まず、get_coin_by_id
APIコールを使用して、指定した暗号通貨のマーケットデータを取得します。この情報をcryptocurrency_data
という辞書に保存し、データフレームに変換することで、csv ファイルにすることができます。
def get_data(cryptocurrency):
cryptocurrency_data = coingecko.get_coin_by_id(cryptocurrency, market_data='true', sparkline='true')
df = pd.DataFrame.from_dict(cryptocurrency_data, orient='index')
df.to_csv(r'cryptocurrency_data.csv')
return df
例えば、'bitcoin'
が利用可能な暗号通貨の1つであることがわかっている場合、以下の処理によってビットコインに関する市場データを取得することができます。
get_data('bitcoin')
そして、csvで得られる情報はこのようになります。
他の暗号通貨を知りたい場合は、coingeckoがサポートするすべての通貨を取得する関数を定義することができます。
def get_available_curr():
return coingecko.get_supported_vs_currencies()
ここで、より具体的な検索を行うために、特定の日付の価格を取得する関数を定義して出力を絞り込むことができます。
# get data about a crypto currency for a specific date
def get_price_by_date(cryptocurrency, a_date):
data = coingecko.get_coin_history_by_id(coin_id, a_date)
price = data['market_data']['current_price']['usd']
return price
最後に、ここでの目標は、ビットコインの価格のヒストリカルデータを取得することです。get_historical_data
という関数がそれを実現してくれます。
ドキュメントによると、日数によってデータの表示方法が決まります。例えば、1日であれば、データは分単位で表示されますが、1日以上90日未満であれば、データは時間単位で表示されます。また、90日以上の場合は、データは1日単位で表示されます。
def get_hsitorical_data(cryptocurrency, fiat_currency, number_of_days):
historic_price = coingecko.get_coin_market_chart_by_id(cryptocurrency, fiat_currency, number_of_days)
prices = [price[1] for price in historic_price['prices']]
return prices
返される変数 prices
はリストです。例えば、過去5日間のビットコインの価格を米ドルで取得するには、次のようにします。
print(get_hsitorical_data('bitcoin', 'USD', 5))
出力は以下のようになります。
[19259.08030258841, 19193.068890063274, 19206.672769667563, 19118.969144726925, 18965.63616668234, 18960.652709654136, 19050.430880588847, 18990.7793634949, 18844.52437618184, 18873.21199220193, 18734.216704469767, 18753.288921684914, 18818.24732423196, 18813.656564419583, 18481.79300558414, 17959.305407026557, 17814.023726259376, 17901.579048072937, 17672.036464087603, 16767.389103553738, 17016.96216829086, 17134.181554772298, 17289.54296210973, 17106.587656105632, 17331.4762052838, 17006.44771520346, 16823.201432127884, 17010.20985595975, 16721.488013156064, 16761.546965177848, 16637.362422462975, 16842.53065248619, 17195.84403474497, 17105.9312737208, 17075.8100346244, 17138.029512395206, 17393.535276669707, 17248.96543684629, 17195.531466234796, 17073.86409154308, 17192.598651467735, 17229.806019685024, 17232.39613479942, 16926.28405241609, 16870.3011306117, 16760.47144801828, 16841.31525546079, 16821.304443182802, 17061.937579188543, 16858.460475364325, 16797.14755015842, 16638.44643803269, 16779.904684746798, 16807.83803236001, 16820.094022073426, 16808.808218210037, 17055.615405688295, 17008.343058249597, 17054.024622349476, 17097.50909797396, 17160.944233312493, 17081.86851776995, 16991.665437686977, 17027.683600569744, 16987.94930527874, 17010.59041345089, 17041.641919991886, 17035.614023573155, 16922.606314865297, 16933.710467900757, 17200.332760677484, 17167.860885749073, 17123.01185956512, 17361.901621171553, 17404.918158919027, 17497.251070586633, 17667.212140138796, 17749.984303735313, 17698.71548702206, 17806.829994664855, 17732.254867093405, 17716.16974243831, 17767.95578065574, 17704.67191022015, 17637.20942656516, 17581.23011590924, 17743.80422275333, 17827.476832589644, 17777.23209954322, 17797.354567421582, 17728.82850859051, 17826.57123916383, 18135.82259357728, 18083.917418061254, 18165.51914403239, 18095.05067283884, 18050.805289775806, 18060.28166508652, 18036.475224790385, 18031.013344442, 18089.37740068174, 18091.290368854792, 18112.333933562346, 18102.92697464547, 18202.5966538826, 18266.287411393914, 18140.052096296262, 18192.645660559352, 18408.78365577349, 18483.289178463645, 18494.51841080122, 18566.892532959428, 18535.14020869768, 18510.032786248743, 18509.742863375064, 18439.96937840414, 18453.345378206308, 18485.314339104578, 18516.004629775616, 18606.395740319094, 18801.45191322498]
まとめ
暗号通貨は日々、投資をするにも、純粋に研究をするにも魅力的になっています。いずれにしても、データにアクセスし、操作し、そこから有用な分析を抽出するためには、常に最先端の技術が必要です。
この記事では、Coingecko APIを使って、米ドルに対するビットコイン価格のヒストリカルデータを抽出する方法を紹介しました。また、取得したデータを保存するために、GridDBとGridDB Pythonクライアントを使用しました。
GridDBを使うことで、このデータを利用するための素晴らしいツールが得られ、時系列分析や、得られた知見に基づいた予測を行うことができるようになりました。
ブログの内容について疑問や質問がある場合は Q&A サイトである Stack Overflow に質問を投稿しましょう。 GridDB 開発者やエンジニアから速やかな回答が得られるようにするためにも "griddb" タグをつけることをお忘れなく。 https://stackoverflow.com/questions/ask?tags=griddb