🚀 AI 一键生成 qmt 策略代码

QMT xtquant v240613 报错 UnicodeDecodeError: 'utf-8' codec can't decode 怎么解决?

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

问题描述

Bug 反馈:xtquant v240613.1.1,调用很多很函数会抛encoding error

平台: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')),但这属于破坏性修改,仅建议作为临时应急手段。