开云体育

ctrl + shift + ? for shortcuts
© 2025 开云体育

Option Open Interest


 

I'm trying to get an option open interest using ib_async, but it does not show the open interest at all.
?
The code I have using ib_async is:
?
from ib_async import *
?
ib = IB()
ib.connect('127.0.0.1', 4001, clientId=138)
?
ib.reqMarketDataType(1)
?
option1 = [Option('GOOGL', '20250117', 195, 'C', 'SMART')]
?
ib.qualifyContracts(option1[0])
?
a=ib.reqMktData(option1[0],genericTickList='100',snapshot=False, regulatorySnapshot=False)
print(a)
print("-")
?
b=ib.reqTickers(Option('GOOGL', '20250117', 195, 'C', 'SMART'))
print("Volume ", b[0].volume)
print("callOpenInterest ", b[0].callOpenInterest)
print("putOpenInterest", b[0].putOpenInterest)
print("impliedVolatility ", b[0].impliedVolatility)
?
ib.disconnect()
?
?
the output of this code is
?
Ticker(contract=Option(conId=584786601, symbol='GOOGL', lastTradeDateOrContractMonth='20250117', strike=195.0, right='C', multiplier='100', exchange='SMART', currency='USD', localSymbol='GOOGL 250117C00195000', tradingClass='GOOGL'))
-
Volume 1385.0
callOpenInterest nan
putOpenInterest nan
impliedVolatility nan
?
?
which means that open interest is missing.
?
?
Using the IBKR TWS API I can get the open interest but the way to there is a bit less user friendly
?
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from ibapi.ticktype import TickTypeEnum
import threading
import time
?
class IBApp(EWrapper, EClient):
? ? def __init__(self):
? ? ? ? EClient.__init__(self, self)
? ? ? ? self.call_open_interest = None
? ? ? ? self.reqId = 1
? ? ? ? self.oi_received = False # Flag to track if tick 27 was received
?
? ? def error(self, reqId, errorCode, errorString, advancedOrderRejectJson=''):
? ? ? ? print(f"Error. Id: {reqId}, Code: {errorCode}, Msg: {errorString}")
?
? ? def tickSize(self, reqId: int, tickType: int, size: float):
? ? ? ? if tickType == TickTypeEnum.OPTION_CALL_OPEN_INTEREST:
? ? ? ? ? ? self.call_open_interest = size
? ? ? ? ? ? self.oi_received = True #set flag to true
? ? ? ? ? ? print(f"TickSize. TickerId:", reqId, "TickType:", tickType, "Size: ", size)
? ? ? ? else:
? ? ? ? ? ? print("Not the expected tick type")
?
? ? def tickSnapshotEnd(self, reqId):
? ? ? ? print(f"TickSnapshotEnd. Ticker Id: {reqId}")
?
def run_loop(app):
? ? app.run()
?
if __name__ == "__main__":
? ? app = IBApp()
? ? app.connect("127.0.0.1", 4001, clientId=20)
? ? api_thread = threading.Thread(target=run_loop, args=(app,), daemon=True)
? ? api_thread.start()
? ? time.sleep(1)
?
? ? contract = Contract()
? ? contract.symbol = "GOOGL"
? ? contract.secType = "OPT"
? ? contract.exchange = "SMART"
? ? contract.currency = "USD"
? ? contract.lastTradeDateOrContractMonth = "20250117"
? ? contract.strike = 195
? ? contract.right = "C"
? ? contract.multiplier = "100"
?
? ? app.reqMktData(app.reqId, contract, genericTickList='101', snapshot=False, regulatorySnapshot=False, mktDataOptions=[]) #request tick 27
?
? ? time.sleep(5) # Wait for a reasonable time for data
?
? ? if app.oi_received: #check flag
? ? ? ? print(f"Option Call Open Interest Size: {app.call_open_interest}")
? ? else:
? ? ? ? print("Did not receive Option Call Open Interest data within the timeout.")
?
? ? app.disconnect()
?
?
The output of this code is
?
Error. Id: -1, Code: 2104, Msg: Market data farm connection is OK:usfarm.nj
Error. Id: -1, Code: 2104, Msg: Market data farm connection is OK:usopt
Error. Id: -1, Code: 2104, Msg: Market data farm connection is OK:usfarm
Error. Id: -1, Code: 2107, Msg: HMDS data farm connection is inactive but should be available upon demand.ushmds
Error. Id: -1, Code: 2158, Msg: Sec-def data farm connection is OK:secdefnj
Not the expected tick type
Not the expected tick type
Not the expected tick type
Not the expected tick type
Not the expected tick type
Not the expected tick type
Not the expected tick type
TickSize. TickerId: 1 TickType: 27 Size: 21890
Not the expected tick type
Option Call Open Interest Size: 21890
?
?
Does anyone use ib_async to get the option open interest and if so could you please share the way to request this data?


 

Hey Dennis,?
?
The following code should do the trick. Including a link to the IB docs' ticker codes in case you don't already have it:
?
contract = Option('GOOGL', '20250117', 195, 'C', 'SMART')
contract = ib.qualifyContracts(contract)[0]
print(contract)
a = ib.reqMktData(contract, '100,101')
ib.sleep(2) # wait 2 seconds for the first data packets to arrive
print(a)


 

Thank you!

Confirming that the following code works both during and before and after market open hours:
?
from ib_async import *
import time
?
ib = IB()
ib.connect('127.0.0.1', 4001, clientId=170)
?
ib.reqMarketDataType(1)
?
contract = Option('GOOGL', '20250117', 195, 'C', 'SMART')
contract = ib.qualifyContracts(contract)[0]
?
print("Printing contract")
print("")
print(contract)
print("")
?
a = ib.reqMktData(contract, genericTickList='100,101')
ib.sleep(2) # wait 2 seconds for the first data packets to arrive
?
print("Printing requested market data")
print("")
print(a)
print("")
print("marketDataType is ", a.marketDataType)
print("end of printing")
?
ib.disconnect()
?
The output of the relevant variable "a" on 31 December 2024 after market close is:
?
?
Ticker(contract=Option(conId=584786601, symbol='GOOGL', lastTradeDateOrContractMonth='20250117', strike=195.0, right='C', multiplier='100', exchange='SMART', currency='USD', localSymbol='GOOGL 250117C00195000', tradingClass='GOOGL'), time=datetime.datetime(2024, 12, 31, 22, 26, 39, 1784, tzinfo=datetime.timezone.utc), minTick=0.01, bid=-1.0, bidSize=0.0, ask=-1.0, askSize=0.0, last=2.01, lastSize=5.0, volume=3203.0, high=3.15, low=1.88, close=3.14, putOpenInterest=0.0, callOpenInterest=22092.0, ticks=[TickData(time=datetime.datetime(2024, 12, 31, 22, 26, 39, 1784, tzinfo=datetime.timezone.utc), tickType=5, price=2.01, size=5.0)], bidGreeks=OptionComputation(tickAttrib=0, impliedVol=0.25391115222998306, delta=None, optPrice=None, pvDividend=0.0, gamma=None, vega=-2.0, theta=-2.0, undPrice=189.0066375732422), askGreeks=OptionComputation(tickAttrib=0, impliedVol=0.25592227507404464, delta=None, optPrice=None, pvDividend=0.0, gamma=None, vega=-2.0, theta=-2.0, undPrice=189.0066375732422), lastGreeks=OptionComputation(tickAttrib=0, impliedVol=0.2561369063292868, delta=0.3078586406258187, optPrice=2.009999990463257, pvDividend=0.0, gamma=0.03386755720078562, vega=0.1486588979505994, theta=-0.11558233715117001, undPrice=189.0066375732422), modelGreeks=OptionComputation(tickAttrib=0, impliedVol=0.25530032176703077, delta=0.30719285939414664, optPrice=1.9897448496104688, pvDividend=0.0, gamma=0.033950430193128225, vega=0.14867813869422197, theta=-0.11512370414862398, undPrice=189.0066375732422), bboExchange='c70003', snapshotPermissions=3)
?
?
?
?