问题描述
解决方案
在 QMT (Quantitative Trading Platform) 中,查询期货合约到期日主要有两种方式:一种是使用专门获取到期日的函数 get_contract_expire_date,另一种是通过获取合约详细信息的函数 get_instrumentdetail 来提取到期日字段。
以下是具体的实现方法和代码示例。
方法一:使用 get_contract_expire_date (推荐)
这是最直接的方法,专门用于获取期货合约的到期日。
- 函数原型:
ContextInfo.get_contract_expire_date(codemarket) - 参数:
codemarket(string),合约代码及市场,例如'IF2312.IF'。 - 返回值:
int,格式为YYYYMMDD的整数(例如20231215)。
方法二:使用 get_instrumentdetail (获取详细信息)
如果你不仅需要到期日,还需要合约乘数、保证金率等其他信息,可以使用此函数。
- 函数原型:
ContextInfo.get_instrumentdetail(stockcode) - 参数:
stockcode(string),合约代码,例如'IF2312.IF'。 - 返回值:
dict,包含合约详细信息的字典。其中键'ExpireDate'对应到期日。
代码实现示例
以下代码展示了如何在 init 函数中调用这两种方法来打印期货合约的到期日。
# -*- coding: gbk -*-
def init(ContextInfo):
# 示例合约代码:中金所沪深300股指期货 (请确保该合约在回测或实盘时间段内存在)
# 注意:实际使用时请替换为当前有效的合约代码,如 'IF2406.IF'
future_code = 'IF2312.IF'
# --- 方法一:直接获取到期日 (推荐) ---
expire_date_int = ContextInfo.get_contract_expire_date(future_code)
print(f"【方法一】合约 {future_code} 的到期日是: {expire_date_int}")
# --- 方法二:通过合约详情获取 ---
instrument_detail = ContextInfo.get_instrumentdetail(future_code)
# 检查是否成功获取到详情
if instrument_detail:
# 提取 ExpireDate 字段
expire_date_detail = instrument_detail.get('ExpireDate')
print(f"【方法二】合约 {future_code} 的到期日是: {expire_date_detail}")
# 顺便打印其他信息示例
print(f" 合约名称: {instrument_detail.get('InstrumentName')}")
print(f" 上市日期: {instrument_detail.get('OpenDate')}")
else:
print(f"未找到合约 {future_code} 的详细信息")
def handlebar(ContextInfo):
# 本示例仅在 init 中演示查询,handlebar 中无需操作
pass
注意事项
- 合约代码格式:必须包含市场后缀,例如中金所期货为
.IF(如IF2312.IF),上期所为.SF(如rb2310.SF)。 - 数据依赖:
get_instrumentdetail依赖于本地的基础数据。如果返回为空或数据不准确,请在客户端菜单中点击“数据管理” -> “补充数据” -> “基础数据”进行更新。 - 过期合约:如果要查询已经过期的历史合约,可能需要先调用
ContextInfo.get_his_contract_list(market)获取历史合约列表,并确保已下载相应的历史合约信息。
Q&A
Q: get_contract_expire_date 返回的数据类型是什么?
A: 该函数返回的是一个整型 (int) 数值,格式为 YYYYMMDD(例如 20231215)。如果需要进行日期计算,通常需要将其转换为字符串或 Python 的 datetime 对象。
Q: 如果查询不到合约信息,函数会返回什么?
A: get_contract_expire_date 通常会返回 0 或无效值;get_instrumentdetail 会返回 None 或空字典。建议在代码中增加判断逻辑以处理无效合约代码的情况。
Q: 如何获取主力合约的到期日?
A: 首先使用 ContextInfo.get_main_contract(codemarket) 获取当前的主力合约代码(例如输入 'IF.IF' 获取当前的 IF 主力),然后再将获取到的代码传入 get_contract_expire_date 进行查询。