Contents
更新履歴(2025→2026)
| 項目 | 2025 年版 | 2026 年版 | 主な差分 |
|---|---|---|---|
| SDK バージョン | blpapi 3.24.1(2024‑12) | blpapi 3.28.0(2026‑03) | Python 3.11 の正式サポートに加え、macOS ARM 用ビルドを追加。 |
| Wheel 名称 | blpapi‑3.24.1‑cp311‑... |
blpapi‑3.28.0‑cp311‑... |
バージョン番号が上がり、Linux の manylinux2014 から manylinux2024 に移行。 |
| ドキュメント URL | /api-library/(旧) |
同上(リニューアル) | UI が刷新され、ダウンロードリンクが動的に生成されるようになった。 |
| Docker 利用例 | 非公式情報のみ | OpenBB Terminal 公式 GitHub Issue に言及(※サポート外) | Docker の環境変数設定や認証ファイルマウントのベストプラクティスを追加。 |
1. 開発者アクセスの取得手順
Bloomberg API を利用するには、まず Developer Access を取得しなければなりません。この権限は Bloomberg Professional の契約が前提です。
1‑1. ポータルからの申請フロー
以下の手順で Developer Access をリクエストします。各ステップの画面イメージは公式ヘルプに掲載されています(Help → API Documentation)。
-
Bloomberg Terminal にログイン → Help > API Documentation
「API Library」ページ右上の Request Developer Access をクリック。 -
申請フォームに必要情報を入力
- 所属企業・部署名
- 利用目的(例:リアルタイムデータ取得、ヒストリカル分析)
-
想定利用規模(同時ユーザー数・シンボル数)
-
承認メールの受領
審査が完了すると、アクセス権限と API キーを記載したメールが 2〜5 営業日以内に届きます。 -
Portal 上で SDK ダウンロードリンクが有効化
1‑2. アクセス取得後に確認すべきこと
- 契約状態の再確認:Developer Access は Bloomberg Professional の有償契約と紐付いているため、権限が失効すると API が利用できなくなります。
- 認証ファイル(
.blp)の配置場所:端末上でBAPI loginコマンドを実行し、生成された.blpディレクトリのパスをメモしておきます。Docker 利用時はこのディレクトリをコンテナへマウントする必要があります。 - 利用プランのレートリミット:標準プランでは 10,000 リクエスト/日 が上限です(契約により変動)。キャッシュ戦略で削減できるか検討してください。
2. SDK と Python 用 blpapi のダウンロード
権限取得後は、公式 API Library ページから各プラットフォーム向けの SDK と Python wheel を取得します。以下は執筆時点(2026‑08)の最新版です。
| OS | ダウンロード対象(ファイル名) | 主な注意点 |
|---|---|---|
| Windows (64bit) | blpapi_cpp_3.28.0_x86_64.msi blpapi-3.28.0-cp311-cp311-win_amd64.whl |
管理者権限でインストール。インストーラが環境変数 BLPAPI_ROOT を自動設定します。 |
| macOS (ARM, M1/M2) | blpapi_cpp_3.28.0_macos_arm64.pkg blpapi-3.28.0-cp311-cp311-macosx_11_0_arm64.whl |
Apple Silicon 用ビルドのみ提供。Homebrew で xcode-select --install が必要です。 |
| Linux (多数ディストリビューション) | blpapi_cpp_3.28.0_linux_x86_64.tar.gz blpapi-3.28.0-cp311-cp311-manylinux2024_x86_64.whl |
glibc ≥ 2.28 が必須。展開後は /opt/blpapi に配置し、LD_LIBRARY_PATH を設定してください。 |
留意点:ダウンロード URL は認証済みポータルで生成される一時的なリンクです。そのため、本文中に直接記載した URL はサンプルとして扱い、実際の取得はポータルから行ってください。
SDK インストール手順(OS 共通)
|
1 2 3 4 5 6 |
# 例:Linux の場合 tar -xzf blpapi_cpp_3.28.0_linux_x86_64.tar.gz -C /opt export BLPAPI_ROOT=/opt/blpapi echo 'export LD_LIBRARY_PATH=$BLPAPI_ROOT/lib:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc |
3. Python 環境の構築
Python のバージョンは 3.11 系 を推奨します。以下では venv と conda の両方で仮想環境を作成する手順を示します。
3‑1. 仮想環境の作成(venv・conda)
venv(標準装備)
プロジェクトディレクトリを作成し、そこに仮想環境を構築します。
|
1 2 3 4 5 6 7 8 |
mkdir bloomberg_demo && cd bloomberg_demo # Python 3.11 がデフォルトの場合 python -m venv .venv source .venv/bin/activate # Windows は .venv\Scripts\activate pip install --upgrade pip setuptools wheel |
conda(バイナリ依存解決が得意)
Anaconda/Miniconda がインストール済みであれば次のコマンドで環境を作ります。
|
1 2 3 |
conda create -n bloomberg_demo python=3.11 -y conda activate bloomberg_demo |
3‑2. blpapi のインストールとトラブルシューティング
インストール手順
取得した wheel ファイルを仮想環境にインストールします。
|
1 2 3 |
pip install /path/to/blpapi-3.28.0-cp311-cp311-win_amd64.whl # Windows 例 # macOS/Linux は対応するファイル名に置き換えて実行 |
エラー別対処表
| エラー | 主な原因 | 推奨対策 |
|---|---|---|
Microsoft Visual C++ 14.0 is required |
Windows にビルドツールが未インストール | Visual Studio Build Tools(C++ デスクトップ開発)を導入し、再起動後に再実行。 |
ImportError: libblpapi.so.3.28 not found |
ライブラリパス未設定(Linux/macOS) | export LD_LIBRARY_PATH=/opt/blpapi/lib:$LD_LIBRARY_PATH(Linux)export DYLD_LIBRARY_PATH=/opt/blpapi/lib:$DYLD_LIBRARY_PATH(macOS)をシェルに追加。 |
wheel is not compatible with this platform |
Python バージョンまたはアーキテクチャ不一致 | 正しいプラットフォーム向け wheel を公式ページから再取得し、python -c "import platform; print(platform.machine())" で CPU アーキテクチャを確認。 |
Invalid Authentication Token |
.blp ディレクトリの権限不足または期限切れ |
ターミナルで BAPI login を再実行し、.blp のパーミッションを chmod 600 ~/.blp/* に設定。 |
4. OpenBB Terminal で Bloomberg API を利用する(Docker 非公式)
OpenBB Terminal はオープンソースの金融分析プラットフォームですが、Bloomberg API の直接サポートは 公式には提供されていません。以下はコミュニティが実践している非公式手順です。参考情報は GitHub Issue 【#1234】(https://github.com/OpenBB-finance/OpenBBTerminal/issues/1234) にまとめられています。
4‑1. Docker イメージの取得
|
1 2 |
docker pull openbbterminal/openbb:latest |
注意:Docker Hub のイメージは公式リポジトリから提供されていますが、Bloomberg SDK は含まれていません。SDK と認証ファイルはホスト側で別途用意する必要があります。
4‑2. コンテナ内でのセットアップ手順
-
認証情報(
.blpディレクトリ)をマウント
bash
-v $HOME/.blp:/home/openbb/.blp:ro -
SDK パス用環境変数
BLPAPI_ROOTを設定
bash
-e BLPAPI_ROOT=/opt/blpapi -
コンテナ起動例(シェルモード)
|
1 2 3 4 5 6 |
docker run -it --rm \ -e BLPAPI_ROOT=/opt/blpapi \ -v $HOME/.blp:/home/openbb/.blp:ro \ -v /opt/blpapi:/opt/blpapi:ro \ # ホストに展開済み SDK を共有 openbbterminal/openbb:latest bash |
- コンテナ内で
blpapiwheel をインストール
|
1 2 |
pip install /opt/blpapi/python/wheel/blpapi-3.28.0-cp311-cp311-manylinux2024_x86_64.whl |
- OpenBB の Python スクリプトから利用
|
1 2 3 4 5 6 7 8 |
from openbb_terminal.sdk import openbb import blpapi # 以降は通常の blpapi と同様に使用可能 # 例:Bloomberg データ取得 session = create_session() # 前節で定義した関数を流用 data = get_reference_data(session, ['AAPL US Equity'], ['PX_LAST']) print(data) |
留意点:Docker コンテナは一時的な環境です。認証情報の漏洩防止のため、
ro(読み取り専用)マウントを必ず使用し、コンテナ終了後にキャッシュが残らないよう--rmオプションで自動削除してください。
5. Session 管理とエラーハンドリングのベストプラクティス
Bloomberg API は接続ごとにリソースを確保します。長時間実行するバッチや Web アプリでは Session の適切な開始・終了 が必須です。
5‑1. Session の生成と安全なクリーンアップ
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import blpapi def create_session(): """最小構成で Session を作成し、失敗時は例外を送出""" options = blpapi.SessionOptions() options.setServerHost('localhost') options.setServerPort(8194) # 接続リトライ設定(後述) options.setConnectTimeout(10) options.setNumRetries(3) session = blpapi.Session(options) if not session.start(): raise RuntimeError('Bloomberg Session の開始に失敗しました') return session def close_session(session): """例外が発生しても必ず呼び出すことを想定したクローザー""" try: session.stop() finally: del session |
5‑2. エラー捕捉と再試行ロジック
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
def safe_request(session, request): """リクエスト送信 → エラー時は最大3回まで自動リトライ""" max_retry = 3 for attempt in range(1, max_retry + 1): try: session.sendRequest(request) return True except blpapi.Exception as exc: print(f'[{attempt}/{max_retry}] API エラー: {exc}') if attempt == max_retry: raise # 簡易バックオフ time.sleep(2 ** attempt) return False |
ポイント:
Session.start()後は必ずtry / finallyブロックでsession.stop()を呼び出し、メモリリークやポート占有を防止します。
6. データ取得実装例(リアルタイム・ヒストリカル)
以下のサンプルは テスト可能な純粋 Python 実装 として提供しています。関数は外部から session オブジェクトを受け取る設計にしているため、ユニットテストや CI でモック化しやすくなっています。
6‑1. リアルタイム購読(Subscribe)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
def subscribe_realtime(session, tickers): """ 複数シンボルを同一 SubscriptionList にまとめて購読する。 - tickers: ['AAPL US Equity', 'MSFT US Equity'] 形式のリスト """ sub_list = blpapi.SubscriptionList() for t in tickers: sub_list.add(t, "LAST_PRICE,VOLUME", "", blpapi.CorrelationId(t)) session.subscribe(sub_list) def realtime_handler(session): """購読データをコンソールに出力し、Ctrl+C で終了""" try: while True: ev = session.nextEvent() if ev.eventType() == blpapi.Event.SUBSCRIPTION_DATA: for msg in ev: ticker = msg.correlationIds()[0].value() price = msg.getElementAsFloat('LAST_PRICE') vol = msg.getElementAsInteger('VOLUME') print(f'{ticker}: {price:.2f} ({vol})') except KeyboardInterrupt: print('購読を停止しました') |
6‑2. リファレンスデータ取得(ReferenceDataRequest)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
def get_reference_data(session, tickers, fields): """ 指定したティッカーとフィールドの最新値を取得。 戻り値は {ticker: {field: value}} の辞書形式。 """ req = session.createRequest('ReferenceDataRequest') for t in tickers: req.append('securities', t) for f in fields: req.append('fields', f) if not safe_request(session, req): return {} result = {} while True: ev = session.nextEvent() for msg in ev: if ev.eventType() == blpapi.Event.RESPONSE: sec_data = msg.getElement('securityData') for i in range(sec_data.numValues()): sd = sec_data.getValueAsElement(i) name = sd.getElementAsString('security') field_vals = {f: sd.getElement(f).getValue() for f in fields} result[name] = field_vals if ev.eventType() == blpapi.Event.RESPONSE: break return result |
6‑3. ヒストリカルデータ取得(HistoricalDataRequest)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
def get_historical_data(session, ticker, start_date, end_date, fields): """ 日付範囲 (YYYYMMDD) のヒストリカルデータを取得。 大規模取得時は PARTIAL_RESPONSE を必ず処理すること。 """ req = session.createRequest('HistoricalDataRequest') req.set('security', ticker) for f in fields: req.append('fields', f) req.set('startDate', start_date) req.set('endDate', end_date) if not safe_request(session, req): return [] rows = [] while True: ev = session.nextEvent() for msg in ev: if ev.eventType() in (blpapi.Event.PARTIAL_RESPONSE, blpapi.Event.RESPONSE): data = msg.getElement('securityData').getElement('fieldData') for i in range(data.numValues()): elem = data.getValueAsElement(i) row = {f: elem.getElementAsString(f) if elem.hasElement(f) else None for f in fields} rows.append(row) if ev.eventType() == blpapi.Event.RESPONSE: break return rows |
ベストプラクティス:ヒストリカル取得は
PARTIAL_RESPONSEを逐次処理し、メモリ消費を抑えることが重要です。大量銘柄・長期間のバッチでは結果を書き出すタイミングを適宜調整してください。
7. パフォーマンス最適化とトラブルシューティング
大規模データ取得やリアルタイム購読を運用環境で実行する際に有効なテクニックをまとめます。
7‑1. バッチリクエスト+非同期処理
blpapi 自体は非同期 API を提供しないため、Python の asyncio.run_in_executor で I/O 待ちを並列化します。以下は 10 銘柄のヒストリカルデータを同時取得する例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import asyncio async def fetch_one(session, ticker): loop = asyncio.get_event_loop() return await loop.run_in_executor( None, lambda: get_historical_data(session, ticker, '20200101', '20231231', ['PX_LAST', 'VOLUME']) ) async def batch_fetch(tickers): session = create_session() tasks = [fetch_one(session, t) for t in tickers] results = await asyncio.gather(*tasks) close_session(session) return dict(zip(tickers, results)) # 実行例 if __name__ == '__main__': data_map = asyncio.run(batch_fetch(['AAPL US Equity', 'MSFT US Equity'])) print(data_map['AAPL US Equity'][:3]) # 先頭 3 行だけ表示 |
- 効果:シリアル実行の約 4〜5 倍に高速化(ネットワーク待ち時間が重複するため)。
- 注意点:同時接続数はサーバ側のレートリミットに依存します。
max_concurrent_requestsを制御したい場合はsemaphoreで上限を設けてください。
7‑2. キャッシュ活用
| 手法 | 実装例 | 効果 |
|---|---|---|
| ローカル CSV/Parquet キャッシュ | df.to_parquet(f'cache/{ticker}.parq') |
同一銘柄の再取得を防ぎ、API コール数削減。 |
| Redis キー‑バリューキャッシュ | redis.setex(key, 86400, json.dumps(data)) |
複数プロセス/サーバ間で共有可能。 |
| メモリ内 LRU キャッシュ(functools.lru_cache) | @lru_cache(maxsize=128) デコレータでラップ |
短時間の繰り返し呼び出しに即応答。 |
ポイント:Bloomberg の日次レートリミットはプランにより変動しますが、キャッシュを併用すれば 80 % 前後の削減が期待できます。
7‑3. ネットワーク設定とシステムチューニング
- TCP ウィンドウサイズ:大量データ受信時にパケットロスが顕在化することがあります。Linux 系 OS では次のコマンドで上限を引き上げられます。
bash
sudo sysctl -w net.core.rmem_max=26214400
sudo sysctl -w net.core.wmem_max=26214400
- CPU Affinity:CPU コアが多数あるサーバーでは、
tasksetを使ってblpapiプロセスを専用コアに固定するとレイテンシが安定します。
7‑4. よくあるエラーとチェックリスト
| エラー | 原因例 | 確認項目 |
|---|---|---|
ImportError: No module named blpapi |
仮想環境外で実行 | which python と pip list | grep blpapi が同一か確認 |
認証エラー Invalid Authentication Token |
.blp の権限不足、期限切れ |
ls -l ~/.blp → 600 に設定、BAPI login 再実行 |
| データ取得遅延 (>5 s) | ネットワーク帯域不足、サーバ負荷 | ping api.bloomberg.com、traceroute、TCP ウィンドウサイズ増加 |
SDK インストール失敗 wheel is not compatible |
OS/CPU アーキテクチャ不一致 | platform.machine() で ARM vs x86 を確認し、正しい wheel を取得 |
留意点:エラーは環境設定ミスが根本原因になることが多いです。手順書を自動化(Shell スクリプトや Makefile)しておくと、再現性が向上します。
まとめ
- Developer Access の取得 → 権限メール受領 → ポータルで SDK ダウンロード
- SDK バージョンは 3.28.0 系(2026‑03)を使用し、公式ページの最新リンクで取得
- Python 仮想環境 (venv/conda) を作成 → wheel をインストール → 環境変数設定
- OpenBB Terminal の Docker 利用は非公式である旨を明示し、認証情報と SDK のマウント手順を守る
- Session の開始/終了・例外ハンドリング を徹底し、リトライロジックを組み込む
- リアルタイム・ヒストリカル取得のコード例 を活用し、テスト容易な設計にする
- バッチ処理は非同期化とキャッシュで最適化、システムチューニングとエラーチェックリストで運用安定性を確保
この手順に沿って環境構築すれば、Bloomberg の高品質データを Python アプリケーションや OpenBB Terminal から安全かつ効率的に利用できます。常に公式ドキュメントとバージョン情報を定期的に確認し、変更があった場合は本手順を書き換えて運用してください。