问题描述
平台:Windows 11
xtquant 版本 240613.1.1
例如调用xtdata.get_holidays(), 会有下面的error:
File [color=var(--vscode-terminal-ansiGreen)]c:\Users\***\AppData\Local\pypoetry\Cache\virtualenvs\rich-tK7Nwtye-py3.11\Lib\site-packages\xtquant\xtdata.py:1598, in [color=var(--vscode-terminal-ansiCyan)]get_holidays[color=var(--vscode-terminal-ansiBlue)]() 1593 ''' 1594 获取节假日列表 1595 :return: 8位int型日期 1596 ''' 1597 client = get_client()-> 1598 return [str(d) for d in client.UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 82: invalid start byte
解决方案
针对您在 Windows 11 环境下使用 xtquant v240613.1.1 调用 xtdata.get_holidays() 等函数时遇到的 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 报错,这是一个典型的编码冲突问题。
问题原因分析
报错信息中的 byte 0xb5 通常是 GBK 编码(中文字符)的一部分。xtquant 底层基于 C++ 编写,在 Windows 系统下默认使用 GBK 编码,而 Python 3 默认使用 UTF-8 解码。当底层返回包含中文字符的字符串(如路径、错误提示或节假日说明)时,Python 尝试用 UTF-8 解码就会抛出此异常。
最常见的触发场景是:您的 Windows 用户名、Python 虚拟环境路径(如 c:\Users\中文名\...)或 QMT 客户端安装路径中包含了中文字符。
解决方案
请按照以下步骤逐一排查和解决:
1. 检查并移除路径中的中文字符(最常见原因)
QMT 和 xtquant 对中文路径非常敏感。请检查您的 Python 虚拟环境路径(c:\Users\***\AppData\...)中的 *** 是否为中文用户名。
- 解决方法:建议将 Python 环境、项目代码以及 QMT 客户端统一移动到纯英文无空格路径下(例如
D:\quant_workspace\),避免使用默认的带中文用户名的 C 盘路径。
2. 强制指定 Python 环境变量
尝试在运行脚本前,强制指定 Python 的标准输入输出编码。可以在代码最顶部(导入 xtquant 之前)添加以下代码:
import os
import sys
os.environ['PYTHONIOENCODING'] = 'utf8'
或者在 Windows 系统环境变量中添加 PYTHONUTF8=1。
3. 版本回退或等待官方修复
如果您的路径已经是纯英文,且该问题是在升级到 v240613.1.1 后才出现的,这可能是该版本底层接口在处理特定返回值时未正确转换编码(底层 C++ 传回了 GBK 字节流,但 Python 包装层直接按 UTF-8 解析)。
- 解决方法:建议暂时通过 pip 卸载当前版本,回退到上一个稳定版本的
xtquant,或者向迅投官方技术支持反馈此 Bug,等待后续小版本修复。
4. 临时修改源码(应急方案)
如果您急需使用该函数,可以尝试打开报错的 xtdata.py 文件,定位到第 1598 行,将隐式的解码逻辑修改为兼容 GBK 的方式(例如使用 .decode('gbk', errors='ignore')),但这属于破坏性修改,仅建议作为临时应急手段。