「API」って何?仮想通貨の価格データをAPIで取得してみよう

さて、前回までの記事を読んだ方であれば、現在時刻を取得してAnacondaプロンプトに表示するプログラムを、Pythonで書くことができたはずです。これであなたもプログラマーです!

これは別に冗談ではありません。

前回の記事では、自分で複雑なプログラムを書けなくても、最初に「import datetime」と記述することで、賢い人たちが開発したdatetimeというプログラム集を、そのまま借りて使うことができました。基本的な考え方はこれと同じです。

仮想通貨の売買を自動化するBOTを作成するときも、基本的には、取引所が提供している「API」や、他の賢いプログラマの人たちが開発している「ライブラリ」をそのまま使います。

まずは「API」というのが何なのか、簡単に理解しておきましょう。

「API」とは何か?

「APIを叩いてJSONをパースして….」とかっていう会話を聞くと、「り、理系ってすごい….何でも出来てカッコいいなぁ…」と思ってしまいがちです。

しかしAPI自体は、別に難しいものではありません。

要するに、APIというのは外部のサーバーに対して、何らかの指示(命令)をWEB経由で送るためのコマンドのようなものだと思ってください。自分でAPIを作るのは難しいですが、外部サーバーが用意してくれているAPIを使わせて貰うのは全然難しくありません(笑)

例えば、以下はAPIの1つの例です。このURLをそのままブラウザのURL欄に入力してみてください。

https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc?periods=86400&after=1514764800

リンクはこちら

ブラウザに打ち込むだけで構いません。
すると、以下のような画面が表示されたはずです。

はい!
これであなたも「APIを叩く」ことができました。

これは、実は、Bitflyerの2018年1月1日以降のビットコインの日足の価格データを取得するAPIです。
cryptowatchというサイトが用意してくれているAPIです。

このCryptowatchというサイトには、世界各国の取引所の多くの仮想通貨(BTC/ETH/XRP…)の価格データが蓄積されています。さらにサイト側がAPIを用意してくれているので、あなたは上記のURLを入力するだけで、cryptowatchのサーバーから、ありがたく価格データを引っ張ってくることができます。

「API」で取得したデータの中身

本質的には、APIを利用することと、WEBサイトを閲覧することは同じ行為です。どちらも外部のサーバにURLでリクエストを送って、サーバー側から情報を引っ張ってくる行為です。

ただしAPIの場合は、基本的には引っ張ってくるのは「プログラムで使うためのデータ」です。人間の目で見るためのWEBページではありません。そのため、デザイン・空白・装飾・改行といった邪魔なものはすべて取り払われています。

シンプルにデータ(数字)が決められた順番で、カンマで区切られて並んでいます。この形式の方がプログラムで扱いやすいからですね。例えば、取得されたデータの先頭部分を抜き出してみましょう。
以下のように記載されています。

{"result":{"86400":[[1514764800,1519999,1713306,1502242,1675100,20188.11,32083065000]

これは何を意味しているのでしょうか。

まず86400は「日足データ」を意味しています。
プログラムに慣れてくるとわかりますが、これは「86400秒」の意味です。つまり「1日」と同じ単位です。機械は大きな数を扱うのが得意なので、1時間・1日・1週間などと言われるよりも、3600秒・86400秒・604800秒と言われた方が、扱いやすいんですね。

その次に続く[]の中に含まれた数字を見てみましょう。
それぞれ以下になります。

1514678400 ・・・ UNIX時間で「2017/1/1 09:00:00」の意味
1519999 ・・・ この日のビットコインの始値 151万9999円
1713306 ・・・ この日のビットコインの高値 171万3306円
1502242 ・・・ この日のビットコインの安値 150万2242円
1675100 ・・・ この日のビットコインの終値 167万5100円
20188.11 ・・・ この日の出来高

なぜこれらの数字が日付とか、高値・安値とか、出来高を意味するとわかるのでしょうか? それは、CryptowatchのAPI仕様書にそう書いてあるからです(笑) 今は読まなくていいですが、以下のページをチラっと覗いてみてください。

CryptowatchのAPI仕様書

そこにこう書いてあります。

values are in this order:
[ CloseTime , OpenPrice , HighPrice , LowPrice , ClosePrice , Volume]

(訳):
数字はこの順番で並んでいます:
[ 日時 , 始値 , 高値 , 安値 , 終値 , 出来高 ]

APIは各サービスが独自に提供しているものなので、返ってきたデータが何の数字で、どの順番で並んでいるかを理解するには、そのAPIの仕様書を読む必要があります。

最初は億劫に感じるかもしれませんが、APIの意味を知りたければ、Googleで検索して出てきたブログを読むよりも、公式サービスが提供しているAPI仕様書を読んだ方がわかりやすいですし確実です。

APIを送るコマンドの仕組み

先ほどのAPIのコマンドは「Bitflyerの2018年1月1日以降の日足価格データを取得するAPIだ」と説明しました。もう1度、さっきのURLを見てみましょう。

https://api.cryptowat.ch/markets/bitflyer/btcjpy/ohlc?periods=86400&after=1514764800

URLの中に、以下のような文字列が入っていますね?

bitflyer ・・・ 取引所の名前
btcjpy ・・・ BTC/円の通貨ペア
periods=86400 ・・・ 日足
after=1514764800 ・・・ UNIX時間で「2018/01/01 09:00:00」以降

カンの良い方ならわかると思いますが、「bitflyer」の部分を「poloniex」に換えればpoloniexの価格データが見れます。

poloniexにはJPY通貨ペアはないので、USDT(デザー)建てで調べてみましょう。ついでに価格データは週足で取得して、期間は2017年1月以降にしてみましょう。

以下のようなURLになるはずです。

https://api.cryptowat.ch/markets/poloniex/btcusdt/ohlc?periods=604800&after=1483228800

※ 「bitflyer」を「poloniex」に変更、「btcjpy」を「btcusdt」に変更、「periods=86400」を「periods=604800」に変更、「after=1514764800」を「after=1483228800」に変更

APIを叩いてみると、以下のような結果が得られます。

※ なお、「2017年1月1日 午前9時0分0秒」をUNIXスタンプ(1483228800)に変換するには、以下のようなサイトを使います。

UNIXタイムスタンプ変換サイト

色々とパターンを変えてブラウザに入力してみてください。
何も表示されなければ、その価格データはサーバーに存在しないという意味です。

(練習問題)
・2015年1月のリップル(XRP)の価格をpoloniexからBTC建てで取得してみよう!

APIを使うのは難しくない

これであなたもCryptowatchのAPIを使いこなすことができました。意外と難しくなかったですよね?(笑)

ただし初対面のAPIを自力で使いこなすためには、APIの仕様書だけは読まなければなりません。すべてのAPIの意味を手取り足取り教えてくれるブログはありません。

今回のURLも、なぜこの順番(markets/取引所名/通貨ペア/ohlc?periods=ローソク足の時間軸)で記述するのかは、API仕様書を見なければわかりません。

ただし仕様書を読むといっても、長い英語のAPI仕様書を先頭から全部読みこむ必要は全くありません。何となく「やりたいこと」を書いてそうな部分にアタリを付ければいいだけです。

例えば、上記のAPI仕様書であれば、F3キーを使って「price」と単語をページ内で検索します。これはただのカンです。すると大体、何カ所かに読む場所を絞ることができます。ざっとスクロールしてみて、「High price(高値)」「Volume(出来高)」などの単語にピンと来れば、すぐに該当箇所を特定することができます。

(英語が苦手な方は、最初に右クリックで「日本語に翻訳」して「価格」でページ内検索してみてください。プログラムの仕様書などは、かなり読めるレベルで翻訳できます。)

さて、APIが何かを理解したところで、次はいよいよ取引所のAPIを利用してみましょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です