bitFlyer APIで全通貨ペアの最新相場を一括取得する

Python

ビットコインをはじめとする暗号資産(仮想通貨)の自動取引や分析ツールを作りたいとき、まず必要になるのが「最新の相場情報の取得」です。

今回は、国内大手の暗号資産取引所「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エンドポイントを連携させています。

  1. GET /v1/markets bitFlyerで現在提供されている取引市場の一覧(プロダクトコードなど)を取得します。

  2. 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仕様書です(英語メイン)。今回使用した gettickermarkets をはじめ、プライベートAPI(注文・残高参照など)の仕様もすべて網羅されています。

  • bitFlyer 公式 API 概要ページ

    • APIの利用規約や概要、利用に関する注意点が日本語でまとめられている公式トップページです。

■ 今回使用したエンドポイントの直リンク

仕様書内の該当箇所へダイレクトにアクセスしたい場合のリンクです。

■ Python標準ライブラリ(公式ドキュメント)

外部ライブラリを使わない構成のため、標準モジュールの公式ドキュメントへのリンクがあると技術ブログとしての信頼性がさらに高まります。

コメント

タイトルとURLをコピーしました