from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
class IBApp(EWrapper, EClient):
def __init__(self):
EClient.__init__(self, self)
def nextValidId(self, orderId: int):
# 定义期权合约
contract = Contract()
contract.symbol = "SPX"
contract.secType = "OPT"
contract.exchange = "SMART"
contract.currency = "USD"
contract.lastTradeDateOrContractMonth = "20231020" # 到期日
contract.strike = 4500 # 行权价
contract.right = "C" # 看涨期权
# 请求期权数据
self.reqMktData(orderId, contract, "", False, False, None)
def tickOptionComputation(self, reqId, tickType, impliedVol, delta, gamma, vega, theta, undPrice):
print(f"Delta: {delta}, Gamma: {gamma}, Vega: {vega}, Theta: {theta}")
# 在这里计算高阶 Greeks
zomma = gamma / impliedVol * (delta * (delta - 1) - 1) # 示例计算 Zomma
print(f"Zomma: {zomma}")
app = IBApp()
app.connect("127.0.0.1", 7497, clientId=0)
app.run()