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

JoinQuant 平台报错 IOPub data rate exceeded 怎么办?

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

问题描述

求帮助:IOPub data rate exceeded.

我要读取历史的成分股,代码如下

trade_days_str = np.load('data/trade_days_str.npy')# 交易日数据文件
stocks_dict = dict() # 使用字典进行存储
for i in trade_days_str[-500:]:
print(i)
stocks = get_index_stocks('000905.XSHG', i)
stocks_dict[i]= stocks
print(stocks_dict)
# 字典的保存与读取
#保存
f = open('data//stocks_dict.txt','w')
f.write(str(stocks_dict))
f.close()
结果出现如下错误:

IOPub data rate exceeded.
The notebook server will temporarily stop sending output
to the client in order to avoid crashing it.
To change this limit, set the config variable
--NotebookApp.iopub_data_rate_limit.

Current values:
NotebookApp.iopub_data_rate_limit=1000000.0 (bytes/sec)
NotebookApp.rate_limit_window=3.0 (secs)
这个问题要怎么解决啊?

解决方案

错误原因分析

您遇到的 IOPub data rate exceeded 错误是 Jupyter Notebook(JoinQuant 研究环境底层使用的工具)的一个常见保护机制。当您在一个代码单元格中尝试输出(print)的数据量过大、过快时,Jupyter 为了防止浏览器卡死或崩溃,会强制切断输出并抛出此警告。

在您的代码中,stocks_dict 包含了 500 个交易日的数据,每天对应 500 只中证500成分股的代码。当您执行 print(stocks_dict) 时,相当于一次性向屏幕输出几十万个字符,从而触发了该限制。

解决方案

1. 最直接的解决方法:取消打印大对象

既然错误是因为打印数据量过大引起的,最简单的解决办法就是不要打印整个大字典。您可以注释掉或删除 print(stocks_dict) 这一行。如果需要查看数据是否正确,可以只打印字典的键,或者打印其中一天的数据:

# 不要打印整个字典
# print(stocks_dict) 

# 如果想检查,可以只打印一天的数据看看
print('数据获取完成,总天数:', len(stocks_dict))
# print(stocks_dict[trade_days_str[-1]]) 

2. 优化数据保存方式(最佳实践)

您目前使用 f.write(str(stocks_dict)) 将字典转换为字符串保存到 txt 文件中。这种方式虽然能存下来,但后续读取时非常麻烦(需要用 evalast.literal_eval 解析,容易出错且效率低)。

建议使用 Python 标准库 jsonpickle 来保存字典数据。在 JoinQuant 环境中,推荐结合 json 模块进行保存。

修改后的完整代码如下:

import numpy as np
import json
from jqdata import *

# 假设 trade_days_str 已经正确加载
trade_days_str = np.load('data/trade_days_str.npy')

stocks_dict = dict()
for i in trade_days_str[-500:]:
    # print(i) # 如果觉得打印 500 次太长,也可以注释掉,或者每 50 次打印一次进度
    stocks = get_index_stocks('000905.XSHG', i)
    stocks_dict[i] = stocks

print(f'成功获取 {len(stocks_dict)} 天的成分股数据。')

# 推荐使用 json 保存字典
file_path = 'data/stocks_dict.json'
with open(file_path, 'w', encoding='utf-8') as f:
    json.dump(stocks_dict, f)

print('数据已成功保存至', file_path)

# 后续读取的方法:
# with open(file_path, 'r', encoding='utf-8') as f:
#     loaded_dict = json.load(f)

3. 使用 JoinQuant 专属 API 保存(可选)

如果您在 JoinQuant 的研究环境中,也可以直接使用平台提供的 write_file API 来保存文件,这在处理相对路径时更加方便:

import json

# 将字典转为 json 格式的字符串
json_str = json.dumps(stocks_dict)

# 使用 JoinQuant API 写入文件
write_file('stocks_dict.json', json_str, append=False)
print('保存成功!')

总结:遇到 IOPub data rate exceeded 时,核心原则就是减少控制台的输出量。将大数据的展示改为保存到文件,即可完美解决此问题。