見出し画像

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

ーーーーーーーーーーー2021/08/02 追記ーーーーーーーーーーー

今後こちらに移行します。

ーーーーーーーーーーー2021/08/02 追記ーーーーーーーーーーー


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

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


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

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

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


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

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

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

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

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


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

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

今回の記事では上記の
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())

画像1

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

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

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

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

それ以外のインストール手順などはとても参考になると思いますし、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' とすることがいいと思います。
以下が例になります。

画像2


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

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

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

画像3

画像4

画像5


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

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

画像6

画像7

画像8


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

画像9


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

画像10

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

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


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

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


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

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

画像11


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

アップル 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などつけることで条件注文も出せます。

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

trade = ib.placeOrder(contract, order)
trade


ib_insyncのインストール

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

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

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

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

役に立ったと思いましたらこの記事の「いいね」をよろしくお願いします。


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

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


Pythonで資産運用モデルを作成する記事をまとめました。
Pythonを用いて、株価取得、チャート表示、株価分析、可視化、株価予測、株価の機械学習、ポートフォリオの構築、ポートフォリオの最適化、スクレイピングなどを行う記事を集めました。
もし興味を持っていただけるなら読んでみてください。


いいなと思ったら応援しよう!

TF
サポートしていただき大変ありがとうございます。 励みになります。