🚀 AI 一键生成 qmt 策略代码
立即体验
👉 AI 生成代码 👈

QMT 下载交易日历报错“当前客户端未支持此功能”怎么办?

qmt | 发布时间: 2026/5/29
以下内容由 EasyQuant 生成。

问题描述

下载交易日历数据报错。

coding:utf-8
from xtquant import xtdata
import time

下载交易日历数据
xtdata.download_holiday_data()

获取交易日
start_time = time.strftime("%Y%m%d") # 起始日期
end_time = time.strftime("%Y") + '1231' #结束日期,这里我用 time 函数自动计算年,格式生成'20241231'

返回获取的交易日历
result = xtdata.get_trading_calendar('SH', start_time , end_time )
print(result)

运行上面这些代码,有下面这些报错。

(cat-meho-rl) PS E:\cat-meho-rl> & e:\cat-meho-rl.venv\Scripts\python.exe e:/cat-meho-rl/scripts/test.py
xtquant 文档地址:http://dict.thinktrader.net/nativeApi/start_now.html

***** xtdata 连接成功 2026-05-27 01:27:42*****
服务信息: {'tag': 'sp3', 'version': '1.0'}
服务地址: 127.0.0.1:58610
数据路径: E:\国金证券 QMT 交易端\bin.x64/../userdata_mini/datadir
设置 xtdata.enable_hello = False 可隐藏此消息

Traceback (most recent call last):
File "e:\cat-meho-rl\scripts\test.py", line 6, in
xtdata.download_holiday_data()
File "E:\cat-meho-rl.venv\Lib\site-packages\xtquant\xtdata.py", line 2114, in download_holiday_data
inst = _BSON_call_common(
^^^^^^^^^^^^^^^^^^
File "E:\cat-meho-rl.venv\Lib\site-packages\xtquant\xtdata.py", line 283, in _BSON_call_common
return BSON.BSON.decode(interface(func, BSON.BSON.encode(param)))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: 当前客户端未支持此功能,请更新客户端或升级投研版 func:commonControl, error:{ "error" : { "ErrorID" : 300000, "ErrorMsg" : "function not realize" } }
(cat-meho-rl) PS E:\cat-meho-rl>

这个数据在官方网页说明当中,没说明是 VIP 数据,为什么也会报错?

解决方案

报错原因分析

您遇到的报错信息 RuntimeError: 当前客户端未支持此功能,请更新客户端或升级投研版 func:commonControl, error:{ "error" : { "ErrorID" : 300000, "ErrorMsg" : "function not realize" } } 已经非常明确地指出了问题所在:您当前使用的底层 QMT 客户端(国金证券 QMT 交易端)不支持该接口功能。

关于为什么官方文档没有说明是 VIP 数据却依然报错,主要有以下几个原因:

  1. xtquant 与 QMT 客户端的依赖关系xtquant 只是一个 Python 接口库,它本身不生产数据,所有的数据请求最终都是通过本地运行的 QMT 客户端(即您电脑上的 E:\国金证券 QMT 交易端)向券商服务器发起的。如果券商提供的 QMT 客户端版本较旧,或者券商服务器端没有开放/实现这个特定的接口(function not realize),就会报这个错。
  2. 券商定制版本的差异:官方文档(迅投)提供的是全量接口说明,但各个券商(如国金、国信、中泰等)采购和部署的 QMT 版本、权限和功能模块是不同的。有些高级数据接口或特定功能确实需要券商端的“投研版”权限,或者需要券商更新其后台服务才能支持。

解决方案与替代方案

既然当前客户端无法直接通过该接口获取交易日历,您可以采取以下几种解决方案:

方案一:联系券商更新或升级权限

您可以联系国金证券的客户经理或量化技术支持,询问是否有更新版本的 QMT 客户端,或者是否需要开通特定的“投研版”权限才能使用 download_holiday_data 接口。

方案二:使用 QMT 内置的替代接口(如果在 QMT 内部运行)

如果您是在 QMT 自带的策略编辑器中运行,可以使用 ContextInfo.get_trading_dates() 来获取交易日历,这个基础接口通常所有券商都支持:

def handlebar(ContextInfo):
    # 获取从 20240101 到当前时间的日线交易日历
    trading_dates = ContextInfo.get_trading_dates('000001.SH', '20240101', '', 0, '1d')
    print(trading_dates)

方案三:使用第三方开源库获取交易日历(推荐,最稳定)

既然您使用的是外部 Python 环境(xtquant),获取交易日历完全不需要依赖 QMT,使用开源的金融数据库(如 aksharealphalens)更加方便且免费。

使用 akshare 获取交易日历示例:
首先安装 akshare:pip install akshare

import akshare as ak
import time

# 获取 A 股交易日历
tool_trade_date_hist_sina_df = ak.tool_trade_date_hist_sina()

# 筛选出您需要的日期范围
start_time = time.strftime("%Y%m%d")
end_time = time.strftime("%Y") + '1231'

# 将日期转换为字符串格式进行过滤
trade_dates = tool_trade_date_hist_sina_df['trade_date'].astype(str).tolist()

# 过滤出在 start_time 和 end_time 之间的交易日
valid_dates = [d for d in trade_dates if start_time <= d.replace('-', '') <= end_time]

print("获取到的交易日历:")
print(valid_dates)

总结:这个报错并非您的代码写错了,而是底层券商客户端的限制。在量化开发中,对于交易日历这种静态且通用的数据,强烈建议使用 akshare 等第三方库在本地维护一份,既能避免接口权限问题,又能提高策略的运行速度和稳定性。