问题描述
我希望下载历史的期货数据,比如 M2606.DF,但是这个代码已经找不到了,用 get_market_data()返回结果是空。请问有没有办法下载历史的期货数据,或者期货主连也可以。
解决方案
在 QMT 平台中,如果您尝试使用 get_market_data() 获取已经退市的历史期货合约(过期合约)数据却返回为空,通常是因为本地没有补充该过期合约的历史数据。QMT 的 API 是基于本地数据进行查询的。
要获取历史期货数据或期货主连数据,您可以按照以下步骤操作:
一、 获取历史过期合约数据
1. 在客户端补充过期合约数据
首先,您必须在 QMT 客户端手动下载过期合约的数据:
- 打开 QMT 客户端,点击顶部菜单栏的 【数据管理】。
- 在左侧选择 【补充数据】。
- 在品种选择中,找到对应的期货市场(如大商所),并勾选 “包含过期合约”(如果有此选项)或者在过期合约列表中勾选您需要的品种。
- 选择需要的时间周期(如日线、1分钟线)和时间范围,点击下载。
2. 使用 API 获取过期合约列表及数据
补充数据后,您可以使用 ContextInfo.get_his_contract_list(market) 获取过期合约列表,然后使用 ContextInfo.get_market_data_ex() 获取数据。
#coding:gbk
def init(ContextInfo):
# 获取大商所(DF)的过期合约列表
his_contracts = ContextInfo.get_his_contract_list('DF')
print("大商所过期合约示例:", his_contracts[:10])
def handlebar(ContextInfo):
if not ContextInfo.is_last_bar():
return
# 假设您已经下载了 m2105.DF 的历史数据
target_code = 'm2105.DF'
# 使用 get_market_data_ex 获取历史数据
data = ContextInfo.get_market_data_ex(
fields=['open', 'high', 'low', 'close', 'volume'],
stock_code=[target_code],
period='1d',
start_time='20200101',
end_time='20210601'
)
if target_code in data and not data[target_code].empty:
print(f"成功获取 {target_code} 历史数据:")
print(data[target_code].head())
else:
print(f"未获取到 {target_code} 的数据,请检查数据管理中是否已下载该合约数据。")
二、 获取期货主连数据
如果您不需要特定月份的合约,而是希望使用期货主连(主力连续合约)进行回测或分析,QMT 提供了两种方式:
1. 直接使用主连代码
在 QMT 中,主连合约通常以 品种代码+00.市场代码 表示。例如,豆粕的主连代码是 m00.DF,沪深300股指期货主连是 IF00.IF。您同样需要在【数据管理】中下载这些主连代码的历史数据。
#coding:gbk
def init(ContextInfo):
pass
def handlebar(ContextInfo):
if not ContextInfo.is_last_bar():
return
# 豆粕主连代码
main_code = 'm00.DF'
data = ContextInfo.get_market_data_ex(
fields=['close'],
stock_code=[main_code],
period='1d',
count=5
)
print("豆粕主连最新5天收盘价:")
print(data[main_code])
2. 动态获取当前主力合约
如果您在实盘或模拟运行中,需要知道当前时刻的主力合约具体是哪一个月份,可以使用 ContextInfo.get_main_contract()。
#coding:gbk
def init(ContextInfo):
pass
def handlebar(ContextInfo):
if not ContextInfo.is_last_bar():
return
# 获取当前豆粕的主力合约具体代码(如 m2401.DF)
current_main = ContextInfo.get_main_contract('m.DF')
print(f"当前豆粕主力合约为: {current_main}")
总结
- 查不到数据的根本原因是本地未下载。请务必先通过 QMT 客户端的【数据管理】下载对应的过期合约或主连数据。
- 推荐使用
get_market_data_ex替代旧版的get_market_data,前者返回标准的pandas.DataFrame,更易于处理。