问题描述
解决方案
在 QMT 中,获取指定 ETF 在特定到期月份的认购(Call)和认沽(Put)期权合约代码,主要使用 ContextInfo.get_option_list 接口。
核心函数说明
ContextInfo.get_option_list(undl_code, dedate, opttype, isavailable)
- undl_code: 期权标的代码,例如上证50ETF为
'510050.SH'。 - dedate: 期权到期月份,格式为
"YYYYMM"(例如"202312")。 - opttype: 期权类型。传
"CALL"获取认购,传"PUT"获取认沽,传""(空字符串) 则同时获取两者。 - isavailable: 当
dedate为月份格式时,此参数通常可忽略或传默认值。
策略代码示例
以下代码展示了如何获取 华夏上证50ETF (510050.SH) 在 2023年12月 到期的所有期权合约代码。
# -*- coding: gbk -*-
def init(ContextInfo):
# 1. 设置标的物代码 (例如: 50ETF)
underlying_code = '510050.SH'
# 2. 设置到期月份 (格式: YYYYMM)
# 注意:请确保该月份有对应的期权合约数据,如果是回测,需确保在回测时间范围内
target_month = '202312'
# 3. 获取所有合约 (认购 + 认沽)
# 第三个参数传 "" 代表获取所有类型
all_options = ContextInfo.get_option_list(underlying_code, target_month, "")
# 4. 分别获取认购和认沽 (可选)
call_options = ContextInfo.get_option_list(underlying_code, target_month, "CALL")
put_options = ContextInfo.get_option_list(underlying_code, target_month, "PUT")
# 打印结果
print(f"标的: {underlying_code}, 到期月份: {target_month}")
print("=" * 30)
print(f"全部合约数量: {len(all_options)}")
print(f"全部合约列表: {all_options}")
print("-" * 30)
print(f"认购合约(Call)数量: {len(call_options)}")
print(f"认购合约列表: {call_options}")
print("-" * 30)
print(f"认沽合约(Put)数量: {len(put_options)}")
print(f"认沽合约列表: {put_options}")
def handlebar(ContextInfo):
# 该策略主要在 init 中演示数据获取,handlebar 可留空
pass
注意事项
- 数据下载:如果是回测历史月份的期权,请务必在 QMT 客户端的【数据管理】中下载对应时间段的期权合约列表和期权行情数据。
- 格式要求:
dedate参数必须是字符串格式。如果是获取某个月份的所有合约,格式必须是"YYYYMM";如果是获取某一天正在交易的合约,格式则是"YYYYMMDD"。 - 标的代码:标的代码需要包含后缀,如
.SH或.SZ。
Q&A
Q: 如何获取当前交易日所有可交易的期权合约,而不是指定月份的?
A: 将 dedate 参数设置为当前日期(格式 "YYYYMMDD"),并将 isavailable 参数设置为 True。例如:ContextInfo.get_option_list('510050.SH', '20231201', "", True)。
Q: 获取到的期权代码列表包含后缀吗?
A: 是的,返回的列表中包含市场后缀,例如 '10005001.SHO'(上海证券交易所期权)。
Q: 如何进一步获取这些期权合约的行权价和到期日详细信息?
A: 获取到代码列表后,可以使用 ContextInfo.get_instrumentdetail(option_code) 或 ContextInfo.get_option_detail_data(option_code) 来查询单个合约的具体信息(如行权价、合约乘数等)。