ビットコインをはじめとする暗号資産(仮想通貨)の自動取引や分析ツールを作りたいとき、まず必要になるのが「最新の相場情報の取得」です。
今回は、国内大手の暗号資産取引所「bitFlyer(ビットフライヤー)」が提供している公開API(Public API)を使い、現在取引可能なすべての通貨ペアの最新相場(LTP:最終取引価格、取引量など)を自動で一括取得するPythonプログラムをご紹介します。
外部ライブラリを一切使わず、Pythonに標準搭載されている機能だけで動くため、コピー&ペーストするだけで今すぐ実行可能です!
今回作成するプログラムのメリット
-
APIキーの取得が不要:公開されている情報を取得するため、面倒なアカウント登録やAPIキーの発行なしで誰でも試せます。
-
インストール不要:
requestsなどの外部ライブラリを使わず、標準のurllibのみで実装しているため、Pythonさえあればすぐに動きます。 -
動的な市場取得:プログラム側で「現在取引可能なペア」を自動取得するため、将来的に新しい通貨ペアが増えてもコードを書き換える必要がありません。
-
エラーに強い設計:一部のペアでデータが取得できなくても、途中で止まらずに処理を継続する頑健なエラーハンドリングを導入しています。
実装コード(フルスクラッチ)
以下のコードをコピーして、get_tickers.py などの名前で保存して実行してください。
import json
import time
import urllib.error
import urllib.request
def get_all_market_tickers():
"""1. 全市場のリストを取得し、2.
それぞれの最新相場(LTPとVolume)を一覧で取得・表示します。
"""
# 1. 全市場のリストを取得
markets_url = "https://api.bitflyer.com/v1/markets"
try:
req = urllib.request.Request(markets_url)
with urllib.request.urlopen(req) as response:
body = response.read().decode("utf-8")
markets = json.loads(body)
except urllib.error.HTTPError as e:
print(f"市場リストの取得に失敗しました (HTTP Error): {e.code} {e.reason}")
return
except urllib.error.URLError as e:
print(f"市場リストの取得に失敗しました (通信エラー): {e.reason}")
return
except json.JSONDecodeError:
print("市場リストレスポンスのパースに失敗しました。")
return
except Exception as e:
print(f"市場リストの取得中に予期せぬエラーが発生しました: {e}")
return
# ヘッダー情報の出力
print(f"{'Product Code':<20} | {'LTP (Last Price)':<15} | {'Volume'}")
print("-" * 55)
# 2. 取得した全市場に対してTickerを取得
ticker_base_url = "https://api.bitflyer.com/v1/ticker"
for market in markets:
# market情報からプロダクトコードを取り出す
product_code = market.get("product_code")
if not product_code:
continue
try:
# クエリパラメータを付与してTicker APIのURLを生成
url = f"{ticker_base_url}?product_code={product_code}"
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as response:
body = response.read().decode("utf-8")
data = json.loads(body)
# ltp (Last Traded Price) が存在しない場合もあるため get を使用して安全に取得
ltp = data.get("ltp", 0)
volume = data.get("volume", 0)
# 金額や数量をカンマ区切り等で見やすく出力
if isinstance(ltp, (int, float)):
print(f"{product_code:<20} | {ltp:<15,} | {volume}")
else:
print(f"{product_code:<20} | {ltp:<15} | {volume}")
# APIの負荷・アクセス制限対策として0.1秒待機
time.sleep(0.1)
except urllib.error.HTTPError as e:
# 特定のプロダクトコードが取得できなくても、他の取得を継続するためスキップ
print(f"{product_code:<20} | [HTTP Error: {e.code}]")
continue
except urllib.error.URLError:
# 通信エラーが発生した場合はスキップして継続
continue
except json.JSONDecodeError:
# レスポンスが解析できない場合もスキップして継続
continue
except Exception:
# その他の予期せぬエラーも安全にスキップ
continue
if __name__ == "__main__":
get_all_market_tickers()
出力結果のイメージ
プログラムを実行すると、コンソールに以下のように現在アクティブな市場の最新相場が一覧で出力されます。
Product Code | LTP (Last Price) | Volume ------------------------------------------------------- BTC_JPY | 14,520,300 | 452.1284 ETH_JPY | 512,450 | 1205.892 FX_BTC_JPY | 14,535,000 | 12450.3921 ...
技術的な解説・こだわりポイント
1. 2段階のAPIアクセスによる自動化
このプログラムは、以下の2つのAPIエンドポイントを連携させています。
-
GET /v1/marketsbitFlyerで現在提供されている取引市場の一覧(プロダクトコードなど)を取得します。 -
GET /v1/tickerそれぞれのプロダクトコードに対応する詳細な相場情報(LTPや取引量)を取得します。
市場一覧を最初に自動取得しているため、取引所側で新しい銘柄(アルトコインなど)が追加・変更された場合でも、プログラムをメンテナンスすることなく自動追従します。
2. ループ処理内のウェイト(time.sleep)
複数の通貨ペアに対して連続でAPIリクエストを送るため、ループの最後に time.sleep(0.1)(0.1秒待機)を入れています。 これがないと、短時間に大量のリクエストを送信したとみなされ、bitFlyer側のAPIサーバーから一時的なアクセス遮断(Rate Limit)を受けるリスクがあるため、API利用における重要なマナー兼対策です。
3. get() メソッドによる安全なキー取得
APIから返ってくるデータ(JSON)の構造は、通貨ペアやタイミングによって一部のキー(ltp など)が含まれていないケースがあります。 辞書型データから直接 data['ltp'] と取得しようとするとエラー(KeyError)でプログラムが強制終了してしまうため、.get('ltp', 0) を使って「存在しない場合はデフォルトで0を返す」という安全な処理を行っています。
まとめと次のステップ
今回は、外部ライブラリを使わずにbitFlyerから全市場の相場データを一括取得するスクリプトを作成しました。
ここからさらに発展させるアイデアとして、以下のようなカスタマイズが考えられます。
-
データベース(SQLiteやMySQL)やNotionへの保存:定期実行して価格の推移を記録する。
-
LINEやDiscordへの通知:特定の価格(LTP)を超えたら、自動でチャットツールにアラートを投げる。
-
データ分析:Pandasなどを組み合わせて、ボラティリティやスプレッドの計算を行う。
このコードをベースにすれば、暗号資産ツールや自動取引botの開発ができる。
関連情報(リンク集)
■ 公式APIリファレンス(技術仕様)
-
bitFlyer Lightning API Documentation
-
bitFlyerが提供する公式のAPI仕様書です(英語メイン)。今回使用した
gettickerやmarketsをはじめ、プライベートAPI(注文・残高参照など)の仕様もすべて網羅されています。
-
-
-
APIの利用規約や概要、利用に関する注意点が日本語でまとめられている公式トップページです。
-
■ 今回使用したエンドポイントの直リンク
仕様書内の該当箇所へダイレクトにアクセスしたい場合のリンクです。
-
マーケット一覧の取得(HTTP Public API – Markets)
-
現在アクティブな通貨ペアの一覧を取得するAPIの仕様解説です。
-
-
ティッカーの取得(HTTP Public API – Ticker)
-
指定した通貨ペアの最新価格(LTP)や取引量、板の気配値を取得するAPIの仕様解説です。
-
■ Python標準ライブラリ(公式ドキュメント)
外部ライブラリを使わない構成のため、標準モジュールの公式ドキュメントへのリンクがあると技術ブログとしての信頼性がさらに高まります。
-
Python 公式ドキュメント – urllib.request
-
APIへのリクエスト送信に使用した
urllib.requestモジュールの詳細仕様です。
-
-
-
APIから返ってきたデータをPythonの辞書型に変換(デコード)するために使用した
jsonモジュールの仕様です。
-


コメント