🚀 AI 一键生成 qmt 策略代码

利用 get_option_detail_data 获取期权多空头保证金率

qmt | 发布时间: 2025/12/29
以下内容由 EasyQuant 生成。

问题描述

怎么在代码里查询期权合约的保证金比例?

解决方案

在 QMT 量化交易平台中,查询期权合约的保证金比例主要使用 ContextInfo.get_option_detail_data(optioncode) 接口。

该接口会返回一个包含期权详细信息的字典,其中与保证金相关的字段为:

  • LongMarginRatio: 多头保证金率
  • ShortMarginRatio: 空头保证金率

代码实现

以下是一个完整的策略示例代码,展示如何在 init 方法中获取指定期权合约的保证金比例并打印输出。

# -*- coding: gbk -*-

def init(ContextInfo):
    # 指定期权合约代码,例如上交所的某个期权合约
    # 格式为 '代码.市场',如 '10001506.SHO'
    # 如果在回测或模型交易界面运行,也可以使用 ContextInfo.stockcode 获取当前主图代码
    option_code = '10001506.SHO' 
    
    # 获取期权详细信息
    detail_data = ContextInfo.get_option_detail_data(option_code)
    
    # 打印获取到的数据类型,确保获取成功
    print(f"获取到的数据类型: {type(detail_data)}")
    
    if detail_data:
        # 获取多头保证金率
        long_margin_ratio = detail_data.get('LongMarginRatio', 0)
        
        # 获取空头保证金率
        short_margin_ratio = detail_data.get('ShortMarginRatio', 0)
        
        # 打印结果
        print(f"期权代码: {option_code}")
        print(f"多头保证金率 (LongMarginRatio): {long_margin_ratio}")
        print(f"空头保证金率 (ShortMarginRatio): {short_margin_ratio}")
        
        # 也可以打印整个字典查看其他属性
        # print(detail_data)
    else:
        print(f"未能获取到期权 {option_code} 的详细信息,请检查代码或数据下载情况。")

def handlebar(ContextInfo):
    # 本示例仅在 init 中演示查询,handlebar 中无需操作
    pass

注意事项

  1. 数据补充:在使用此接口前,请确保在客户端的【数据管理】中下载了对应的期权合约列表和基础数据,否则可能返回空值。
  2. 合约代码格式:期权代码通常带有后缀,例如上交所期权为 .SHO,深交所期权为 .SZO(具体视 QMT 版本和市场定义而定,通常使用 ContextInfo.get_option_list 获取的代码格式即可)。
  3. 空值处理:建议在代码中加入对返回值的非空判断(if detail_data:),以防止因数据缺失导致的报错。

Q&A

Q: ContextInfo.get_option_detail_data 还能查询到哪些期权信息?
A: 除了保证金比例外,该接口还可以查询行权价 (OptExercisePrice)、到期日 (ExpireDate)、合约乘数 (VolumeMultiple)、涨跌停价 (UpStopPrice/DownStopPrice)、期权类型 (optType,如 CALL 或 PUT) 等详细信息。

Q: 如果我想查询期货的保证金比例,使用哪个函数?
A: 对于期货,通常使用 ContextInfo.get_instrumentdetail(stockcode) 函数。该函数返回的字典中同样包含 LongMarginRatioShortMarginRatio 字段。实际上,get_instrumentdetail 是一个通用的合约信息查询接口,也可以用于查询期权,但 get_option_detail_data 针对期权提供了更特有的字段(如行权价)。

Q: 为什么获取到的保证金比例是 0?
A: 这通常有两个原因:一是本地没有下载该品种的静态数据(合约信息),需要在数据管理中补充;二是该合约可能已经过期或代码输入错误。请检查代码后缀(如 .SHO)是否正确。