メインコンテンツへスキップ

概要

Benzinga TypeScript/JavaScript SDK は、Benzinga API と対話するためのモジュール化されたイベントベースのインターフェースを提供します。TypeScript で実装されており、ブラウザと Node.js の両方の環境でシームレスに動作し、キャッシュや詳細な比較などの高度な機能を備えた強化された実装を提供します。

主な機能

  • TypeScript Support - 完全な TypeScript の型定義とインターフェースを提供
  • Universal - ブラウザと Node.js の両方の環境で動作
  • Modular Architecture - 必要なモジュールだけをインストール可能
  • Event-Based - リアルタイムデータ向けのリアクティブプログラミングパターンを採用
  • Advanced Features - キャッシュ、ディープコンパリソン、および各種最適化機能を内蔵
  • Modern - async/await に対応した ES6+ 構文を採用

必要条件

  • Node.js 14 以降

インストール

SDKはモジュール型アーキテクチャを採用しています。まずはコアのセッションモジュールをインストールしてください。
npm install @benzinga/session
次に、必要に応じて追加モジュールをインストールします。
# 例: 特定のモジュールをインストールする
npm install @benzinga/calendar-data
npm install @benzinga/quotes
npm install @benzinga/news-data

はじめに

セッションのセットアップ

@benzinga/session モジュールは、Benzinga API に対する認証の基盤となります。他のすべてのモジュールは、この Session オブジェクトに依存します。
import { Session } from '@benzinga/session';

// APIキーでセッションを初期化
const session = new Session({
  apiKey: 'YOUR_API_KEY'
});

設定オプション

Session オブジェクトには、動作をカスタマイズするためのさまざまな設定オプションを指定できます。
const session = new Session({
  apiKey: 'YOUR_API_KEY',
  environment: 'production', // または 'sandbox'
  timeout: 30000,            // リクエストタイムアウト (ミリ秒)
  // 追加の設定オプション
});

基本概念

モジュール化設計

各 Benzinga API ドメインは、個別の npm モジュールとしてパッケージ化されています。これにより、次のことが可能になります。
  • 必要なものだけをインストールできる
  • バンドルサイズを削減できる
  • 関心事の分離を明確に保てる
  • モジュールを個別に更新できる

イベント駆動アーキテクチャ

SDK は、リアルタイムのデータストリームや更新を処理するために、イベント駆動パターンを使用します。
// 例: データ更新を購読する
dataManager.subscribe((data) => {
  console.log('New data received:', data);
});

// Example: Handle events
dataManager.on('update', (event) => {
  console.log('Data updated:', event);
});

キャッシュとパフォーマンス

SDK には組み込みのキャッシュ機構があり、次の目的で使用されます。
  • 不要な API コールを削減する
  • レスポンス時間を短縮する
  • 帯域幅の使用を最適化する
  • オフライン時のフォールバック手段を提供する

ディープ比較

高度なデータ比較機能により、次のことが可能になります:
  • ネストされたオブジェクトの変更検出
  • 効率的な状態管理
  • スマートな更新トリガー
  • UI アプリケーションでの再レンダリング回数の削減

利用可能なモジュール

このSDKは、各種APIドメインごとに特化したモジュールに整理されています。

コアモジュール

  • @benzinga/session - 認証およびセッション管理(必須)
  • @benzinga/calendar-data - カレンダー関連イベントおよびコーポレートアクション
  • @benzinga/news-data - ニュース記事および市場インテリジェンス
  • @benzinga/quotes - リアルタイム株価およびディレイ株価
  • @benzinga/fundamentals - 企業のファンダメンタルズおよび財務データ

特化モジュール

  • @benzinga/ratings - アナリストレーティングと目標株価
  • @benzinga/options - オプション取引動向と分析
  • @benzinga/transcripts - 決算説明会の書き起こし
  • @benzinga/logos - 企業ロゴとブランディング
  • @benzinga/signals - トレーディングシグナルとインジケーター

TypeScript サポート

SDK は TypeScript で記述されており、完全な型定義を提供します。
import { Session } from '@benzinga/session';
import { CalendarData, DividendEvent } from '@benzinga/calendar-data';

// TypeScriptによる自動補完と型チェックが利用可能
const session = new Session({ apiKey: 'YOUR_API_KEY' });
const calendar = new CalendarData(session);

// 型安全なAPI呼び出し
const dividends: DividendEvent[] = await calendar.getDividends({
  dateFrom: '2024-01-01',
  dateTo: '2024-12-31',
  ticker: 'AAPL'
});

使用例

基本的なデータの取得

import { Session } from '@benzinga/session';
import { NewsData } from '@benzinga/news-data';

const session = new Session({ apiKey: 'YOUR_API_KEY' });
const news = new NewsData(session);

// 最新ニュースを取得
const articles = await news.getNews({
  pageSize: 10,
  displayOutput: 'full'
});

console.log(articles);

リアルタイム・データストリーム

import { Session } from '@benzinga/session';
import { QuoteStream } from '@benzinga/quotes';

const session = new Session({ apiKey: 'YOUR_API_KEY' });
const quoteStream = new QuoteStream(session);

// リアルタイム株価の購読
quoteStream.subscribe(['AAPL', 'MSFT', 'GOOGL'], (quote) => {
  console.log('Quote update:', quote);
});

// 完了時に購読解除
quoteStream.unsubscribe(['AAPL']);

カレンダーイベント

import { Session } from '@benzinga/session';
import { CalendarData } from '@benzinga/calendar-data';

const session = new Session({ apiKey: 'YOUR_API_KEY' });
const calendar = new CalendarData(session);

// 今後の決算を取得
const earnings = await calendar.getEarnings({
  dateFrom: '2024-01-01',
  dateTo: '2024-01-31',
  importance: 3  // 重要度の高いもののみ
});

// 配当を取得
const dividends = await calendar.getDividends({
  ticker: 'AAPL'
});

企業のファンダメンタルズ

import { Session } from '@benzinga/session';
import { Fundamentals } from '@benzinga/fundamentals';

const session = new Session({ apiKey: 'YOUR_API_KEY' });
const fundamentals = new Fundamentals(session);

// 企業プロファイルを取得
const profile = await fundamentals.getCompanyProfile('AAPL');

// バリュエーションレシオを取得
const valuationRatios = await fundamentals.getValuationRatios('AAPL');

// 財務諸表を取得
const financials = await fundamentals.getFinancials('AAPL');

ブラウザでの使用

SDK は、Webpack、Rollup、Vite などのバンドラーを用いたブラウザ環境でも動作します。
// React、Vue、またはAngularアプリケーション内
import { Session } from '@benzinga/session';
import { NewsData } from '@benzinga/news-data';

export function NewsComponent() {
  const session = new Session({ apiKey: process.env.BENZINGA_API_KEY });
  const news = new NewsData(session);

  // コンポーネントロジック内で使用
  useEffect(() => {
    news.getNews({ pageSize: 5 }).then(articles => {
      setNewsData(articles);
    });
  }, []);
}

エラー処理

try-catch ブロックを使用して、エラーを適切に処理します。
import { Session } from '@benzinga/session';
import { NewsData } from '@benzinga/news-data';

const session = new Session({ apiKey: 'YOUR_API_KEY' });
const news = new NewsData(session);

try {
  const articles = await news.getNews({ pageSize: 10 });
  console.log(articles);
} catch (error) {
  if (error.code === 'UNAUTHORIZED') {
    console.error('無効なAPIキー');
  } else if (error.code === 'RATE_LIMIT') {
    console.error('レート制限を超過しました');
  } else {
    console.error('エラーが発生しました:', error.message);
  }
}
ページネーションされた結果を効率的に処理する:
import { Session } from '@benzinga/session';
import { NewsData } from '@benzinga/news-data';

const session = new Session({ apiKey: 'YOUR_API_KEY' });
const news = new NewsData(session);

// 複数ページを取得
let page = 0;
let allArticles = [];

while (page < 5) {
  const articles = await news.getNews({
    page: page,
    pageSize: 100
  });

  if (articles.length === 0) break;

  allArticles = allArticles.concat(articles);
  page++;
}

console.log(`Fetched ${allArticles.length} articles`);

キャッシュ戦略

組み込みキャッシュを活用して、パフォーマンスを向上させます。
import { Session } from '@benzinga/session';
import { CalendarData } from '@benzinga/calendar-data';

const session = new Session({
  apiKey: 'YOUR_API_KEY',
  cache: {
    enabled: true,
    ttl: 300000  // 5分間キャッシュ
  }
});

const calendar = new CalendarData(session);

// 最初の呼び出しでAPIにアクセス
const earnings1 = await calendar.getEarnings({ ticker: 'AAPL' });

// 2回目の呼び出しではキャッシュされたデータを使用(TTL内の場合)
const earnings2 = await calendar.getEarnings({ ticker: 'AAPL' });

ベストプラクティス

1. セッションオブジェクトを再利用する

アプリケーション全体でセッションインスタンスを 1 つ作成し、それを再利用します。
// session.ts
export const globalSession = new Session({ apiKey: process.env.BENZINGA_API_KEY });

// 他のファイルで
import { globalSession } from './session';
const news = new NewsData(globalSession);

2. 環境変数

API キーは環境変数として安全に管理してください:
// .env ファイル
BENZINGA_API_KEY=your_api_key_here

// コード内
const session = new Session({
  apiKey: process.env.BENZINGA_API_KEY
});

3. 型安全性

型安全な API 操作のために TypeScript を活用する:
import type { NewsArticle, NewsParams } from '@benzinga/news-data';

const params: NewsParams = {
  pageSize: 10,
  displayOutput: 'full',
  ticker: 'AAPL'
};

const articles: NewsArticle[] = await news.getNews(params);

4. エラーバウンダリ

本番環境ではエラーバウンダリを実装すること:
const safeApiCall = async (fn: () => Promise<any>) => {
  try {
    return await fn();
  } catch (error) {
    console.error('API Error:', error);
    // エラートラッキングサービスにログを記録
    return null;
  }
};

const articles = await safeApiCall(() => news.getNews({ pageSize: 10 }));

リソース

モジュールのドキュメント

特定のモジュールに関する詳細なドキュメントは、各パッケージの README を参照してください:
  • @benzinga/session - コア認証および設定
  • @benzinga/calendar-data - カレンダーイベント API
  • @benzinga/news-data - ニュースおよび記事 API
  • @benzinga/quotes - リアルタイム気配値 API
  • @benzinga/fundamentals - ファンダメンタルズおよび財務データ API

サポート

技術サポートおよび API キーの提供については、Benzinga のサイト cloud.benzinga.com からお問い合わせください。

コントリビューション

Benzinga JavaScript SDK はオープンソースです。ぜひご貢献ください。詳細については GitHub リポジトリ を参照してください。