3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在期权交易中,**波动率套利(Volatility Arbitrage)**是一种经典的量化交易策略。当期权的实时市场价格偏离了基于Black-Scholes-Merton (BSM) 模型计算出的理论价格时,就存在套利机会。QMT(Quantitative Trading System)平台提供了强大的期权分析接口,使得投资者可以轻松获取实时隐含波动率并计算理论定价。
本文将详细介绍如何结合QMT的 ContextInfo.get_option_iv() 与 ContextInfo.bsm_price() 接口,构建一个期权波动率套利策略。
get_option_ivContextInfo.get_option_iv(optioncode)optioncode(期权代码,如 '10003280.SHO')。double(隐含波动率数值)。bsm_priceContextInfo.bsm_price(optionType, objectPrices, strikePrice, riskFree, sigma, days, dividend)optionType:期权类型,认购为 'C',认沽为 'P'。objectPrices:期权标的价格(可为单个价格或列表)。strikePrice:期权行权价。riskFree:无风险收益率(如 0.03 代表 3%)。sigma:标的波动率(套利时可传入历史波动率或预测波动率)。days:剩余天数。dividend:分红率。get_full_tick 获取期权合约的最新市场价格(最新价、买卖价)以及标的证券的最新价格。get_option_iv 获取当前期权的实时隐含波动率(市场IV)。bsm_price 传入基准波动率(例如标的历史波动率 OptUndlHistoryRate 或无风险利率等),计算出期权的理论合理价格。市场最新价 > 理论价格 + 阈值,且市场IV显著高于历史波动率,说明期权价格偏高,可执行卖出开仓(Short Volatility)。市场最新价 < 理论价格 - 阈值,且市场IV显著低于历史波动率,说明期权价格偏低,可执行买入开仓(Long Volatility)。以下是一个在QMT中运行的期权波动率套利策略框架:
#encoding:gbk
import datetime
def init(ContextInfo):
# 设定套利目标期权合约(以上证50ETF期权为例)
ContextInfo.option_code = '10003280.SHO'
ContextInfo.set_universe([ContextInfo.option_code])
# 获取期权详细信息以获取标的代码、行权价、到期日等
detail = ContextInfo.get_option_detail_data(ContextInfo.option_code)
ContextInfo.undl_code = detail['OptUndlCode'] + '.' + detail['OptUndlMarket'] # 标的代码
ContextInfo.strike_price = detail['OptExercisePrice'] # 行权价
ContextInfo.opt_type = 'C' if detail['optType'] == 'CALL' else 'P' # 期权类型
# 获取到期日并计算剩余天数
expire_date_str = str(detail['ExpireDate'])
ContextInfo.expire_date = datetime.datetime.strptime(expire_date_str, '%Y%m%d')
# 设定无风险利率与基准波动率(实际交易中可动态计算历史波动率)
ContextInfo.risk_free = 0.03 # 3%
ContextInfo.base_sigma = 0.20 # 假设基准历史波动率为20%
ContextInfo.dividend = 0.0
# 交易账号设置
ContextInfo.account_id = 'YOUR_OPTION_ACCOUNT'
ContextInfo.set_account(ContextInfo.account_id)
def handlebar(ContextInfo):
if not ContextInfo.is_last_bar():
return
# 1. 计算剩余天数
today = datetime.datetime.now()
remaining_days = (ContextInfo.expire_date - today).days
if remaining_days <= 0:
print("期权已到期或今日到期,不进行套利")
return
# 2. 获取标的最新价格与期权最新市场价
undl_tick = ContextInfo.get_full_tick([ContextInfo.undl_code])
opt_tick = ContextInfo.get_full_tick([ContextInfo.option_code])
if not undl_tick or not opt_tick:
return
undl_price = undl_tick[ContextInfo.undl_code]['lastPrice']
opt_market_price = opt_tick[ContextInfo.option_code]['lastPrice']
# 3. 获取期权实时隐含波动率(IV)
realtime_iv = ContextInfo.get_option_iv(ContextInfo.option_code)
# 4. 使用 BSM 模型计算理论价格
theoretical_price = ContextInfo.bsm_price(
ContextInfo.opt_type,
undl_price,
ContextInfo.strike_price,
ContextInfo.risk_free,
ContextInfo.base_sigma,
remaining_days,
ContextInfo.dividend
)
print(f"标的价: {undl_price:.4f} | 期权市价: {opt_market_price:.4f} | 理论价: {theoretical_price:.4f} | 实时IV: {realtime_iv:.4f}")
# 5. 套利交易信号判定
spread_threshold = 0.0050 # 套利价格偏差阈值
# 偏离度过大且IV处于高位 -> 卖出高估期权
if opt_market_price > (theoretical_price + spread_threshold) and realtime_iv > ContextInfo.base_sigma * 1.2:
print("检测到期权价格高估,执行卖出开仓套利")
# 52: 卖出开仓 (期权交易)
passorder(52, 1101, ContextInfo.account_id, ContextInfo.option_code, 5, -1, 1, ContextInfo)
# 偏离度过大且IV处于低位 -> 买入低估期权
elif opt_market_price < (theoretical_price - spread_threshold) and realtime_iv < ContextInfo.base_sigma * 0.8:
print("检测到期权价格低估,执行买入开仓套利")
# 50: 买入开仓 (期权交易)
passorder(50, 1101, ContextInfo.account_id, ContextInfo.option_code, 5, -1, 1, ContextInfo)
spread_threshold 阈值时,务必将双边交易成本计算在内。