3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT(迅投量化交易系统)中,编写期权套利或方向性交易策略时,第一步通常是获取特定标的(如华夏上证50ETF 510050.SH 或 华泰柏瑞沪深300ETF 510300.SH)对应的完整期权链数据。
本文将详细介绍通过 QMT Python API 获取期权合约列表的两种核心 API 方法:ContextInfo.get_option_list 和 ContextInfo.get_option_undl_data。
ContextInfo.get_option_list适用于精准筛选特定到期月份、类型(认购/认沽)或可交易状态的期权合约列表。
ContextInfo.get_option_list(undl_code, dedate, opttype, isavailable)
undl_code (str): 期权标的代码,例如 '510300.SH'。dedate (str):
'YYYYMM' 格式:指定期权到期月份(如 '202101')。'YYYYMMDD' 格式:获取指定日期当天可交易的期权(如 '20210104')。opttype (str): 期权类型,'CALL' 表示认购期权,'PUT' 表示认沽期权,留空 '' 则同时获取认购和认沽。isavailable (bool): 仅当 dedate 为 'YYYYMMDD' 时生效。True 表示仅返回当前可用合约;False 返回包含已退市/历史可用合约。返回包含符合条件的期权代码列表(list)。
ContextInfo.get_option_undl_data适用于快速查询指定标的绑定的所有期权合约品种。
ContextInfo.get_option_undl_data(undl_code_ref)
undl_code_ref (str): 期权标的代码,如 '510300.SH'。如果传入空字符串 '',则返回全市场所有期权标的对应的品种列表。list(期权合约代码列表)。dict(以标的代码为键的字典)。以下示例展示了如何在 QMT 模型中获取 50ETF 和 300ETF 的全部期权链,并筛选出认购与认沽合约:
#encoding:gbk
def init(ContextInfo):
# 设定标的代码
target_etf = '510300.SH' # 沪深300ETF
print(f"=== 开始获取 {target_etf} 的期权链列表 ===")
# 方法一:使用 get_option_undl_data 获取该标的下的所有期权合约
all_options = ContextInfo.get_option_undl_data(target_etf)
print(f"{target_etf} 关联的期权合约总数: {len(all_options)}")
if all_options:
print(f"前5个合约代码示例: {all_options[:5]}")
def handlebar(ContextInfo):
# 仅在最后一根 Bar 上执行一次演示
if not ContextInfo.is_last_bar():
return
target_etf = '510050.SH' # 上证50ETF
current_date = '20231025' # 示例交易日
# 方法二:获取指定交易日可交易的看涨期权(CALL)与看跌期权(PUT)
call_options = ContextInfo.get_option_list(target_etf, current_date, "CALL", True)
put_options = ContextInfo.get_option_list(target_etf, current_date, "PUT", True)
print(f"\n在日期 {current_date} 下:")
print(f"50ETF 可交易认购期权(CALL)数量: {len(call_options)}")
print(f"50ETF 可交易认沽期权(PUT)数量: {len(put_options)}")
.SHO(如 '10001506.SHO'),深交所期权后缀为 .SZO,在进行委托下单(如 passorder)时需保持代码格式一致。ContextInfo.get_option_detail_data(optioncode) 进一步查询行权价(OptExercisePrice)、到期日(ExpireDate)及合约乘数(VolumeMultiple)等关键要素。