3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
您遇到的报错信息 RuntimeError: 当前客户端未支持此功能,请更新客户端或升级投研版 func:commonControl, error:{ "error" : { "ErrorID" : 300000, "ErrorMsg" : "function not realize" } } 已经非常明确地指出了问题所在:您当前使用的底层 QMT 客户端(国金证券 QMT 交易端)不支持该接口功能。
关于为什么官方文档没有说明是 VIP 数据却依然报错,主要有以下几个原因:
xtquant 只是一个 Python 接口库,它本身不生产数据,所有的数据请求最终都是通过本地运行的 QMT 客户端(即您电脑上的 E:\国金证券 QMT 交易端)向券商服务器发起的。如果券商提供的 QMT 客户端版本较旧,或者券商服务器端没有开放/实现这个特定的接口(function not realize),就会报这个错。既然当前客户端无法直接通过该接口获取交易日历,您可以采取以下几种解决方案:
您可以联系国金证券的客户经理或量化技术支持,询问是否有更新版本的 QMT 客户端,或者是否需要开通特定的“投研版”权限才能使用 download_holiday_data 接口。
如果您是在 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,使用开源的金融数据库(如 akshare 或 alphalens)更加方便且免费。
使用 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 等第三方库在本地维护一份,既能避免接口权限问题,又能提高策略的运行速度和稳定性。