跳转到内容

接收期权数据

期权 Greeks 和模型价格通过 tickOptionComputation() 回调接收。无论数据来自 reqMktData()calculateOptionPrice() 还是 calculateImpliedVolatility(),最终都会进入这个回调。

Python API 中的回调形式如下:

def tickOptionComputation(
self,
reqId,
tickType,
tickAttrib,
impliedVol,
delta,
optPrice,
pvDividend,
gamma,
vega,
theta,
undPrice,
):
...
字段中文说明
reqId请求编号,对应 reqMktData()calculateOptionPrice()calculateImpliedVolatility() 的请求 ID。
tickTypeTick 类型,用来区分 bid/ask/last/model 等来源。
tickAttribTick 属性对象,不同 API 版本字段可能不同。
impliedVol隐含波动率。
delta标的价格变化 1 单位时,期权价格理论变化量。
optPrice期权模型价格或对应来源的期权价格。
pvDividend预期股息现值。
gamma标的价格变化时 delta 的变化速度。
vega波动率变化时,期权价格的敏感度。
theta时间流逝对期权价格的影响。
undPrice模型使用的标的价格。

常见的期权计算 tick 类型如下:

tickType常见来源中文说明
10Bid Option Computation买价对应的期权模型值。
11Ask Option Computation卖价对应的期权模型值。
12Last Option Computation最新成交价对应的期权模型值。
13Model Option ComputationTWS 模型计算值。
53自定义计算请求常见于 calculateOptionPrice()calculateImpliedVolatility() 返回。
def tickOptionComputation(
self,
reqId,
tickType,
tickAttrib,
impliedVol,
delta,
optPrice,
pvDividend,
gamma,
vega,
theta,
undPrice,
):
"""接收期权 Greeks。不要把未设置值当作 0。"""
print(
"reqId=", reqId,
"tickType=", tickType,
"iv=", impliedVol,
"delta=", delta,
"gamma=", gamma,
"vega=", vega,
"theta=", theta,
"optionPrice=", optPrice,
"underlyingPrice=", undPrice,
)

TWS API 可能用很大的哨兵值表示字段未设置。开发时应先判断字段是否有效,再参与计算。

def is_unset_number(value: float) -> bool:
"""判断 TWS API 常见未设置数值。"""
return value is None or abs(float(value)) > 1e100

不要把未设置值直接显示成 0,否则用户会误以为 delta、vega 或期权价格真的为 0。

如果同一个程序里同时请求行情 Greeks 和模型计算,建议保留请求 ID 映射:

request_names = {
97602: "实时期权 Greeks",
97603: "计算期权价格",
97604: "计算隐含波动率",
}
def tickOptionComputation(self, reqId, tickType, tickAttrib, impliedVol, delta, optPrice, pvDividend, gamma, vega, theta, undPrice):
name = request_names.get(reqId, "未知请求")
print(name, tickType, impliedVol, delta, optPrice)

这样排查日志时能知道某一行 Greeks 来自真实行情,还是来自本地模型计算请求。

calculateOptionPrice() 给定 25% 波动率和 300 标的价格时,返回如下:

GREEKS=reqId=97603;tickType=53;iv=0.25;delta=0.506375;gamma=0.083872;vega=0.076269;theta=-0.659189;optPrice=1.926125;undPrice=300.0

calculateImpliedVolatility() 给定期权价格 10.0 和 300 标的价格时,返回如下:

GREEKS=reqId=97604;tickType=53;iv=1.308927;delta=None;gamma=None;vega=None;theta=None;optPrice=10.0;undPrice=300.0

这里的 None 表示该计算返回没有给出对应字段,不应当显示成 0。实时行情 Greeks 如果权限不完整,可能先返回部分 Greeks,再通过 error() 返回 354 权限提示;程序应同时处理回调值和错误码。