问题描述
解决方案
在 QMT 量化交易平台中,获取期权合约的行权价和到期日主要通过 ContextInfo.get_option_detail_data 函数来实现。该函数返回一个包含期权详细信息的字典。
以下是具体的实现方法和代码示例。
核心函数说明
函数名:ContextInfo.get_option_detail_data(optioncode)
- 参数:
optioncode(string),期权代码,例如'10001506.SHO'。如果传入空字符串'',则默认为当前主图显示的期权品种。 - 返回值:一个字典 (
dict),包含该期权的各项详细属性。
关键字段:
- 行权价:字典中的 key 为
'OptExercisePrice'。 - 到期日:字典中的 key 为
'ExpireDate'。
代码实现示例
以下代码展示了如何在策略中获取指定期权合约的行权价和到期日,并打印输出。
# -*- coding: gbk -*-
def init(ContextInfo):
# 在初始化中可以不做具体操作,或者设置需要查询的期权代码
pass
def handlebar(ContextInfo):
# 示例期权代码 (上交所期权)
# 请确保该合约在当前回测或实盘的时间段内是存在的
option_code = '10001506.SHO'
# 获取期权详细信息
# 如果想获取当前主图品种的信息,可以使用 ContextInfo.get_option_detail_data('')
option_detail = ContextInfo.get_option_detail_data(option_code)
# 检查是否成功获取到数据 (返回非空字典)
if option_detail:
# 获取行权价
strike_price = option_detail.get('OptExercisePrice')
# 获取到期日 (格式通常为 YYYYMMDD 的整数或字符串,视具体数据源而定)
expire_date = option_detail.get('ExpireDate')
# 获取期权名称 (方便核对)
instrument_id = option_detail.get('InstrumentID')
print(f"合约代码: {instrument_id}")
print(f"行权价: {strike_price}")
print(f"到期日: {expire_date}")
# 打印完整字典以查看其他可用字段
# print(option_detail)
else:
print(f"未能获取到合约 {option_code} 的详细信息")
# 为了避免在回测中每个tick都打印,可以加上限制只在最后一根bar打印,或者使用 return 结束
# if not ContextInfo.is_last_bar():
# return
补充说明
除了行权价和到期日,get_option_detail_data 返回的字典中还包含其他重要信息,例如:
OptUndlCode: 标的证券代码optType: 期权类型 ('CALL' 或 'PUT')OpenDate: 上市日期OptUnit: 合约单位
Q&A
Q: 如果我只知道标的股票代码(如 510300.SH),如何获取它对应的所有期权合约列表?
A: 可以使用 ContextInfo.get_option_list(undl_code, dedate, opttype, isavailable) 函数。例如 ContextInfo.get_option_list('510300.SH', '202312', 'CALL') 可以获取 2023年12月到期的所有认购期权合约代码列表。
Q: ExpireDate 返回的数据格式是什么样的?
A: 通常返回的是一个整数(int),格式为 YYYYMMDD(例如 20231227)。在使用时如果需要进行日期计算,建议先将其转换为字符串或 datetime 对象。
Q: 这个函数支持回测模式吗?
A: 支持。在回测模式下,该函数会返回对应历史时刻该合约的静态属性信息。注意获取历史已退市的期权合约信息时,需要确保本地已下载了相应的历史合约列表数据。