IB証券 API 先物オプションのリアルタイムデータの取得

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

前提

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

取得できるリアルタイムデータ

リアルタイムデータは購読しているマーケット・データによって取得できないものがあります。

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

参考サイト

以下のサイトを参考に本ページを作成しました。

https://nbviewer.jupyter.org/github/erdewit/ib_insync/blob/master/notebooks/option_chain.ipynb

API での先物オプションのリアルタイムデータの取得

APIでリアルタイムデータの取得については以下に記載しています。

APIでリアルタイムデータの取得

しかし、先物オプションに関しては少し特殊なので、ここで紹介します。

原産価格を確認

Cont = Index('VIX', 'CBOE')
ib.qualifyContracts(Cont)
ib.reqMarketDataType(1)
[ticker] = ib.reqTickers(Cont)
print(ticker)
# Ticker(contract=Index(conId=13455763, symbol='VIX', exchange='CBOE', currency='USD', localSymbol='VIX'), time=datetime.datetime(2020, 6, 26, 2, 7, 45, 305317, tzinfo=datetime.timezone.utc), bid=-1.0, bidSize=0, ask=-1.0, askSize=0, last=32.22, lastSize=0, high=36.93, low=31.59, close=33.84, halted=0.0, ticks=[TickData(time=datetime.datetime(2020, 6, 26, 2, 7, 45, 305317, tzinfo=datetime.timezone.utc), tickType=1, price=-1.0, size=0), TickData(time=datetime.datetime(2020, 6, 26, 2, 7, 45, 305317, tzinfo=datetime.timezone.utc), tickType=2, price=-1.0, size=0), TickData(time=datetime.datetime(2020, 6, 26, 2, 7, 45, 305317, tzinfo=datetime.timezone.utc), tickType=4, price=32.22, size=0), TickData(time=datetime.datetime(2020, 6, 26, 2, 7, 45, 305317, tzinfo=datetime.timezone.utc), tickType=6, price=36.93, size=0), TickData(time=datetime.datetime(2020, 6, 26, 2, 7, 45, 305317, tzinfo=datetime.timezone.utc), tickType=7, price=31.59, size=0), TickData(time=datetime.datetime(2020, 6, 26, 2, 7, 45, 305317, tzinfo=datetime.timezone.utc), tickType=9, price=33.84, size=0), TickData(time=datetime.datetime(2020, 6, 26, 2, 7, 45, 305317, tzinfo=datetime.timezone.utc), tickType=49, price=0.0, size=0)], tickByTicks=[], domBids=[], domAsks=[], domTicks=[])

ContValue = ticker.marketPrice()
print(ContValue)
# 33.84

ContValue = ticker.last
print(ContValue)
# 32.22

解説

vix = Index('VIX', 'CBOE')

原産の商品を設定しています。

ib.qualifyContracts(vix)

商品情報で足りない情報を補完しています。特にconIdが代入されます。

ib.reqMarketDataType(1)

マーケットデータのタイプを指定します。

  • 1 = Live
  • 2 = Frozen
  • 3 = Delayed
  • 4 = Delayed frozen

今回は1にしていますが、うまく行かないときは4にするといいかもしれません。
タイプの意味については、以下を参照してください。

TWS API v9.72+: Market Data Types
[ticker] = ib.reqTickers(vix)

スナップショットのティッカーのリストを取得します。

ContValue = ticker.marketPrice()
ContValue = ticker.last

価格を取得します。
参考サイトではmarketPrice()を使用していましたが、TWSの価格を見るとlastの方があっているように思えます。

先物オプションの商品情報(限月と権利行使価格)を取得

chains = ib.reqSecDefOptParams(Cont.symbol, '', Cont.secType, Cont.conId)

util.df(chains)

結果

exchangeunderlyingConIdtradingClassmultiplierexpirationsstrikes
0CBOE13455763VIX100[20200721, 20200818, 20200915, 20201020, 20201…[10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17….
1SMART13455763VIXW100[20200630, 20200707, 20200714, 20200728][10.0, 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13….
2SMART13455763VIX100[20200721, 20200818, 20200915, 20201020, 20201…[10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17….
3CBOE13455763VIXW100[20200630, 20200707, 20200714, 20200728][10.0, 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13….

解説

chains = ib.reqSecDefOptParams(Cont.symbol, '', Cont.secType, Cont.conId)

取引所、取引クラス事にオプションチェーンを取得します。

reqSecDefOptParams(シンボル, 取引所, 商品タイプ, conId)

  • シンボル:先程設定した商品情報からシンボルを設定します。
  • 取引所:複数の取引所があるため、空を渡します。単一の取引所を指定する場合は取引所名を設定してください。
  • 商品タイプ:先程設定した商品情報から商品タイプを設定します。なお設定できる値は、‘STK’ か ‘FUT’のみです。
  • conId:先程設定した商品情報からconIdを設定します。

オプションチェーンを設定

複数ある取引所とトレーディングクラスの中から一つのオプションチェーンを設定します。

chain = next(c for c in chains if c.tradingClass == 'VIX' and c.exchange == 'SMART')
print(chain)
# OptionChain(exchange='SMART', underlyingConId='13455763', tradingClass='VIX', multiplier='100', expirations=['20200818', '20200915', '20201020', '20201117', '20201215', '20210119'], strikes=[10.0, 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 32.5, 35.0, 37.5, 40.0, 42.5, 45.0, 47.5, 50.0, 55.0, 60.0, 65.0, 70.0, 75.0, 80.0, 85.0, 90.0, 95.0, 100.0])

解説

chain = next(c for c in chains if c.tradingClass == 'VIX' and c.exchange == 'SMART')
  • c.tradingClass:トレーディングクラス
  • c.exchange:取引所

商品情報(contracts)を設定

strikes = [strike for strike in chain.strikes
        if strike % 5 == 0 and ContValue - 20 < strike < ContValue + 20]

print(strikes)
# [15.0, 20.0, 25.0, 30.0, 35.0, 40.0, 45.0, 50.0]

expirations = sorted(exp for exp in chain.expirations)[:3]
print(expirations)
# ['20200721', '20200818', '20200915']

rights = ['P', 'C']

contracts = [Option('VIX', expiration, strike, right, 'SMART', tradingClass='VIX')
        for right in rights
        for expiration in expirations
        for strike in strikes]

contracts = ib.qualifyContracts(*contracts)

print(len(contracts))
# 48

print(contracts[0])
# Option(conId=401123189, symbol='VIX', lastTradeDateOrContractMonth='20200721', strike=15.0, right='P', multiplier='100', exchange='SMART', currency='USD', localSymbol='VIX   200722P00015000', tradingClass='VIX')
strikes = [strike for strike in chain.strikes
        if strike % 5 == 0 and ContValue - 20 < strike < ContValue + 20]

オプションチェーンから権利行使価格を取得して権利行使価格を設定します。
今回は現在の原産価格(ContValue)の前後20ドルを指定しており、合計8つの価格としています。

expirations = sorted(exp for exp in chain.expirations)[:3]

オプションチェーンから限月を取得して限月を設定します。
今回は期近から3つを取得しています。

rights = ['P', 'C']

コールとプットを設定します。

contracts = [Option('VIX', expiration, strike, right, 'SMART', tradingClass='VIX')
        for right in rights
        for expiration in expirations
        for strike in strikes]

オプションの商品情報を、限月、権利行使価格、コールとプット事に作成し、リスト形式にまとめています。

結果、8つの権利行使価格×3つの限月×2つの権利=48個の商品情報を作成したことになります。

リアルタイムデータの取得

tickers = ib.reqTickers(*contracts)

tickers[0]

# Ticker(contract=Option(conId=401123189, symbol='VIX', lastTradeDateOrContractMonth='20200721', strike=15.0, right='P', multiplier='100', exchange='SMART', currency='USD', localSymbol='VIX   200722P00015000', tradingClass='VIX'), time=datetime.datetime(2020, 6, 26, 2, 54, 57, 282837, tzinfo=datetime.timezone.utc), bid=-1.0, bidSize=0, ask=-1.0, askSize=0, ticks=[], tickByTicks=[], domBids=[], domAsks=[], domTicks=[])

 解説

tickers = ib.reqTickers(*contracts)

スナップショットのティッカーのリストを取得します。

取得したリアルタイムデータの内容

前提

tickers = ib.reqTickers(*contracts)

print(tickers[0])

以下のタイミングで取得したティックデータです。

IB証券での先物オプションのティックデータ

取得したデータ

Ticker(
    contract=Contract(
        secType='FOP', 
        conId=417105494, 
        symbol='ES', 
        lastTradeDateOrContractMonth='20200918', 
        strike=3010.0, 
        right='P', 
        multiplier='50', 
        exchange='GLOBEX', 
        currency='USD', 
        localSymbol='ESU0 P3010', 
        tradingClass='ES'
    ), 
    time=datetime.datetime(
        2020, 8, 2, 22, 52, 51, 107188, tzinfo=datetime.timezone.utc
    ), 
    bid=39.5, 
    bidSize=77, 
    ask=40.25, 
    askSize=130, 
    prevBidSize=55, 
    prevAskSize=49, 
    close=38.6, 
    halted=0.0, 
    ticks=[], 
    tickByTicks=[], 
    domBids=[], 
    domAsks=[], 
    domTicks=[], 
    bidGreeks=OptionComputation(
        impliedVol=0.28496488167540734, 
        delta=-0.1995380473812488, 
        optPrice=39.5, 
        pvDividend=0.0, 
        gamma=0.0008463804937190304, 
        vega=3.4957011497516532, 
        theta=-1.0007167242837463, 
        undPrice=3261.75
    ), 
    askGreeks=OptionComputation(
        impliedVol=0.2863859742622713, 
        delta=-0.2006358965792611, 
        optPrice=40.25, 
        pvDividend=0.0, 
        gamma=0.000844655714337913, 
        vega=3.4956525213483545, 
        theta=-1.0086585660384553, 
        undPrice=3261.75
    ), 
    lastGreeks=OptionComputation(
        impliedVol=None, 
        delta=None, 
        optPrice=None, 
        pvDividend=0.0, 
        gamma=None, 
        vega=None, 
        theta=None, 
        undPrice=3261.75
    ), 
    modelGreeks=OptionComputation(
        impliedVol=0.2858566803782086, 
        delta=-0.20047313900492605, 
        optPrice=39.17894657377228, 
        pvDividend=0.0, 
        gamma=0.0008473670182037726, 
        vega=3.4956706470415426, 
        theta=-1.0057006113577616, 
        undPrice=3261.75
    )
)

補足

見ればわかると思いますが、少しだけ補足(説明)します。

  • tickers[0].bidtickers[0].modelGreeks.undPriceなどとすれば値を取得することができます。
  • bidGreeksaskGreeksでは、売りと買いのそれぞれのオプション価格の計算値やパラメーターを取得することができます。
    • optPrice:プレミアム価格(オプション価格)
    •  ギリシャ指標
      • delta:デルタ
      • gamma:ガンマ
      • vega:ベガ
      • theta:シータ
    • impliedVol:インプライド・ボラティリティ(Implied Volatility)
    • undPrice:原資産価格(Underlying Price)
    • pvDividend:予想配当利回り?ギリシャ指数のローにあたるのでしょうか!?

その他の取得方法

ib.reqMktData()ib.ticker()を組み合わせて取得することもできます。
もしかするとこっちのほうが簡単かも知れません。

contract = Contract(
    secType='FOP', 
    symbol='NQ', 
    lastTradeDateOrContractMonth='20200918', 
    strike='11500', 
    right='C', 
    exchange='GLOBEX', 
    tradingClass='NQ'
)

ib.reqMktData(contract)

ticker = ib.ticker(contract)

while ib.sleep(1):
    print(ticker)

# Ticker(contract=Contract(secType='FOP', symbol='NQ', lastTradeDateOrContractMonth='20200918', strike='11500', right='C', exchange='GLOBEX', tradingClass='NQ'), time=datetime.datetime(2020, 9, 8, 6, 51, 22, 194338, tzinfo=datetime.timezone.utc), bid=362.0, bidSize=10, ask=376.75, askSize=10, last=333.5, lastSize=16, volume=108, high=350.0, low=333.5, close=340.45, halted=0.0, bidGreeks=OptionComputation(impliedVol=0.422277662346468, delta=0.5407632829072302, optPrice=362.0, pvDividend=0.0, gamma=0.00048616948967971084, vega=7.692217425971194, theta=-15.854913750607771, undPrice=11554.7421875), askGreeks=OptionComputation(impliedVol=0.4409085659231793, delta=0.5402599061208777, optPrice=376.75, pvDividend=0.0, gamma=0.00046573139369862203, vega=7.691774142713825, theta=-16.558226302157625, undPrice=11554.7421875), lastGreeks=OptionComputation(impliedVol=0.4370105919271312, delta=0.5403572960823471, optPrice=333.5, pvDividend=0.0, gamma=0.00046986435477555243, vega=7.691868439444363, theta=-16.411088451798275, undPrice=11554.7421875), modelGreeks=OptionComputation(impliedVol=0.42688932735654, delta=0.540646949996421, optPrice=358.0633795576423, pvDividend=0.0, gamma=0.0004809765469258022, vega=7.692109449031818, theta=-16.029014068388065, undPrice=11554.7421875))
# Ticker(contract=Contract(secType='FOP', symbol='NQ', lastTradeDateOrContractMonth='20200918', strike='11500', right='C', exchange='GLOBEX', tradingClass='NQ'), time=datetime.datetime(2020, 9, 8, 6, 51, 23, 258238, tzinfo=datetime.timezone.utc), bid=360.75, bidSize=5, ask=375.5, askSize=10, last=333.5, lastSize=16, prevBid=362.0, prevBidSize=10, prevAsk=376.75, prevAskSize=5, volume=108, high=350.0, low=333.5, close=340.45, halted=0.0, bidGreeks=OptionComputation(impliedVol=0.422277662346468, delta=0.5407632829072302, optPrice=362.0, pvDividend=0.0, gamma=0.00048616948967971084, vega=7.692217425971194, theta=-15.854913750607771, undPrice=11554.7421875), askGreeks=OptionComputation(impliedVol=0.4409085659231793, delta=0.5402599061208777, optPrice=376.75, pvDividend=0.0, gamma=0.00046573139369862203, vega=7.691774142713825, theta=-16.558226302157625, undPrice=11554.7421875), lastGreeks=OptionComputation(impliedVol=0.4370105919271312, delta=0.5403572960823471, optPrice=333.5, pvDividend=0.0, gamma=0.00046986435477555243, vega=7.691868439444363, theta=-16.411088451798275, undPrice=11554.7421875), modelGreeks=OptionComputation(impliedVol=0.42688932735654, delta=0.5407706766033277, optPrice=358.20620797296743, pvDividend=0.0, gamma=0.000480945362442877, vega=7.692195156042089, theta=-16.02868959387523, undPrice=11555.0))

TWSの画面と同じ情報を取得

以下は、TWSのオプション・チェーンのデフォルトの画面と同じ情報を取得します。

出力結果はコールの右から順に、オプション未決済建玉、出来高、買気配数量、買気配、売気配、売気配数量となります。プット側は出力していませんが、同じ要領です。

contract = Contract(
    secType='FOP', 
    symbol='NQ', 
    lastTradeDateOrContractMonth='20200918', 
    strike='11500', 
    right='C', 
    exchange='GLOBEX', 
    tradingClass='NQ'
)

# ib.reqMktData(contract)
ib.reqMktData(contract, genericTickList='101')

ticker = ib.ticker(contract)

while ib.sleep(1):
    print(ticker.callOpenInterest, ticker.volume, ticker.bidSize, ticker.bid, ticker.ask, ticker.askSize)

# 444 108 10 360.5 375.25 10
# 444 108 10 360.5 375.25 10

解説

ib.reqMktData(contract, genericTickList='101')

genericTickListで数値を指定して取得できる情報を選択することができます。
複数指定する場合はカンマ区切りにします。

  • 100 Option Volume (オプション用)
  • 101 Option Open Interest (オプション用)*オプション未決済建玉
    • putOpenInterest:プットオプションの未決済建玉
    • callOpenInterest:コールオプションの未決済建玉
  • 104 Historical Volatility (オプション用)*ヒストリカル・ボラティリティ
  • 105 Average Option Volume (オプション用)
  • 106 Option Implied Volatility (オプション用)
  • 162 Index Future Premium
  • 165 Miscellaneous Stats
  • 221 Mark Price (used in TWS P&L computations)
  • 225 Auction values (volume, price and imbalance)
  • 233 RTVolume*最後の取引価格、取引サイズ、取引時間、総量、VWAP、単一取引フラグが含まれています。
  • 236 Shortable
  • 256 Inventory
  • 258 Fundamental Ratios
  • 411 Realtime Historical Volatility
  • 456 IBDividends

詳しく調べきれておらず申し訳ないです。
詳しくは以下を参考にしてください。ただし、情報は少ないです。

IB証券の公式サイトは以下になります。

TWS API v9.72+: EClient Class Reference

ライブラリib_insyncの公式サイトは以下になります。

API docs — ib_insync 0.9.86 documentation

 

コメント

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