3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在期权交易中,临近到期日(Expiration Date)时,实值期权如果不及进行平仓或行权,将会面临价值归零的风险。QMT(Quantitative Trader)平台提供了完善的期权合约信息查询接口与交易接口。通过QMT Python API,我们可以实现自动监控持仓期权的到期日,并在到期日当天自动触发认购行权。
要实现自动识别到期日并触发认购行权,我们需要使用以下两个核心API:
ContextInfo.get_option_detail_data()ContextInfo.get_option_detail_data(optioncode)ExpireDate:期权到期日(格式通常为 YYYYMMDD 的整型或字符串)。optType:期权类型(CALL 代表认购,PUT 代表认沽)。VolumeMultiple:合约乘数。passorder()passorder(opType, orderType, accountid, orderCode, prType, modelprice, volume, ContextInfo)opType:操作类型。56 代表认购行权,57 代表认沽行权。orderType:下单方式。通常使用 1101(单股、单账号、普通、股/手方式下单)。prType:选价类型。行权申报通常使用指定价 11 或最新价 5(具体根据柜台要求,行权一般填入行权价或标的价格)。init 函数中设置期权交易账号,并定义需要监控的期权持仓代码。handlebar 中获取当前交易日。get_option_detail_data 获取期权的 ExpireDate,判断当前日期是否为到期日。CALL),且处于实值状态(标的资产价格 > 行权价),则调用 passorder 触发 opType=56 的认购行权指令。#coding:gbk
import datetime
def init(ContextInfo):
# 1. 设定您的期权资金账号
ContextInfo.account_id = "12345678"
ContextInfo.set_account(ContextInfo.account_id)
# 2. 设定需要监控的期权合约池(例如上交所50ETF期权)
ContextInfo.option_pool = ['10003280.SHO']
ContextInfo.set_universe(ContextInfo.option_pool)
print("QMT期权自动行权策略初始化成功!")
def handlebar(ContextInfo):
# 获取当前K线的时间戳并转换为日期字符串 YYYYMMDD
timetag = ContextInfo.get_bar_timetag(ContextInfo.barpos)
current_date = timetag_to_datetime(timetag, '%Y%m%d')
# 遍历监控的期权合约
for option_code in ContextInfo.option_pool:
# 获取期权详细信息
opt_detail = ContextInfo.get_option_detail_data(option_code)
if not opt_detail:
continue
expire_date = str(opt_detail['ExpireDate']) # 到期日 YYYYMMDD
opt_type = opt_detail['optType'] # 期权类型 CALL/PUT
strike_price = opt_detail['OptExercisePrice'] # 行权价
undl_code = opt_detail['OptUndlCode'] + '.' + opt_detail['OptUndlMarket'] # 标的代码
# 获取标的资产的最新价格
full_tick = ContextInfo.get_full_tick([undl_code])
if undl_code in full_tick:
undl_price = full_tick[undl_code]['lastPrice']
else:
continue
# 判断是否到了到期日当天
if current_date == expire_date:
print(f"合约 {option_code} 今日到期!当前标的价格: {undl_price}, 行权价: {strike_price}")
# 认购期权自动行权逻辑:属于认购期权,且标的价格高于行权价(实值期权)
if opt_type == 'CALL' and undl_price > strike_price:
# 获取当前期权持仓数量
position_info = get_trade_detail_data(ContextInfo.account_id, 'STOCK_OPTION', 'POSITION')
opt_volume = 0
for pos in position_info:
if pos.m_strInstrumentID == option_code.split('.')[0]:
opt_volume = pos.m_nCanUseVolume # 可用持仓量
break
if opt_volume > 0:
print(f"检测到实值认购期权持仓 {opt_volume} 张,一键触发自动行权!")
# 调用 passorder 发送认购行权指令
# opType=56 (认购行权), orderType=1101 (单股单账号手方式), prType=11 (指定价/模型价)
passorder(56, 1101, ContextInfo.account_id, option_code, 11, strike_price, opt_volume, ContextInfo)
else:
print(f"合约 {option_code} 为实值,但当前无可用持仓。")
passorder(56, ...) 接口的报单反馈,确保柜台支持该行权指令。