接收期权链
期权链参数通过 securityDefinitionOptionParameter() 回调返回。一次请求通常会收到多次回调,因为不同交易所会返回各自的期权参数集合。
def securityDefinitionOptionParameter( self, reqId, exchange, underlyingConId, tradingClass, multiplier, expirations, strikes,): ...
def securityDefinitionOptionParameterEnd(self, reqId): ...| 字段 | 类型 | 中文含义 | AAPL 示例 | 说明 |
|---|---|---|---|---|
reqId | int | 请求编号 | 9503 | 对应 reqSecDefOptParams() 的请求编号。 |
exchange | str | 期权交易所 | SMART | 也可能是 CBOE、PHLX、ISE 等。 |
underlyingConId | int | 标的合约 ID | 265598 | 表示这些参数属于哪个标的。 |
tradingClass | str | 交易类别 | AAPL | 构造期权 Contract 时经常需要。 |
multiplier | str | 合约乘数 | 100 | 美股标准期权常见一张代表 100 股。 |
expirations | set[str] | 到期日集合 | 20260615 到 20281215 | 程序里应排序后使用。 |
strikes | set[float] | 行权价集合 | 5.0 到 600.0 | 程序里应排序、筛选后使用。 |
结构化处理方式
Section titled “结构化处理方式”expirations 和 strikes 是集合,集合没有稳定顺序。页面展示、策略筛选、日志输出都应该先排序。
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)AAPL 参考样例
Section titled “AAPL 参考样例”示例连接从 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 | 返回集合里的最高行权价。 |
为什么必须等 End 回调
Section titled “为什么必须等 End 回调”如果只处理第一条 securityDefinitionOptionParameter(),可能只拿到某一个交易所的参数。securityDefinitionOptionParameterEnd() 触发后,才表示这次请求的多条交易所参数已经返回完。
def securityDefinitionOptionParameterEnd(self, reqId): self.end.set()实际程序里可以等待 self.end,再统一筛选 SMART、排序到期日、挑选目标行权价。
从参数集合到具体期权合约
Section titled “从参数集合到具体期权合约”拿到期权链参数后,可以构造具体期权合约:
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=未找到该请求的证券定义这正好对应官方提醒:期权链返回的到期日和行权价集合,不保证任意组合都能组成有效期权合约。