「APIを使って米国株でごにょごにょしたい！」
私がインタラクティブ・ブローカーズ証券に米国口座（IBLLC口座）を開設した理由です。
口座開設まではすんなりとできましたが、APIを利用してサンプルプログラムを動かせるまでは少し苦労しました。
理解がざっくりであれ、まずは「サンプルプログラムが動いた！」を経験する。これが大切だと思ってます。サンプルプログラムを動かせるまでに色々時間をかけるのはモチベーションの急激な低下につながります。
ですので、開発環境構築からサンプルプログラムの動作確認までを一気通貫でできるようにまとめてみました。参考記事も置いてますので詳しく知りたい方はご覧ください。
なお、私はパイに毛が生えた程度の素人です。時間をかけて調べたり、試行錯誤したりした結果ではありますが、知り尽くした玄人が勧めている訳ではないことをご了承ください。
## 開発環境について
開発環境は色々調べた結果、以下を選択しました。使用しているPCは一般的なスペックのWindows 10のデスクトップ機です。
- プログラミング言語：Python 3.9
- ディストリビューション：Miniconda
- 統合開発環境(IDE)：JupyterLab
- API接続のためのライブラリ：ib_insync
#### ディストリビューション
様々なところから提供されているライブラリを使用することにより、高度なプログラムがシンプルな記述で実現できるのがPythonの魅力です。
ディストリビューションとは、プログラミングに役立つ色々なツールやライブラリをひとまとめにしたもので、Python向けではAnaconda（アナコンダ）が有名です。Anacondaにはパッケージ管理コマンドとしてcondaが付属しており、初心者でも環境構築が簡単に行えるようになっています。
ただ、このAnacondaは多くのツールやライブラリを詰め込んでます。非常に容量が大きくなっており、使わないものも多いです。
そこで登場するのがMinicondaです。condaが付属していますが、ツールやライブラリは必要最小限の構成となっており、使われるか分からないものは含まれていません。必要に合わせて自分で追加していくスタイルです。
無駄にデータを喰われるのも嫌なので最小限の構成となっているMinicondaを使いました。
#### 統合開発環境(IDE)
統合開発環境(IDE)とは、ソフトウェア開発を行う際に必要となるコーディングやテスト、バージョン管理などを行うためのプラットフォームです。Pythonで使えるIDEはいくつもあり、おすすめされているものも複数ある状態です。
何を使おうか迷いましたが、プログラムを書いてすぐに実行結果が見られるJupyterLabを使うことにしました。JupyterLabはまだあまり浸透してなさそうですが、広く使われているJupyter Notebookの後継です。
#### API接続のためのライブラリ
IB証券の提供しているAPIを使って接続したかったのですが、チュートリアルを見ながらやってもうまくいきませんでした。
ネイティブAPIでの接続でつまずく人も多いらしく、そんな悩める人達にシンプルに接続を実現するib_syncというライブラリを提供してくれている人がいます。ありがたい！
今回はこのライブラリにおんぶにだっこでやっております。APIのダウンロードも不要です。
## 事前準備
まずは、事前準備として以下の2つを行います。
- ペーパートレーディング口座を使えるようにする
- TWSのダウンロード&設定変更
### ペーパートレーディング口座を使えるようにする
ペーパートレーディング口座とは、本番と同じ環境で取引が行えるデモ口座です。意図せぬ挙動をした際も損害が発生しないようにするため、開発をする際は本番口座ではなくペーパートレーディング口座を利用します。
ペーパートレーディング口座の利用には申請がいると書いてあるのですが、やり方が変わったのか私の場合は申請をせずとも口座が作られていました。パスワードを設定すれば使えるようになります。
※初回入金するまでは利用不可
### TWSのダウンロード&設定変更
TWSとはトレーダー・ワークステーションの略で、IB証券が提供している取引ツールです。
APIの利用には、TWSを経由する方法とIB Gatewayを経由する方法の2種類があります。今回はTWSを経由する方法を取りますのでこちらからTWSをダウンロードします。
ダウンロードが終わったらAPI利用のための設定変更を行います。TWSを起動し、ペーパートレーディング口座でログインをしてください。
ファイル → グローバルコンフィグ… → API → 設定
と進み、以下の設定にします。
- ActiveXとソケットクライアントを有効にする：ON
- API（読み込みのみ）：OFF
- ソケットボード：7497（7497から変更する場合はサンプルプログラムも要変更）
- ローカルホストからの接続のみ許可する：ON
## Python開発環境構築
Python開発環境構築は、以下の4つです。
- Minicondaのインストール
- 仮想環境の作成
- パッケージのインストール
- JupyterLabの起動
### 1. Minicondaのインストール
まずはMinicondaをダウンロードします。下記サイトからPython 3.8のWindowsインストーラーをダウンロードします。（使っているの環境に合わせて64bitか32bitかを選択）
ダウンロードが終了したらexeファイルをダブルクリックし、インストールをしてください。
インストールが終了するとWindowsのスタートメニューに「Anaconda Powershell Prompt (Python)」と「Anaconda Prompt (Python)」が追加されます。Powershell（パワーシェル）は、コマンドプロントの後継らしいです。
「Anaconda Powershell Prompt (Python)」をクリックするとパワーシェルが起動します。
以下のコマンドでcondaとパッケージを最新のバージョンにアップデートしておきましょう。
conda update conda
これでMinicondaのインストールは終了です。
### 2. 仮想環境の作成
次にパワーシェルから操作して仮想環境を作成していきます。仮想環境とはプログラムを動かす環境のことで、複数作成することができます。仮想環境を作成してパッケージのバージョンを管理することで、パッケージのバージョンアップに伴ってプログラミングが動かなくなった際にも問題なく動いていた過去の環境に戻したりできます。
まず仮想環境を作成します。仮想環境名を「ib」とし、Pythonの最新バージョンである3.9をインストールしています。
conda create -n ib python=3.9
次に作成した仮想環境に切り替えます。切り替えが成功すると行頭の表示「(base)」が作成した仮想環境「(ib)」に変わります。
conda activate ib
### 3. パッケージのインストール
仮想環境にサンプルプログラムを実行するために必要なパッケージをインストールしていきます。
Minicondaでは基本的にconda installというコマンドを使ってパッケージのインストールを行います。パッケージを集めているチャンネルというものからインストールするのですが、今回インストールしたいパッケージの一部はconda-forgeというチャンネルからしかインストールできません。
そのためconda installコマンドで検索する先にconda-forgeチャンネルを追加します。（同じパッケージがデフォルトでも提供されていることがあるのでデフォルトを優先とします）
conda config --append channels conda-forge
以下は参考記事です。
インストールする準備が整ったのでサンプルプログラムの実行に必要なパッケージ「jupyterlab」「pandas」「ib-insync」を一気にインストールします。
conda install jupyterlab pandas ib-insync
用意した仮想環境をJupyterLabの実行環境（カーネル）として追加します。カーネル名は「ib」としています。
ipython kernel install --user --name=ib --display-name=ib
### 4. JupyterLabの起動
いよいよJupyterLabの起動です。コマンドを実行するとブラウザ上にJupyterLabが開きます。
jupyter lab
図のようにLauncherのNotebookの下にibがあればOKです。
## サンプルプログラムの動作確認
やっとのことで本題です。TWSはペーパートレーディング口座でログインしておいてください。
### サンプルプログラムの実行
JupyterLabの左側のサイドバーでノートブックを保存するディレクトリを選択し、LauncherのNotebookの下のibをクリックします。
作成されたノートブックのセルにGitHubに書かれているサンプルプログラムを一部改変した以下のプログラムをペーストします。
util.startLoop() # uncomment this line when in a notebook
ib = IB()
ib.connect('127.0.0.1', 7497, clientId=1)
contract = Forex('EURUSD')
bars = ib.reqHistoricalData(
contract, endDateTime='', durationStr='30 D',
# convert to pandas dataframe:
df = util.df(bars)
print(df)
ib.disconnect()
ペーストしたセルでShift+Enterでプログラムを実行するとうまくいっていればEURUSDのレートが取得できます。
これにてサンプルプログラムの動作確認の目的達成です。お疲れさまでした。
## あとがき
ネイティブAPIのチュートリアルが分からなくて困りましたが、ib_insyncのおかげで無事サンプルプログラムを動かすことができました。ありがたいです。
Pythonの環境構築から通しで書いてある記事がなかったので挑戦してみましたが、なかなかハードルが高かったです。プログラムを動かせるようになるまでにかけた時間の何倍もの時間を記事を書くのに費やしてしまいました。。時間をかけて書いたのでせめて誰かの役に立ってくれると嬉しいです！しかし、ニッチな内容なのでそれも期待できるかどうか…。役に立った方がいたら、何かリアクションをもらえると嬉しいです|дﾟ)ﾁﾗｯ
米国株投資×プログラミング学習、我ながらとても良いコンセプトではないかと思ってます。リアクションがもらえるときを待ち望みながら粛々と勉強を続けていきます。