🚀 AI 一键生成 qmt 策略代码

QMT 策略报错 PermissionError: calling pandas.io.parsers.read_csv not allowed 的原因与解决方法

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

问题描述

求助:PermissionError: calling pandas.io.parsers.read_csv not allowed

QMT 内置 python 环境,非投研版,代码调用 pd.read_csv(xxxx),文件 xxxx 权限没有问题,报错:PermissionError: calling pandas.io.parsers.read_csv not allowed
求教原因。

解决方案

报错原因分析

在 QMT(非投研版)的内置 Python 策略编辑器中运行代码时,遇到 PermissionError: calling pandas.io.parsers.read_csv not allowed 报错,根本原因在于 QMT 客户端的底层沙箱(Sandbox)安全机制限制

为了防止恶意代码随意读取或修改用户电脑上的本地文件,QMT 对内置的 Python 环境进行了严格的 I/O 权限阉割。在这个黑名单机制中,pandas.read_csvpandas.read_excel 以及部分原生的 open() 函数调用被直接拦截,因此即使你的文件本身在操作系统层面拥有完全的读写权限,QMT 依然会在代码执行层面抛出 PermissionError

解决方法与替代方案

针对这种沙箱限制,您可以根据实际需求选择以下几种解决方案:

方案一:使用 QMT 官方提供的本地文件读取 API

如果您读取 CSV 文件的目的是为了导入“股票池”或“股票+数量”的列表,QMT 提供了专门的白名单 API 来绕过限制。您可以使用 ContextInfo.load_stk_listContextInfo.load_stk_vol_list

1. 读取纯股票代码列表

  • CSV 格式要求600000.SH,600004.SH,600006.SH,(注意末尾需要分隔符)
  • 调用方法
def handlebar(ContextInfo):
    # 读取 D:/data/list.csv
    stock_list = ContextInfo.load_stk_list('D:/data/', 'list.csv')
    print(stock_list)

2. 读取股票代码及数量列表

  • CSV 格式要求600000.SH,100,600004.SH,200,(成对存在,末尾需分隔符)
  • 调用方法
def handlebar(ContextInfo):
    # 读取 D:/data/list.csv
    stock_vol_list = ContextInfo.load_stk_vol_list('D:/data/', 'list.csv')
    print(stock_vol_list)

方案二:切换至 MiniQMT(独立 Python 环境)

如果您必须使用 pandas 进行复杂的数据处理,强烈建议使用 MiniQMT(xtquant 库)
MiniQMT 允许您在自己本地安装的纯净 Python 环境(如 Anaconda、PyCharm)中调用 QMT 的行情和交易接口。由于代码运行在您自己的 Python 进程中,没有任何沙箱限制,您可以自由使用 pd.read_csv()ossys 等所有标准库和第三方库。

方案三:升级为 QMT 投研版

QMT 投研版(通常面向机构客户或资金量达标的客户开放)内置了 Jupyter Notebook 环境,其权限管控相对宽松,通常允许直接使用 pandas 读取本地文件。如果您有条件,可以联系您的券商客户经理申请开通投研版权限。

方案四:尝试使用原生 Python 绕过(不推荐,可能随时被封)

在某些旧版本的 QMT 中,虽然 pandas.read_csv 被封禁,但原生的 open() 函数结合 csv 模块可能未被完全限制(仅限读取特定目录如 QMT 安装目录下的文件)。您可以尝试以下代码,但请注意这并非长久之计:

import csv

def init(ContextInfo):
    file_path = 'D:/QMT/userdata/my_data.csv'
    try:
        with open(file_path, mode='r', encoding='utf-8') as f:
            reader = csv.reader(f)
            for row in reader:
                print(row)
    except Exception as e:
        print("原生 open 也被限制:", e)

总结:在非投研版的 QMT 内置编辑器中,放弃使用 pd.read_csv 是最明智的选择。对于简单的股票池导入,改用 ContextInfo.load_stk_list;对于复杂的量化策略,直接转向 MiniQMT (xtquant) 才是终极解决之道。