问题描述
解决方案
在 QMT (Quant Maker Trading) 平台中,确实提供了直接获取期权隐含波动率(Implied Volatility, IV)的接口,同时也提供了基于 BS 模型自行计算隐含波动率的函数。
以下是详细的接口说明和使用示例。
QMT 获取期权隐含波动率接口说明
1. 直接获取实时隐含波动率
QMT 提供了一个直接的接口 ContextInfo.get_option_iv,用于获取指定期权合约的实时隐含波动率。
函数原型
ContextInfo.get_option_iv(optioncode)
参数说明
- optioncode: 字符串 (string),期权代码,例如
'10003280.SHO'。
返回值
- double: 返回该期权的实时隐含波动率数值。
2. 基于 BS 模型计算隐含波动率
如果您需要根据特定的市场参数(如自定义的无风险利率、标的价格等)来反推隐含波动率,可以使用 ContextInfo.bsm_iv 函数。该函数基于 Black-Scholes-Merton 模型计算欧式期权的隐含波动率。
函数原型
ContextInfo.bsm_iv(optionType, objectPrices, strikePrice, optionPrice, riskFree, days, dividend)
参数说明
- optionType: 字符串,期权类型。认购为
'C',认沽为'P'。 - objectPrices: 浮点数,期权标的当前价格。
- strikePrice: 浮点数,期权行权价。
- optionPrice: 浮点数,期权当前价格(权利金)。
- riskFree: 浮点数,无风险收益率(例如 0.03 代表 3%)。
- days: 整数,距离到期日的剩余天数。
- dividend: 浮点数,标的分红率。
返回值
- double: 计算得出的隐含波动率。
3. 代码示例
以下代码展示了如何在策略中调用这两个接口。
# -*- coding: gbk -*-
def init(ContextInfo):
# 设置账号(示例账号,实盘需替换)
ContextInfo.accid = '6000000248'
print("策略初始化完成")
def handlebar(ContextInfo):
# 示例期权代码:上交所期权 10003280.SHO
# 注意:请确保该合约在当前回测或实盘时间段内存在
option_code = '10003280.SHO'
# 1. 直接获取实时隐含波动率
# 注意:此接口通常用于实盘或模拟盘获取实时行情快照中的IV
realtime_iv = ContextInfo.get_option_iv(option_code)
print(f"[{option_code}] 实时隐含波动率: {realtime_iv}")
# 2. 使用 BS 模型计算隐含波动率 (示例参数)
# 假设场景:
# 标的价格: 3.51
# 行权价: 3.5
# 期权现价: 0.0725
# 无风险利率: 3%
# 剩余天数: 15天
# 分红率: 0
# 类型: 认购 (Call)
calculated_iv = ContextInfo.bsm_iv('C', 3.51, 3.5, 0.0725, 0.03, 15, 0)
print(f"[{option_code}] BS模型计算隐含波动率: {calculated_iv}")
# 仅在最后一根K线运行,避免回测日志过多
if not ContextInfo.is_last_bar():
return
Q&A
Q: get_option_iv 接口在回测模式下能获取历史的隐含波动率吗?
A: 根据官方文档描述,get_option_iv 主要用于获取实时隐含波动率。在回测模式下,建议使用 bsm_iv 配合历史行情数据(标的价格、期权价格、剩余天数等)进行动态计算,或者检查是否有专门的历史因子数据支持。
Q: bsm_iv 计算时,剩余天数 days 如何获取?
A: 可以通过 ContextInfo.get_instrumentdetail(optioncode) 获取期权的到期日 (ExpireDate),然后结合当前策略运行的日期 (ContextInfo.barpos 对应的时间) 计算出剩余天数。
Q: 如果 get_option_iv 返回 0 或异常值怎么办?
A: 这通常意味着该时刻没有有效的行情数据或计算失败。在实盘策略中,应当对返回值进行有效性判断(例如判断是否大于 0),如果数据无效,可以考虑使用 bsm_iv 进行估算或跳过该时间点的交易。