前提
このページでは接続後のみのサンプルを記載しています。接続方法は以下を参照してください。
IB証券 APIの接続方法
取得できる過去データ(ヒストリカルデータ)
過去データ(ヒストリカルデータ)は購読しているマーケット・データによって取得できないものがあります。
IB証券のマーケットデータの購読は以下を参照してください。
IB証券 マーケットデータの購読
IB証券のAPIの仕様
金融商品の設定
contract = Stock('TSLA', 'SMART', 'USD')
で取得する金融商品を設定します。
詳しくは以下を参照してください。
取得データの設定
以下のように取得するデータを設定します。
bars = ib.reqHistoricalData( contract, endDateTime=date(2020, 9, 1), durationStr='3 M', barSizeSetting='5 mins', whatToShow='TRADES', useRTH=True, formatDate=1, timeout=0 )
取得されるデータの日時はデスクトップTWSに設定されているタイムゾーンとなります。
主な設定内容
endDateTime
:取得するデータの終了日時を設定します。空の場合は現在の日時までになります。開始日時の設定はできません。以下のようにdatetime
のdate
やdatetime
を使うといいです。- date(year, month, day)
- datetime(year,month,day, hour, minute, second)
durationStr
:取得するデータの期間を設定します。例えば3ヶ月ならdurationStr='3 M'
とします。単位 意味 S 秒 D 日 W 週 M 月 Y 年 barSizeSetting
:何足のデータを取得するか設定します。例えば1日足の場合はbarSizeSetting='1 day'
とします。時分はmin
とmins
、hour
とhours
と複数形に注意してください。足の種類 1 secs 5 secs 10 secs 15 secs 30 secs 1 min 2 mins 3 mins 5 mins 10 mins 15 mins 20 mins 30 mins 1 hour 2 hours 3 hours 4 hours 8 hours 1 day 1 week 1 month whatToShow
:取得するデータのタイプを設定します。多くのタイプが用意されていますがTRADES
とMIDPOINT
の2つでいいと思います。基本はTRADES
として、金融商品によりTRADES
が取得できない場合はMIDPOINT
とすればいいと思います。詳しく知りたい方はドキュメントを参照してください。
https://interactivebrokers.github.io/tws-api/historical_bars.html#hd_what_to_show
(このドキュメントはib_insync
ではなくIB証券のものです)useRTH
:通常取引時間(RTH)内でのみ生成されたデータを取得するかをTrue
とFlase
で設定します。formatDate
:日付の形式?のようですがイマイチ理解できません。0
とするとエラーになることがあるので常に1
としています。timeout
:任意。タイムアウトの時間を設定します。0にすると無制限になります。
取得したデータのタイムゾーンは、商品により異なる可能性はありますが、基本的にアメリカ東部時間(EST)のようです。
APIの制限
IB証券では過去データ(ヒストリカルデータ)に関して、以下の制限がありますので注意しましょう。
- Making identical historical data requests within 15 seconds.
- Making six or more historical data requests for the same Contract, Exchange and Tick Type within two seconds.
- Making more than 60 requests within any ten minute period.
TWS API v9.72+: Historical Data Limitations
- 同一の銘柄の同一データを15秒以内に要求する
- 同一銘柄、取引所、ティックタイプのデータで、2秒以内に6回以上要求する
- 10分以内に60回以上データを要求する
過去データ(ヒストリカルデータ)の取得
contract = Stock('TSLA', 'SMART', 'USD') ib.reqContractDetails(contract) bars = ib.reqHistoricalData( contract, endDateTime='', durationStr='3 M', barSizeSetting='1 day', whatToShow='TRADES', useRTH=True, formatDate=1) print(bars[-1]) # BarData(date=datetime.date(2020, 5, 19), open=815.17, high=822.07, low=806.08, close=808.01, volume=64192, average=814.7215, barCount=35386) df = util.df(bars) print(df.head()) # date open high low close volume average barCount # 0 2020-02-20 911.60 912.00 859.93 899.41 115797 890.4890 70360 # 1 2020-02-21 906.98 913.06 880.45 901.00 92774 894.3950 54027 # 2 2020-02-24 838.40 863.51 822.20 833.79 91903 842.3150 56306 # 3 2020-02-25 849.45 856.60 787.00 799.91 108354 810.5085 60859 # 4 2020-02-26 783.00 813.31 776.11 778.80 84511 791.6225 46148
取得したデータはbars
に代入されます。
ib_insync
のutil.df(bars)
とすれば、簡単にデータフレーム形式に変換してくれます。
過去データ(ヒストリカルデータ)の結合
制限のため、一括で取得することができない(エラーがでる)場合が多々あるかと思います。
簡単ですが、結合するプログラムを作成しましたのでご利用ください。
使用方法
- 任意のフォルダにダウンロードしたファイルをフォルダ毎置いてください。
- 上記のパスを
path
に設定ください。 - 不要なフォルダがあれば
not_folders
に指定してください。私はMacで、かつJupyter Notebookを使っているのでこのプログラムにそのフォルダを記載しています。 - 結合したデータを保存するCSVのファイル名とそのパスを
new_file
に設定してください。
import pandas as pd import os # 元データのパス path = "./data" # 除くフォルダ名 not_folders = [".DS_Store", ".ipynb_checkpoints"] # 保存するCSVのパスとファイル名 new_file = "./vxx.csv" class convert: def __init__(self): self.df = pd.DataFrame() def csv_marge(self, file_path): if file_path.endswith('.csv'): print(file_path) df_temp = pd.read_csv(file_path) self.df = pd.concat([self.df, df_temp]) ins_conv = convert() for filename in os.listdir(path): file_path = path + "/" + filename if os.path.isfile(file_path) == True: ins_conv.csv_marge(file_path) ins_conv.df = ins_conv.df.sort_values('date') ins_conv.df.to_csv(new_file, index=False)
商品先物、株価指数先物、先物オプションなどの過去データ(ヒストリカルデータ)の取得
以下のページを参照してください。
IB証券 API |商品先物、株価指数先物、先物オプションなどの過去データ(ヒストリカルデータ)の取得
余談(チャートの画像を作成
以下のようにutil.barplot
を利用するだけで、簡単なチャートを作成することができます。
日付が表示されないのは残念ですね。あとtitle
は日本語に対応していません。
util.barplot(bars, title='TSLA', upColor='blue', downColor='red')
コメント