问题描述
解决方案
在 QMT 平台进行期货回测时,获取已经交割退市的历史合约代码列表主要使用 ContextInfo.get_his_contract_list 接口。
以下是详细的操作步骤和代码示例。
1. 核心接口说明
- 函数名称:
ContextInfo.get_his_contract_list(market) - 功能:获取指定市场的过期合约列表。
- 参数:
market(string),市场代码,例如 'IF' (中金所), 'SF' (上期所), 'DF' (大商所), 'ZF' (郑商所), 'INE' (能源中心)。 - 返回值:
list,包含过期合约代码的列表。
2. 关键前置步骤:补充数据
注意:该接口依赖于本地的基础数据。在使用代码获取之前,必须在 QMT 客户端手动下载过期合约列表,否则返回结果可能为空。
操作路径:
- 打开 QMT 客户端。
- 点击菜单栏的 【数据管理】(或【系统】->【数据管理】)。
- 选择 【补充数据】 选项卡。
- 找到 【过期合约列表】 或类似的选项,勾选对应的期货市场。
- 点击 【开始补充】 或 【下载】。
3. 代码实现示例
以下代码展示了如何在 init 函数中获取不同期货市场的历史过期合约列表。
# -*- coding: gbk -*-
def init(ContextInfo):
"""
获取期货过期合约列表示例
"""
# 1. 获取中金所 (IF) 的过期合约列表
# 包括股指期货(IF, IC, IH, IM) 和 国债期货(TF, T, TS) 等
cffex_expired = ContextInfo.get_his_contract_list('IF')
print("中金所过期合约数量: ", len(cffex_expired))
# 打印前5个作为示例
if len(cffex_expired) > 0:
print("中金所部分过期合约: ", cffex_expired[:5])
# 2. 获取上期所 (SF) 的过期合约列表
# 包括螺纹钢(rb), 铜(cu) 等
shfe_expired = ContextInfo.get_his_contract_list('SF')
print("上期所过期合约数量: ", len(shfe_expired))
# 3. 获取大商所 (DF) 的过期合约列表
# 包括铁矿石(i), 豆粕(m) 等
dce_expired = ContextInfo.get_his_contract_list('DF')
print("大商所过期合约数量: ", len(dce_expired))
# 4. 获取郑商所 (ZF) 的过期合约列表
# 包括PTA(TA), 棉花(CF) 等
czce_expired = ContextInfo.get_his_contract_list('ZF')
print("郑商所过期合约数量: ", len(czce_expired))
# 5. 获取能源中心 (INE) 的过期合约列表
# 包括原油(sc) 等
ine_expired = ContextInfo.get_his_contract_list('INE')
print("能源中心过期合约数量: ", len(ine_expired))
def handlebar(ContextInfo):
# 该策略仅演示获取列表,无需在 handlebar 中执行逻辑
pass
4. 常用期货市场代码对照表
在使用 get_his_contract_list 时,请使用以下市场代码(Market Code):
| 交易所名称 | 市场代码 | 包含品种示例 |
|---|---|---|
| 中金所 (China Financial Futures Exchange) | IF |
沪深300(IF), 中证500(IC), 国债(T/TF) |
| 上期所 (Shanghai Futures Exchange) | SF |
螺纹(rb), 铜(cu), 黄金(au) |
| 大商所 (Dalian Commodity Exchange) | DF |
铁矿(i), 豆粕(m), 玉米(c) |
| 郑商所 (Zhengzhou Commodity Exchange) | ZF |
PTA(TA), 甲醇(MA), 苹果(AP) |
| 能源中心 (Shanghai International Energy Exchange) | INE |
原油(sc), 20号胶(nr) |
Q&A
Q: 为什么运行 ContextInfo.get_his_contract_list('IF') 返回的是空列表 []?
A: 这通常是因为本地缺少过期合约的基础数据。请在 QMT 客户端的“数据管理”界面中,找到“过期合约列表”并进行下载补充。下载完成后重新运行策略即可获取数据。
Q: 获取到的过期合约列表包含当前正在交易的主力合约吗?
A: 不包含。get_his_contract_list 仅返回已经到期交割并退市的合约代码。如果需要获取当前正在交易的合约,通常需要结合 ContextInfo.get_instrumentdetail 或通过行情订阅接口来获取。
Q: 如何获取某个特定品种(如沪深300 IF)的所有历史合约,而不是整个市场的?
A: get_his_contract_list 返回的是整个市场的列表。你需要获取列表后进行过滤。例如,遍历返回的列表,判断合约代码是否以 "IF" 开头(例如 IF2206.IF)。
Q: 获取历史合约列表后,如何获取这些合约的历史K线数据?
A: 获取到合约代码(如 IF2001.IF)后,可以使用 ContextInfo.get_market_data_ex 接口,传入该合约代码、周期和起止时间来下载和读取该合约的历史行情数据。注意同样需要先在数据管理中下载对应的历史K线数据。