デリバティブ偏愛家の日記

インタラクティブ・ブローカーズ証券のAPIをPythonで操作する リアルタイムデータ取得編

完全に忘れ去られつつあったこのシリーズ。遂に思い立って記事にすることにしました。アイキャッチ画像がどう見てもBloom○ergじゃないかって?TWSの良い感じの画像用意するのが面倒でした。

さて、気を取り直して、過去の記事は以下から飛べます。

※筆者が使っているのはIB証券公式のPython APIではなく、有志が昔に作成したIBPyというJavaベースのAPIです。なので厳密には公式Pythonと異なる部分があるのでご了承下さい。IBPyについては準備編を参照して下さい。

大まかな流れ

今回もヒストリカルデータ取得編と似た流れになります。

  1. IB証券のサーバに接続する
  2. 銘柄情報を定義する
  3. リアルタイムデータを要求する
  4. リアルタイムデータを受信する
  5. データ取得を停止する
  6. サーバと切断する

データの要求と受信が別建てなのはヒストリカルデータと同じですが、今回は5のデータ取得停止が追加されています。多分いきなり切断しても良いんでしょうが、まあ美しい終え方は先に取得停止をやることでしょう。スーファミの電源ボタン切る前にコンセントを抜くような真似は止めた方が良さそうです。

接続や銘柄定義に関してはヒストリカルデータ取得編を参照下さい。

リアルタイムデータの取扱

単発で要求するヒストリカルデータと異なり、リアルタイムデータはこちらが「もうやめてくれ」と言うまで永遠に流れ続けてきます。しかも更新されたデータが随時流れて来るので、bidやaskがごちゃごちゃの状態なので、必要なデータを「field」という項目で絞って使わないとカオスになります。

毎回詳細はAPIのマニュアルを参照してくれ、と言っているような気がしますが、今回も受信したデータのfieldの一覧に関してはマニュアルをどうぞ。この記事では、

  • bid price:filed id 1
  • ask price:filed id 2

という二つのデータしか扱いませんが、次回以降色々掘り下げる可能性はあります。

実際のコード

以下はUSDJPYのbidをひたすら取得しつつ、1秒おきに10回画面に表示させるというサンプルです。

「market_data_handler」において受信したデータのうち、「field」が1になるもの、つまりbid priceだけを取得しています。

為替以外にも対応できるように、銘柄定義にて「exchange」と「primaryExch」をわざわざ定義していますが、別に為替に関しては無くても動くはずです。

複数銘柄のデータを同時に取得する場合

微妙な違いですが、USDJPYとEURJPYの2つの銘柄のリアルタイムデータを取得するサンプルです。tickerIdを2つ用意してデータ要求をし、受信側ではそのtickerIdで仕訳すればOKです。

Tagged on: ,

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です