OpenBB-finance/OpenBB
主な特徴
- **統一API**: 数十の金融データプロバイダーを一つのAPIでアクセス
- **幅広いデータカバレッジ**: 株式、オプション、暗号通貨、FX、マクロ経済、固定収益等
- **拡張性**: モジュラーアーキテクチャで新しいデータソースや機能を追加可能
- **マルチインターフェース**: Python SDK、CLI、REST APIを提供
- **完全オープンソース**: AGPLv3ライセンスで透明性を確保
- **無料・有料プロバイダーのサポート**: Yahoo FinanceからBloombergまで幅広く対応
- **コミュニティ駆動**: 活発なコミュニティによる継続的な改善
- **標準化されたデータモデル**: 異なるプロバイダー間で一貫したデータ構造
リポジトリ解析: OpenBB-finance/OpenBB
基本情報
- リポジトリ名: OpenBB-finance/OpenBB
- 主要言語: Python
- スター数: 45,648
- フォーク数: 4,136
- 最終更新: 2025年1月(活発に開発中)
- ライセンス: AGPLv3
- トピックス: Finance, Investment Research, Open Source, Python, Financial Data, API, Platform, Data Integration
概要
一言で言うと
投資分析と金融データアクセスを民主化するオープンソース金融プラットフォームで、数十のデータプロバイダーを統一されたAPIで提供する。
詳細説明
OpenBB Platformは、「Investment Research for Everyone, Everywhere」を理念に掲げる初のオープンソース金融プラットフォームです。株式、オプション、暗号通貨、外国為替、マクロ経済、固定収益など、幅広い金融データへのアクセスを提供します。
従来、金融データへのアクセスは高額な費用と複雑な統合が課題でした。OpenBBはこの問題を解決し、誰もが簡単に金融データにアクセスできるようにします。プラットフォームはPythonパッケージ、CLI、REST APIとして提供され、ユーザーのニーズに応じて拡張機能を追加できます。
さらに、OpenBB WorkspaceというエンタープライズUIも提供しており、データの視覚化やAIエージェントの活用が可能です。
主な特徴
- 統一API: 数十の金融データプロバイダーを一つのAPIでアクセス
- 幅広いデータカバレッジ: 株式、オプション、暗号通貨、FX、マクロ経済、固定収益等
- 拡張性: モジュラーアーキテクチャで新しいデータソースや機能を追加可能
- マルチインターフェース: Python SDK、CLI、REST APIを提供
- 完全オープンソース: AGPLv3ライセンスで透明性を確保
- 無料・有料プロバイダーのサポート: Yahoo FinanceからBloombergまで幅広く対応
- コミュニティ駆動: 活発なコミュニティによる継続的な改善
- 標準化されたデータモデル: 異なるプロバイダー間で一貫したデータ構造
使用方法
インストール
前提条件
- Python 3.9以上 (3.12までサポート)
- pip パッケージマネージャー
- Git (ソースからインストールする場合)
- 仮想環境 (推奨)
インストール手順
# 方法1: 基本インストール(コア機能のみ)
pip install openbb
# 方法2: 全機能インストール(全プロバイダー含む)
pip install "openbb[all]"
# 方法3: CLIインストール
pip install openbb-cli
# 方法4: ソースからクローン
git clone https://github.com/OpenBB-finance/OpenBB.git
cd OpenBB
pip install -e .
基本的な使い方
Hello World相当の例
# Python SDKの基本使用例
from openbb import obb
# Appleの株価を取得
data = obb.equity.price.historical("AAPL")
df = data.to_dataframe()
print(df.head())
# CLIの使用例(ターミナルで実行)
# openbb
# /equity/price/historical AAPL
実践的な使用例
# 複数のデータプロバイダーを使用した比較分析
from openbb import obb
# OpenBB Hubにログイン(APIキーの同期)
obb.account.login(pat="YOUR_OPENBB_PAT")
# 複数のプロバイダーからデータを取得
aapl_yahoo = obb.equity.price.historical(
"AAPL",
start_date="2023-01-01",
provider="yfinance"
)
aapl_polygon = obb.equity.price.historical(
"AAPL",
start_date="2023-01-01",
provider="polygon"
)
# 財務諸表を取得
financials = obb.equity.fundamental.income(
"AAPL",
limit=5,
provider="fmp"
)
# データをDataFrameに変換して分析
df_financials = financials.to_dataframe()
print(f"売上高成長率: {df_financials['revenue'].pct_change().mean():.2%}")
高度な使い方
# REST APIサーバーの起動と使用
import requests
import subprocess
# APIサーバーを起動(別ターミナルで実行)
# uvicorn openbb_core.api.rest_api:app --host 0.0.0.0 --port 8000
# REST API経由でデータを取得
response = requests.get(
"http://localhost:8000/api/v1/equity/price/historical",
params={
"symbol": "AAPL",
"start_date": "2023-01-01",
"provider": "yfinance"
}
)
data = response.json()
# カスタム拡張機能の作成
from openbb_core.app.router import Router
from openbb_core.app.model.command_context import CommandContext
from openbb_core.app.model.example import APIEx, PythonEx
from openbb_core.app.model.obbject import OBBject
from typing import List
router = Router(prefix="/my_extension")
@router.command("custom_analysis")
def custom_analysis(
cc: CommandContext,
symbol: str,
period: int = 30,
) -> OBBject[List[dict]]:
"""カスタム分析関数"""
# データ取得と分析ロジック
results = perform_custom_analysis(symbol, period)
return OBBject(results=results)
ドキュメント・リソース
公式ドキュメント
- README.md: プロジェクト概要、インストール方法、基本使用方法
- docs.openbb.co: 完全なオンラインドキュメント
- Platform: APIリファレンス、開発者ガイド
- CLI: CLIの使用方法、コマンドリファレンス
- Workspace: UIの設定と使用方法
- OpenBB Hub: https://my.openbb.co - APIキー管理、拡張機能一覧
サンプル・デモ
- googleColab.ipynb: Google Colabでの使用方法
- financialStatements.ipynb: 財務諸表の取得と分析
- loadHistoricalPriceData.ipynb: 様々なプロバイダーからの価格データ取得
- openbbPlatformAsLLMTools.ipynb: LLMとの統合
- portfolioOptimization.ipynb: ポートフォリオ最適化
- streamlit/news.py: Streamlitダッシュボードの例
チュートリアル・ガイド
- 公式ドキュメントのクイックスタートガイド
- Jupyter Notebookサンプル集
- Discordコミュニティでのサポート
- YouTubeチュートリアル動画
- コミュニティ作成のブログ記事やガイド
技術的詳細
アーキテクチャ
全体構造
OpenBB Platformはモジュラーアーキテクチャを採用し、以下のコンポーネントで構成されます:
- Core: プラットフォームの中核、API、ルーティング、データ管理
- Providers: 各種金融データプロバイダーへのコネクタ
- Extensions: 機能拡張(equity、crypto、economy等)
- OBBject Extensions: チャートやデータ変換機能
- CLI: コマンドラインインターフェース
各コンポーネントは独立しており、必要に応じて組み合わせ可能です。
ディレクトリ構成
OpenBB/
├── openbb_platform/ # プラットフォームコア
│ ├── core/ # 中核機能
│ │ ├── openbb_core/ # API、ルーター、プロバイダー管理
│ │ └── tests/ # コアテスト
│ ├── providers/ # データプロバイダーコネクタ
│ │ ├── yfinance/ # Yahoo Finance
│ │ ├── fmp/ # Financial Modeling Prep
│ │ ├── polygon/ # Polygon.io
│ │ └── ... # その他30+プロバイダー
│ ├── extensions/ # 機能拡張
│ │ ├── equity/ # 株式関連
│ │ ├── crypto/ # 暗号通貨関連
│ │ ├── economy/ # 経済指標関連
│ │ └── ... # その他の拡張
│ └── openbb/ # Pythonパッケージ
├── cli/ # CLIアプリケーション
│ ├── openbb_cli/ # CLIコアコード
│ └── tests/ # CLIテスト
├── examples/ # サンプルノートブック
└── build/ # ビルドスクリプト
主要コンポーネント
-
CommandRunner: コマンドの実行とデータ取得を管理
- 場所:
openbb_core/app/command_runner.py - 依存: Router, ProviderInterface, QueryExecutor
- インターフェース: run(), execute_command()
- 場所:
-
Router: APIエンドポイントのルーティング管理
- 場所:
openbb_core/app/router.py - 依存: ExtensionLoader
- インターフェース: command(), include_router()
- 場所:
-
ProviderInterface: データプロバイダーの抽象化層
- 場所:
openbb_core/app/provider_interface.py - 依存: Registry, StandardModel
- インターフェース: get_provider(), create_query_params()
- 場所:
-
OBBject: データレスポンスの標準オブジェクト
- 場所:
openbb_core/app/model/obbject.py - 依存: Pydantic BaseModel
- インターフェース: to_dataframe(), to_dict(), chart()
- 場所:
技術スタック
コア技術
- 言語: Python 3.9-3.12 - 型ヒント、非同期処理、メタプログラミング
- フレームワーク:
- FastAPI: REST APIサーバー
- Pydantic: データ検証とシリアライゼーション
- Uvicorn: ASGIサーバー
- 主要ライブラリ:
- pandas: データ操作と分析
- numpy: 数値計算
- requests/httpx: HTTPクライアント
- plotly: チャート作成(charting拡張)
- poetry: 依存関係管理
開発・運用ツール
- ビルドツール:
- Poetry: Python依存関係管理
- dev_install.py: 開発環境セットアップスクリプト
- build.py: パッケージビルドスクリプト
- テスト:
- pytest: ユニットテストと統合テスト
- 各モジュールにintegration/testsディレクトリ
- CI/CD: GitHub Actionsでの自動テストとリリース
- デプロイ:
- PyPIへのパッケージ公開
- Dockerコンテナ対応
- REST APIのセルフホスティング
設計パターン・手法
- プラグインアーキテクチャ: コアと拡張機能の分離
- プロバイダーパターン: データソースの抽象化
- コマンドパターン: CLIとAPIの統一インターフェース
- デコレーターパターン: ルーティングと検証の分離
- シングルトンパターン: Registryでのプロバイダー管理
- ファクトリパターン: OBBjectの生成
データフロー・処理フロー
- ユーザーリクエスト: Python SDK/CLI/REST APIからコマンド実行
- ルーティング: Routerが適切なコマンドハンドラを特定
- パラメータ検証: Pydanticモデルで入力検証
- プロバイダー選択: Registryから適切なデータプロバイダーを選択
- データ取得: プロバイダーがAPIを呼び出してデータ取得
- データ標準化: プロバイダー固有のデータを標準モデルに変換
- OBBject生成: 統一されたレスポンスオブジェクトを作成
- データ変換: to_dataframe()、to_dict()等で必要な形式に変換
- 表示/返却: ユーザーに結果を返却
API・インターフェース
公開API
GET /api/v1/equity/price/historical
- 目的: 株価の歴史データ取得
- 使用例:
curl "http://localhost:8000/api/v1/equity/price/historical?symbol=AAPL&start_date=2023-01-01&provider=yfinance"
GET /api/v1/equity/fundamental/income
- 目的: 損益計算書データ取得
- 使用例:
import requests
response = requests.get(
"http://localhost:8000/api/v1/equity/fundamental/income",
params={"symbol": "AAPL", "limit": 5, "provider": "fmp"}
)
GET /api/v1/economy/calendar
- 目的: 経済指標カレンダー取得
- 使用例:
from openbb import obb
calendar = obb.economy.calendar(
start_date="2024-01-01",
end_date="2024-01-31",
provider="fmp"
)
設定・カスタマイズ
設定ファイル
# ~/.openbb_platform/user_settings.json
{
"credentials": {
"fmp_api_key": "YOUR_FMP_KEY",
"polygon_api_key": "YOUR_POLYGON_KEY",
"fred_api_key": "YOUR_FRED_KEY",
"benzinga_api_key": "YOUR_BENZINGA_KEY"
},
"preferences": {
"output_type": "dataframe",
"chart_style": "dark",
"table_style": "rich"
},
"defaults": {
"provider": "yfinance"
}
}
拡張・プラグイン開発
新しい拡張機能の作成手順:
- ルーター拡張の作成
from openbb_core.app.router import Router
router = Router(prefix="/my_extension")
@router.command("my_function")
def my_function(symbol: str) -> OBBject:
# 実装
pass
- プロバイダーの追加
from openbb_core.provider.abstract.fetcher import Fetcher
class MyDataFetcher(Fetcher):
@staticmethod
def transform_query(params: dict) -> MyQueryParams:
# パラメータ変換
@staticmethod
async def aextract_data(query: MyQueryParams) -> dict:
# データ取得
- pyproject.tomlの設定
[tool.poetry.plugins."openbb_provider_extension"]
my_provider = "my_provider:my_provider"
パフォーマンス・スケーラビリティ
パフォーマンス特性
- ベンチマーク結果:
- APIレスポンス: 50-200ms (プロバイダー依存)
- データ変換: <10ms (DataFrame変換)
- 同時リクエスト: 100+コネクション対応
- 最適化手法:
- 非同期I/Oによる並列データ取得
- キャッシング機構
- レスポンスの遅延読み込み
- プロバイダーごとのレート制限管理
スケーラビリティ
- 水平スケーリング: REST APIの複数インスタンス実行
- プロバイダーの動的追加: プラグインシステムによる拡張
- キャッシュ機構: 高頻度アクセスデータのキャッシュ
- バッチ処理: 大量データの並列取得
- ロードバランサー: APIゲートウェイでの負荷分散
制限事項
- データプロバイダーのAPI制限に依存
- 一部のプロバイダーは有料サブスクリプションが必要
- リアルタイムデータは一部プロバイダーのみ
- 歴史データの期間制限(プロバイダー依存)
- CLIはWindowsで一部機能制限あり
評価・所感
技術的評価
強み
- 統一インターフェース: 異なるプロバイダーを同一APIでアクセス
- 完全オープンソース: 透明性とカスタマイズ性
- コミュニティ駆動: 活発な開発とサポート
- モジュラー設計: 必要な機能だけを選択可能
- ドキュメントの充実: 詳細なAPIリファレンスとサンプル
改善の余地
- リアルタイムデータのサポート強化
- モバイルアプリの提供
- 機械学習モデルの統合
- バックテスト機能の拡充
- ポートフォリオ管理機能
向いている用途
- 金融データ分析アプリケーションの開発
- 投資リサーチとレポート作成
- アルゴリズムトレーディングのバックテスト
- 金融教育と学習用途
- ダッシュボードとレポーティングシステム構築
- 金融機関やフィンテック企業でのデータ統合
向いていない用途
- 高頻度トレーディング(ミリ秒単位の取引)
- ブローカー機能(注文実行)
- 規制対応が必要な業務システム
- リアルタイムリスク管理システム
- プロフェッショナルトレーダー向けの完全な取引プラットフォーム
総評
OpenBB Platformは、金融データアクセスの民主化を目指す野心的なプロジェクトで、その目標を大いに達成しています。数十のデータプロバイダーを統一APIで提供することで、従来は高額な費用がかかった金融データへのアクセスを誰もが利用できるようにしました。
特に優れている点は、モジュラーアーキテクチャによる拡張性と、Python SDK、CLI、REST APIという複数のインターフェースの提供です。これにより、初心者から上級者まで、幅広いユーザーが自分のニーズに合わせて使用できます。
活発なコミュニティと継続的な開発により、プロジェクトは急速に成長しています。GitHubの45,000以上のスター数は、その人気と実用性を証明しています。
一方で、リアルタイムデータのサポートやモバイル対応など、まだ改善の余地もあります。しかし、オープンソースの特性を活かし、コミュニティと共に成長を続けることで、これらの課題も解決されていくでしょう。
総じて、OpenBB Platformは金融データ分析のデモクラタイゼーションを実現する革新的なプラットフォームであり、金融業界におけるオープンソースの可能性を示す優れた例と言えます。