IB証券 API 過去データ(ヒストリカルデータ)の取得

スポンサーリンク
スポンサーリンク

前提

このページでは接続後のみのサンプルを記載しています。接続方法は以下を参照してください。
IB証券 APIの接続方法

取得できる過去データ(ヒストリカルデータ)

過去データ(ヒストリカルデータ)は購読しているマーケット・データによって取得できないものがあります。

IB証券のマーケットデータの購読は以下を参照してください。
IB証券 マーケットデータの購読

IB証券のAPIの仕様

金融商品の設定

contract = Stock('TSLA', 'SMART', 'USD')で取得する金融商品を設定します。

詳しくは以下を参照してください。

IB証券 API接続での商品情報の設定

取得データの設定

以下のように取得するデータを設定します。

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:取得するデータの終了日時を設定します。空の場合は現在の日時までになります。開始日時の設定はできません。以下のようにdatetimedatedatetimeを使うといいです。
    • 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'とします。時分はminminshourhoursと複数形に注意してください。
    足の種類
    1 secs5 secs10 secs15 secs30 secs
    1 min2 mins3 mins5 mins10 mins15 mins20 mins30 mins
    1 hour2 hours3 hours4 hours8 hours
    1 day
    1 week
    1 month
  • whatToShow:取得するデータのタイプを設定します。多くのタイプが用意されていますがTRADESMIDPOINTの2つでいいと思います。基本はTRADESとして、金融商品によりTRADESが取得できない場合はMIDPOINTとすればいいと思います。詳しく知りたい方はドキュメントを参照してください。
    https://interactivebrokers.github.io/tws-api/historical_bars.html#hd_what_to_show
    (このドキュメントはib_insyncではなくIB証券のものです)
  • useRTH:通常取引時間(RTH)内でのみ生成されたデータを取得するかをTrueFlaseで設定します。
  • 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_insyncutil.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')

コメント

タイトルとURLをコピーしました