【コピペで動く!】IB証券(インタラクティブ・ブローカーズ証券 )へのPythonでのAPI接続 ib_insync [自分が使っているPythonコード]

スポンサーリンク
投資

米国の大手ネット証券、ディスカウントブローカーであるIB証券 (インタラクティブ・ブローカーズ証券 ) で、APIを用いてデータを取得する方法や、その設定方法、利用方法などを紹介します。

2019/09/01に note に書いた記事になります。

IB証券(インタラクティブ・ブローカーズ証券 )へのPythonでのAPI接続 ib_insync [自分が使っているPythonコード]|TF
ーーーーーーーーーーー2021/08/02 追記ーーーーーーーーーーー 今後こちらに移行します。 IB証券(インタラクティブ・ブローカーズ証券 )へのPythonでのAPI接続 ib_insync - worth2know.comIB証券(インタラクティブ・ブローカーズ証券 )へのPythonでのA...

2021/07/23時点で以下のコードはエラーなく動いていることを確認しています。

2022/11/05に追記を行いました。

普段私が使っているアメリカに拠点をおくIB証券(インタラクティブ・ブローカーズ証券 )へのPtyhonを利用してのAPI接続に関する記事になります。

米国株に投資するなら是非とも候補に入れたい証券会社の紹介と、投資するうえでもとになるデータを取得する方法の紹介記事になります。

IB証券(インタラクティブ・ブローカーズ証券 )とは

簡単にIB証券(インタラクティブ・ブローカーズ証券 )を紹介すると、電子トレードに特化した証券会社であり、なかなか日本では投資しにくい金融商品・アセットクラスに簡単に、そして低い手数料でアクセスすることを可能にしてくれる証券会社になります。

ただ、アメリカの証券会社ということもあり、米国建てでの資産管理・英語での書類が必要であったり、場合によっては自由度の高いだけにリスクの高い投資行動もとれてしまうので、ある程度の証券・金融知識を持っている必要がある、というのが実際に利用している人間としての感想です。

API接続がなんの役に立つのか?

証券会社にAPI接続できると何のメリットがあるのでしょうか?いくつか考えられますが、代表的なものとして、

1.売買の「注文の簡略化」
50銘柄の注文をウェブページから注文操作するのは大変ですが、APIならプログラム画面から簡単に行うことができます。

2.過去データの取得
個別株、各種先物、指数、オプションまで幅広い商品の過去データが取得可能になります。データの購読契約は必要ですが、日本ではなかなかアクセスしにくい金融商品・アセットクラスの過去のデータを取得することができるので、データの検証、戦略の考察などが比較的に簡単に行えます。

3.新たな技術をマーケットに適応
最近話題になっているAIに代表される機能である、自然言語処理や機械学習、画像認識技術などを実際のマーケットに適応すると事ができます。こういったものはFintechと呼ばれることも多く、今後、大きな成長の期待される分野でもあります。

こういった先端的な技術に、個人でも挑戦できるというのはとても魅力的なものです。

日本ではFX系の会社ではAPIを開放しているものがありますが、個別株レベルではほとんどなく、法人口座を開設していた場合kabu.com API(カブドットコム証券)がやっと利用できるというのが現状です。

必要なPCの最低限のスペック

IB証券API設定におけるPCの最低スペックという件ですが、
基本的にはIB証券のTrader Workstation(TWS)が動くことが前提ですので、
以下のよなものになります。Windowsの環境という事であれば、
・Windows 10 or highe
・4GB Ram (1GB available for TWS)


https://www.interactivebrokers.com/en/?f=%2Fen%2Ftrading%2Ftws-requirements.php

IB Trader Workstation - System Requirements | Interactive Brokers LLC
IB Trader Workstation - System Requirements

API Gatewayを使うとTWSよりはメモリ使用量も少ないと思われます。

今回の記事では上記の
2.過去データの取得
1.売買の「注文の簡略化」
について書きます。

また、売買注文については銘柄の間違い、注文数量の間違いなどで大きな損失が発生するリスクがあります。コードのミス等に十分注意し、危険性を理解したうえで、以下の文章をお読みください。

過去データの取得

IB証券へのAPI接続するにはいくつか方法がありますが、私が利用しているのはPythonの ib_insync というモジュールを利用しての接続です。

もし、IB証券に口座をお持ちの方であれば以下の10行で過去データを取得することができます。

from ib_insync import *
import random
util.startLoop()
ib = IB()
ib.connect('127.0.0.1', 7497, clientId=random.randint(0, 29))
contract = Forex('EURUSD')
bars = ib.reqHistoricalData(contract, endDateTime='', durationStr='30 D',
barSizeSetting='1 hour', whatToShow='MIDPOINT', useRTH=True)
df = util.df(bars)
display(df[['date', 'open', 'high', 'low', 'close']].head())

私がおすすめする ib_insync サイトは以下のgithubです。

GitHub - erdewit/ib_insync: Python sync/async framework for Interactive Brokers API
Python sync/async framework for Interactive Brokers API - erdewit/ib_insync

例として出ているコードの中の四行目 clientId=1 の部分が前回と同じで、使用中なので、動かない、、というエラーで動かないことが多々あるので、このIDは少なくとも毎回変えるようにする必要があります。

私の場合はランダム関数を使って、0から29の数字を割り当てて数字が変わるようにしています。

以下のサイトも参考にしていただいたのですが、同じ問題でclientId=3とベタ打ち、固定なので、その部分は注意を払ってあげる必要があります。

ib_insync (Interactive Brokers API を python で操作するためのライブラリ) のインストールと使い方 - Qiita
ib_insyncとはInteractive Brokers の API を python で操作するためのライブラリです.GitHub - erdewit/ib_insync: Python …

それ以外のインストール手順などはとても参考になると思いますし、windowsとlinuxの差がありましたが参考にさせていただきました。

今回の例ではFXでしたが、個別株、指数、先物、オプションははどうでしょうか。基本的には contract = の部分を以下のように変えることによりさまざまな銘柄情報にアクセスができます。

contract_symbol = Stock('AMD', 'SMART', 'USD')
contract_nasdaq = Stock('INTC', 'SMART', 'USD', primaryExchange='NASDAQ')
contract_forex = Forex('EURUSD')
contract_cfd = CFD('IBUS30')
contract_sp = Future('ES', '20180921', 'GLOBEX')
contract_option = Option('SPY', '20170721', 240, 'C', 'SMART')
contract_bond = Bond(secIdType='ISIN', secId='US03076KAA60');

ナスダックだけ特別扱いするのも大変なので、私の場合は

contract =  Stock("MSFT", 'SMART', 'USD', primaryExchange='ISLAND')

とすることで、一括して個別株のデータをとるようにしています。

またFXと違って、個別銘柄などは価格調整済みの数字を出した方がいいので、whatToShow=’ADJUSTED_LAST’ とすることがいいと思います。
以下が例になります。

指数や、先物はどうでしょうか。代表的な指数であるダウ30,SPX,VIXは以下のようになります。変更する場合は index であることと、それぞれを算出している市場が CME とCBOE と違うのでそのあたりに注意を払う必要があります。

ダウ:CME
S&P500:CBOE
VIX:CBOE

です。以下が例になります。

では先物はどうでしょうか。先物は限月がありますので、そのあたりの入力が必要です。また、市場の指定も 
ダウ先物:ECBOT
S&P先物(E-mini):GLOBEX
VIX先物:CFE

となり、指数とはまた違います。VIXのタームストラクチャーに興味ある人などはいろいろデータを加工することでできることが広がるかもしれませんね。以下が例になります。

また、コモディティクラスだと、GOLD で通常XAUUSDで代表されるものもデータを取得することができます。この場合FXと同様に whatToShow=’MIDPOINT’ で値をとることに注意が必要です。

オプションの値も取れます。個別株オプションの例を示しますが、原資産のコード、権利行使日、行使価格、プット・コールの指定などを行うことによって値を抽出できます。

少しマニアックな話になりますが、ibには ib.calculateImpliedVolatility という関数があるので、現在ついている価格から、各行使価格で、価格からボラティリティを逆算することができます。

自分の持っているブラックショールズモデルでなくても簡便にボラティリティの推定ができますし、残存時間の調整したボラティリティサーフィスの作成などもやろうと思えばできます。

価格データの取得に関してはこれぐらいにしておきます。データの購読契約をする必要がありますが、これ以外にもたくさんの事が出来ます。

たった10行程度のコードで様々な資産クラスのデータにアクセスできるのは驚きです。

売買注文、ポジション管理

ポジションに関しては ib.portfolio() という関数がありますので一撃で出せます。(下の画像では一部モザイクをかけています。)

売買注文については銘柄の間違い、注文数量の間違いなどで大きな損失が発生するリスクがあります。コードのミス等に十分注意し、危険性を理解したうえで、以下の文章をお読みください。
以下のサイトを参照しての記事になります。

ib_insync/notebooks/ordering.ipynb at master · erdewit/ib_insync
Python sync/async framework for Interactive Brokers API - erdewit/ib_insync

アップル AAPL を成行きで100株買う場合の注文は以下のようになります。

contract = Stock('AAPL', 'SMART', 'USD')
ib.qualifyContracts(contract)
order = MarketOrder('BUY', 100)
trade = ib.placeOrder(contract, order)

trade

指値注文は以下のようになります。指値0.05で買という現実的でない値が入っています。 

contract = Stock('AAPL', 'SMART', 'USD')
ib.qualifyContracts(contract)
limitOrder = LimitOrder('BUY', 100, 0.05)
limitTrade = ib.placeOrder(contract, limitOrder)

limitTrade

これで複数銘柄でループをかければ同時に複数銘柄に注文が出せます。

また、あまり推奨はされていませんが、引け成りなどorderTypeなどつけることで条件注文も出せます。

ib_insyncのインストール

以下のサイトなどが役に立つと思います。

ここまで読まれて、興味ある方はすでにコンピュータ周りの知識はある一定以上だと思いますので、後はご自身で頑張ってください。爆・汗

参考になると思うサイトをのせておきます。

Interactive Brokers 証券の Python API を利用する
Interactive Brokers 証券とは日本には珍しく自動売買プラットフォームが提供されいてる証券会社です。基本的には全部JAVAで書かれていますが、最近Pythonも公式に対応しました。Python ライブラリの入手Latest版
TWS API v9.72+: Trader Workstation API

最後はオフィシャルのサイトです。なにかあったら最後はここに戻りましょう。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

投資に関する免責事項
情報の提供・作業代行を目的としており、投資勧誘を目的とするものではありません。

IB証券関係、投資関係、Python関係の記事になります。

Python高速化! for文は遅いので、”これ”を使うと30倍早いですよ!【Google ColabのPython:コピペで動く!】
【コピペで動く!】Pythonで1.5GBのcsvファイル読み込み高速化:1分5秒⇒4秒程度 DASK , pickle (Pythonコードあり)
【コピペで動く!】日本株、米国株で個別銘柄ベータ値(β値)を簡単に調べる方法 Python 米国株 Webサービス&コード 【Google Colabで違いをみつけろ!】
【コピペで動く!】Google ColabでPython を用いての 効率的フロンティア と ポートフォリオの最適化 Efficient Frontier & Portfolio Optimization with Python [Part 2/2]
【コピペで動く!】20行で資産運用モデル作成 Google ColabのPythonで 米国株の株価を取得し、グラフ・チャートを表示
過去50年間のS&P500の季節性の値動きから負けにくいポジション構築はできるのか考える・大統領選挙のアノマリー対応!【コピペで動く!】Google ColabのPythonで自分で調べてみよう!
曜日による米国株指数(S&P500)のパフォーマンスに違いはあるのか?有利なポジション取りはできるのか?【Google ColabのPython:コピペで動く!】Twitterで出てくる知見は本当か自分で調べてみよう。
【解決】スクレイピングでHTTP Error 403: Forbiddenでアクセスできないときに試すべき方法【コピペで動く!】【Google Colab:Python:pd.read_html,selenium】
【解決】Google ColabのPythonでエクセル(Excel)ファイルやCSVファイルに出力・入力する方法【コピペで動く!】
【コピペで動く!】レイ・ダリオ推奨「オール・ウェザー戦略」をETFで構築するには? ETFの手軽さとそのパフォーマンスの高さとは!【違いをみつけろ!】
【コピペで動く!】IB証券(インタラクティブ・ブローカーズ証券 )へのPythonでのAPI接続 ib_insync [自分が使っているPythonコード]
米国債のゼロクーポン債STRIPSについてのメモ
自動化・効率化でなにができるのか!Google FinanceやYahoo Financeからデータ取得して年初来パフォーマンスや週次騰落率のファクターチェック
米国株のティッカー(Symbol)のスクレイピングによる取得、APIによるヒストリカルデータやファンダメンタルズデータ取得について【コピペで動く!】Python,Quandl,無料枠あり
Google ColabでYouTube動画を開始・終了の時間を指定してPythonでダウンロード(音声・動画両方対応)【コピペで動く!】

コメント