3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在进行期权备兑开仓(Covered Call)交易时,投资者需要锁定足额的标的证券(通常为股票或ETF)作为担保。为了实现自动化、精准的仓位管理,我们需要在QMT中动态获取期权合约的合约单位(OptUnit),并根据计划申报的期权张数,计算出需要准备或锁定的标的证券数量。
本文将详细介绍如何使用 QMT Python API 中的 get_option_detail_data 接口获取 OptUnit,并给出完整的备兑开仓计算与下单示例。
ContextInfo.get_option_detail_data()QMT 提供了专门获取期权合约细节的接口,返回一个包含期权各项参数的字典(dict)。
ContextInfo.get_option_detail_data(optioncode)OptUnit:期权合约单位(即一张期权合约对应多少股标的证券,通常为 10000 股)。OptUndlCode:期权标的证券代码。optType:期权类型('CALL' 或 'PUT')。OptExercisePrice:期权行权价。passorder()对于期权备兑开仓,passorder 的操作类型(opType)需设置为 54(备兑开仓)。
备兑开仓所需的标的证券数量计算公式非常简单:
$$\text{所需标的股数} = \text{计划申报期权张数} \times \text{期权合约单位 (OptUnit)}$$
例如:计划买入/备兑开仓 5 张上证50ETF购1月3000期权(假设合约单位 OptUnit 为 10000),则需要锁定 $5 \times 10000 = 50000$ 股 50ETF 现货。
以下是一个完整的 QMT 策略示例,展示了如何在初始化时获取期权合约单位,并在 handlebar 中动态计算并执行备兑开仓:
#encoding:gbk
import time
def init(ContextInfo):
# 设定交易账号(请替换为您的实际期权资金账号)
ContextInfo.account_id = '12345678'
ContextInfo.set_account(ContextInfo.account_id)
# 定义需要操作的期权合约代码(以沪市期权为例)
ContextInfo.option_code = '10003280.SHO'
# 获取期权详细信息
option_detail = ContextInfo.get_option_detail_data(ContextInfo.option_code)
if option_detail:
# 动态获取合约单位(OptUnit)与标的代码
ContextInfo.opt_unit = option_detail.get('OptUnit', 10000) # 缺省默认为10000
ContextInfo.underlying_code = option_detail.get('OptUndlCode', '')
print(f"期权合约: {ContextInfo.option_code}")
print(f"期权标的: {ContextInfo.underlying_code}")
print(f"合约单位 (OptUnit): {ContextInfo.opt_unit}")
else:
print("获取期权详细信息失败,请检查合约代码是否正确或数据是否下载完整!")
ContextInfo.opt_unit = None
def handlebar(ContextInfo):
# 仅在最后一根Bar执行交易逻辑
if not ContextInfo.is_last_bar():
return
if ContextInfo.opt_unit is None:
return
# 设定计划申报的期权张数
target_option_volume = 5 # 计划开仓 5 张
# 动态计算单笔申报所需的标的证券数量
required_underlying_shares = target_option_volume * ContextInfo.opt_unit
print(f"计划申报期权张数: {target_option_volume} 张")
print(f"单笔申报所需标的证券数量: {required_underlying_shares} 股")
# 获取当前标的持仓,确保有足额标的进行备兑(实际策略中可加入此风控逻辑)
# positions = get_trade_detail_data(ContextInfo.account_id, 'STOCK_OPTION', 'POSITION')
# 执行备兑开仓下单
# opType=54 (备兑开仓), orderType=1101 (单股单账号股/手方式), prType=5 (最新价)
passorder(54, 1101, ContextInfo.account_id, ContextInfo.option_code, 5, -1, target_option_volume, '备兑开仓策略', 1, ContextInfo)
print("已发送备兑开仓委托指令。")
get_option_detail_data 前,请确保已通过 QMT 客户端的“数据管理”功能补充了对应期权市场(如 SHO 上交所期权、SZO 深交所期权)的过期合约列表和历史行情数据。passorder 中的 accountid 必须是开通了期权交易权限的资金账号,且账号类型需与期权市场匹配。