跳转到内容

接收期权数据

期权 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 权限提示;程序应同时处理回调值和错误码。