跳转到内容

请求期权希腊值

请求期权希腊值使用的仍然是 reqMktData()。区别在于合约必须是具体的期权合约,TWS 才能在 tickOptionComputation() 回调里返回模型数据。

在请求 Greeks 前,先确认三件事:

检查项为什么重要
期权合约能被 reqContractDetails() 找到找不到合约时,请求 Greeks 会直接失败。
账号具备对应期权行情权限没有权限时,可能没有 Greeks 或返回行情订阅错误。
程序已经收到 nextValidId()说明 Socket 握手完成,消息线程正在工作。
from ibapi.contract import Contract
def build_option_contract() -> Contract:
"""示例期权合约。实际项目应先从期权链中选择到期日和行权价。"""
contract = Contract()
contract.symbol = "AAPL"
contract.secType = "OPT"
contract.exchange = "SMART"
contract.currency = "USD"
contract.lastTradeDateOrContractMonth = "20260615"
contract.strike = 300.0
contract.right = "C"
contract.multiplier = "100"
contract.tradingClass = "AAPL"
return contract
# 请求实时期权 Greeks。
app.reqMktData(
97602,
build_option_contract(),
"",
False,
False,
[],
)
参数示例中文说明
tickerId97602行情请求编号,回调时用来识别是哪一个期权。
contractbuild_option_contract()具体期权合约。
genericTickList""期权 Greeks 不需要额外 generic tick 才能触发模型回调。
snapshotFalseFalse 表示流式订阅。
regulatorySnapshotFalse不请求监管快照。
mktDataOptions[]通常留空。

Greeks 请求本质上是行情订阅。不需要继续接收时,应主动取消:

app.cancelMktData(97602)

如果请求因为合约或权限问题没有真正建立,取消时可能收到 300。这种情况通常不是新错误,而是前面的订阅没有成功。

AAPL 期权链可以返回,并且能构造出一个可识别的 AAPL 看涨期权合约:

SECDEF_END=True
AAPL_OPTION_ROWS=20
SELECTED_OPTION=symbol=AAPL;expiry=20260615;strike=300.0;right=C;exchange=SMART;tradingClass=AAPL
OPTION_CONTRACT_DETAILS=1
OPTION_DETAIL=conId=888142962;localSymbol=AAPL 260615C00300000;tradingClass=AAPL;exchange=SMART;lastTradeDateOrContractMonth=20260615;strike=300.0;right=C;multiplier=100

实时 Greeks 请求发送后,账号可能收到部分 Greeks 回调;如果缺少对应期权市场数据订阅,还会收到权限错误:

GREEKS=reqId=97602;tickType=13;iv=0.193789;delta=0.044579;gamma=0.018394;vega=0.02568;theta=-0.066035;optPrice=0.093621;undPrice=None
ERROR=reqId=97602;code=354;msg=未订阅所请求的市场数据...:延迟市场数据可用。:AAPL JUN 15 '26 300 Call/TOP/ALL

因此,代码结构和合约定位已经能到达 TWS;真实行情 Greeks 是否完整返回,取决于标的和期权的市场数据权限。实际使用时,应先从 TWS 合约详情窗口或 reqContractDetails() 返回中确认一个具体期权合约,再请求 Greeks。