3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 qmt 平台上,如果您想获取已经过期的历史期货合约数据(例如 M2606.DF),或者获取期货主力连续合约的数据,可以通过以下方法实现:
对于已经退市的过期合约,直接使用 get_market_data() 可能会返回空,因为默认情况下系统可能没有加载这些过期合约的信息。您需要先获取过期合约列表,然后再请求数据。
步骤:
ContextInfo.get_his_contract_list(market) 获取指定市场的过期合约列表。ContextInfo.get_market_data_ex() 或 ContextInfo.get_market_data() 获取历史数据。示例代码:
#encoding:gbk
def init(ContextInfo):
# 获取大商所过期合约列表
his_contracts = ContextInfo.get_his_contract_list('DF')
print("大商所过期合约数量:", len(his_contracts))
target_contract = 'M2606.DF'
if target_contract in his_contracts:
print(f"找到过期合约: {target_contract}")
# 设置股票池
ContextInfo.set_universe([target_contract])
else:
print(f"未找到过期合约: {target_contract},请检查数据管理中是否已补充过期合约列表。")
def handlebar(ContextInfo):
if not ContextInfo.is_last_bar():
return
target_contract = 'M2606.DF'
# 获取历史日线数据
data = ContextInfo.get_market_data_ex(
fields=['open', 'high', 'low', 'close', 'volume'],
stock_code=[target_contract],
period='1d',
start_time='20250101', # 替换为实际的有效时间段
end_time='20260630',
subscribe=False # 获取历史数据不需要订阅
)
if target_contract in data and not data[target_contract].empty:
print(f"{target_contract} 历史数据获取成功:")
print(data[target_contract].head())
else:
print(f"未能获取到 {target_contract} 的历史数据,请确保已在数据管理中下载该合约的历史日线数据。")
如果您只需要分析该品种的历史走势,使用主力连续合约(主连)通常是更好的选择,因为主连拼接了不同时期主力合约的数据,避免了单个合约到期的问题。
在 qmt 中,主力连续合约的代码通常以品种代码加上 00 表示,例如豆粕的主连代码为 M00.DF(具体代码规则请参考 qmt 客户端行情界面的显示)。
示例代码:
#encoding:gbk
def init(ContextInfo):
# 设置豆粕主连为股票池
ContextInfo.set_universe(['M00.DF'])
def handlebar(ContextInfo):
if not ContextInfo.is_last_bar():
return
main_contract = 'M00.DF'
# 获取主连历史日线数据
data = ContextInfo.get_market_data_ex(
fields=['open', 'high', 'low', 'close', 'volume'],
stock_code=[main_contract],
period='1d',
start_time='20200101',
end_time='20231231',
subscribe=False
)
if main_contract in data and not data[main_contract].empty:
print(f"{main_contract} 主连历史数据获取成功:")
print(data[main_contract].head())
else:
print(f"未能获取到 {main_contract} 的历史数据,请在数据管理中补充该主连的数据。")
get_market_data_ex: 相比于旧版的 get_market_data,get_market_data_ex 返回 pandas DataFrame 格式,更方便进行数据处理和分析。M00.DF);如果是为了复盘特定历史时期的特定合约表现,则需要先获取过期合约列表再请求数据。