问题描述
解决方案
在 QMT 平台中,根据期权价格反推隐含波动率(Implied Volatility, IV),主要使用内置的 ContextInfo.bsm_iv 函数。该函数基于 Black-Scholes-Merton (BSM) 模型,通过输入期权价格、标的价格、行权价等参数,计算出隐含波动率。
以下是具体的代码实现和参数说明。
核心代码实现
# -*- coding: gbk -*-
def init(ContextInfo):
# 初始化函数,这里不需要做特殊设置
pass
def handlebar(ContextInfo):
# 示例场景:
# 计算一个剩余15天到期、行权价为3.5的认购期权
# 当前标的价格为3.51元,期权市场价格为0.0725元
# 假设无风险利率为3%,分红率为0
# 1. 定义参数
optionType = 'C' # 期权类型:'C' 代表认购 (Call),'P' 代表认沽 (Put)
objectPrice = 3.51 # 期权标的资产的当前价格 (S)
strikePrice = 3.5 # 期权行权价 (K)
optionPrice = 0.0725 # 期权当前的最新市场价格 (Price)
riskFree = 0.03 # 无风险利率 (r),例如 3% 填 0.03
days = 15 # 距离到期日的剩余天数 (T)
dividend = 0 # 标的分红率 (q)
# 2. 调用 bsm_iv 函数反推隐含波动率
# 注意:ContextInfo.bsm_iv 会使用迭代法求解波动率
iv = ContextInfo.bsm_iv(optionType, objectPrice, strikePrice, optionPrice, riskFree, days, dividend)
# 3. 输出结果
print(f"期权价格: {optionPrice}, 反推的隐含波动率 (IV): {iv}")
# 实际策略中,通常只在最后一根K线运行此逻辑,避免历史回测打印过多
if ContextInfo.is_last_bar():
print("计算完成")
函数详解:ContextInfo.bsm_iv
该函数用于计算欧式期权的隐含波动率。
语法:
ContextInfo.bsm_iv(optionType, objectPrices, strikePrice, optionPrice, riskFree, days, dividend)
参数说明:
| 参数名 | 类型 | 说明 |
|---|---|---|
| optionType | string | 期权类型。'C' 表示认购期权,'P' 表示认沽期权。 |
| objectPrices | number | 标的资产的当前价格。 |
| strikePrice | number | 期权的行权价格。 |
| optionPrice | number | 期权的现价(即你希望用来反推IV的价格)。 |
| riskFree | number | 无风险利率(年化)。通常可以使用 ContextInfo.get_risk_free_rate(index) 获取,或者设定固定值(如 0.03)。 |
| days | number | 距离到期日的剩余天数。 |
| dividend | number | 标的分红率(年化)。如果不考虑分红,填 0。 |
返回值:
- 返回一个
double类型的数值,即年化隐含波动率(例如返回 0.23 代表 23%)。
补充:直接获取交易所发布的 IV
如果你不需要自己根据特定价格反算,而是想直接获取交易所或数据商提供的实时隐含波动率数据,可以使用 ContextInfo.get_option_iv 接口。
# -*- coding: gbk -*-
def handlebar(ContextInfo):
if not ContextInfo.is_last_bar():
return
# 期权代码,例如上交所的某个期权合约
option_code = '10003280.SHO'
# 直接获取该期权的实时隐含波动率
market_iv = ContextInfo.get_option_iv(option_code)
print(f"合约 {option_code} 的市场隐含波动率为: {market_iv}")
总结
- 自定义计算/反推:使用
ContextInfo.bsm_iv。适用于你需要根据自己的理论价格、或者盘口买一/卖一价来反算 IV 的场景。 - 直接获取行情:使用
ContextInfo.get_option_iv。适用于直接使用市场公认数据进行分析的场景。
Q&A
Q: ContextInfo.bsm_iv 计算的是美式期权还是欧式期权?
A: 该函数基于 Black-Scholes-Merton 模型,理论上是针对欧式期权的。对于美式期权(如国内的商品期权),该模型是一个近似值,但在实务中常被通用。国内的 ETF 期权(如 50ETF 期权)是欧式的,完全适用。
Q: 如果计算出的 IV 是 nan 或者是 0 怎么办?
A: 这通常意味着输入参数异常(例如期权价格为负、剩余天数为0)或者期权价格严重偏离理论价值(例如深度实值或深度虚值期权,价格包含了过大的流动性溢价或套利空间),导致模型无法收敛。
Q: 如何动态获取剩余天数 days?
A: 可以结合 ContextInfo.get_contract_expire_date(code) 获取到期日,然后与当前日期 ContextInfo.get_bar_timetag(index) 进行差值计算得出。