问题描述
解决方案
在 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
注意事项
- 数据补充:在使用此接口前,请确保在客户端的【数据管理】中下载了对应的期权合约列表和基础数据,否则可能返回空值。
- 合约代码格式:期权代码通常带有后缀,例如上交所期权为
.SHO,深交所期权为.SZO(具体视 QMT 版本和市场定义而定,通常使用ContextInfo.get_option_list获取的代码格式即可)。 - 空值处理:建议在代码中加入对返回值的非空判断(
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) 函数。该函数返回的字典中同样包含 LongMarginRatio 和 ShortMarginRatio 字段。实际上,get_instrumentdetail 是一个通用的合约信息查询接口,也可以用于查询期权,但 get_option_detail_data 针对期权提供了更特有的字段(如行权价)。
Q: 为什么获取到的保证金比例是 0?
A: 这通常有两个原因:一是本地没有下载该品种的静态数据(合约信息),需要在数据管理中补充;二是该合约可能已经过期或代码输入错误。请检查代码后缀(如 .SHO)是否正确。