跳转到内容

接收期权链

期权链参数通过 securityDefinitionOptionParameter() 回调返回。一次请求通常会收到多次回调,因为不同交易所会返回各自的期权参数集合。

def securityDefinitionOptionParameter(
self,
reqId,
exchange,
underlyingConId,
tradingClass,
multiplier,
expirations,
strikes,
):
...
def securityDefinitionOptionParameterEnd(self, reqId):
...
字段类型中文含义AAPL 示例说明
reqIdint请求编号9503对应 reqSecDefOptParams() 的请求编号。
exchangestr期权交易所SMART也可能是 CBOEPHLXISE 等。
underlyingConIdint标的合约 ID265598表示这些参数属于哪个标的。
tradingClassstr交易类别AAPL构造期权 Contract 时经常需要。
multiplierstr合约乘数100美股标准期权常见一张代表 100 股。
expirationsset[str]到期日集合2026061520281215程序里应排序后使用。
strikesset[float]行权价集合5.0600.0程序里应排序、筛选后使用。

expirationsstrikes 是集合,集合没有稳定顺序。页面展示、策略筛选、日志输出都应该先排序。

def securityDefinitionOptionParameter(
self,
reqId,
exchange,
underlyingConId,
tradingClass,
multiplier,
expirations,
strikes,
):
sorted_expirations = sorted(expirations)
sorted_strikes = sorted(float(strike) for strike in strikes)
row = {
"reqId": reqId,
"exchange": exchange,
"underlyingConId": underlyingConId,
"tradingClass": tradingClass,
"multiplier": multiplier,
"expirationCount": len(sorted_expirations),
"strikeCount": len(sorted_strikes),
"firstExpiration": sorted_expirations[0],
"lastExpiration": sorted_expirations[-1],
"minStrike": min(sorted_strikes),
"maxStrike": max(sorted_strikes),
}
self.rows.append(row)

示例连接从 SMART 交易所维度拿到的样例:

OPTION_SAMPLE=exchange=SMART;underlyingConId=265598;tradingClass=AAPL;multiplier=100;expirationCount=26;strikeCount=123;firstExpiration=20260615;lastExpiration=20281215;minStrike=5.0;maxStrike=600.0

这个结果说明:

输出片段含义
exchange=SMART这是 SMART 维度的参数集合。
underlyingConId=265598标的是 AAPL 股票合约。
tradingClass=AAPL构造 AAPL 期权合约时常用这个交易类别。
multiplier=100一张标准 AAPL 期权通常对应 100 股。
expirationCount=26返回了 26 个可用到期日。
strikeCount=123返回了 123 个行权价。
firstExpiration=20260615排序后的最早到期日。
lastExpiration=20281215排序后的最晚到期日。
minStrike=5.0返回集合里的最低行权价。
maxStrike=600.0返回集合里的最高行权价。

如果只处理第一条 securityDefinitionOptionParameter(),可能只拿到某一个交易所的参数。securityDefinitionOptionParameterEnd() 触发后,才表示这次请求的多条交易所参数已经返回完。

def securityDefinitionOptionParameterEnd(self, reqId):
self.end.set()

实际程序里可以等待 self.end,再统一筛选 SMART、排序到期日、挑选目标行权价。

拿到期权链参数后,可以构造具体期权合约:

from ibapi.contract import Contract
def build_aapl_call(expiry: str, strike: float) -> Contract:
contract = Contract()
contract.symbol = "AAPL"
contract.secType = "OPT"
contract.exchange = "SMART"
contract.currency = "USD"
contract.lastTradeDateOrContractMonth = expiry
contract.strike = strike
contract.right = "C"
contract.multiplier = "100"
contract.tradingClass = "AAPL"
return contract

但这一步只是“拼出一个候选合约”。正式请求行情或下单前,应该再调用 reqContractDetails() 验证它能返回合约详情。示例连接里,期权链参数返回成功,但自动挑选的一组近期看涨期权候选没有通过合约详情验证,TWS 返回:

ERROR=reqId=97605;code=200;msg=未找到该请求的证券定义

这正好对应官方提醒:期权链返回的到期日和行权价集合,不保证任意组合都能组成有效期权合约。