前提
このページでは接続後のみのサンプルを記載しています。接続方法は以下を参照してください。
IB証券 APIの接続方法
取得できるリアルタイムデータ
リアルタイムデータは購読しているマーケット・データによって取得できないものがあります。
IB証券のマーケットデータの購読は以下を参照してください。
IB証券 マーケットデータの購読
参考サイト
以下のサイトを参考に本ページを作成しました。
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にするといいかもしれません。
タイプの意味については、以下を参照してください。
[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)
結果
exchange | underlyingConId | tradingClass | multiplier | expirations | strikes | |
---|---|---|---|---|---|---|
0 | CBOE | 13455763 | VIX | 100 | [20200721, 20200818, 20200915, 20201020, 20201… | [10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17…. |
1 | SMART | 13455763 | VIXW | 100 | [20200630, 20200707, 20200714, 20200728] | [10.0, 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13…. |
2 | SMART | 13455763 | VIX | 100 | [20200721, 20200818, 20200915, 20201020, 20201… | [10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17…. |
3 | CBOE | 13455763 | VIXW | 100 | [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])
以下のタイミングで取得したティックデータです。
取得したデータ
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].bid
やtickers[0].modelGreeks.undPrice
などとすれば値を取得することができます。bidGreeks
とaskGreeks
では、売りと買いのそれぞれのオプション価格の計算値やパラメーターを取得することができます。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証券の公式サイトは以下になります。
ライブラリib_insyncの公式サイトは以下になります。
コメント