🚀 AI 一键生成 joinquant 策略代码

JoinQuant量化策略中读取自定义CSV文件并转换为DataFrame的完整指南

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

问题描述

策略中可以使用pandas.read_csv()吗?

策略中可以使用pandas.read_csv()引入自己的研究文件吗?
如果只能用read_file()引入,那么引入后如何转换成dataframe格式以便用pandas处理?谢谢!

解决方案

在 JoinQuant(聚宽)的回测或模拟交易环境中,不能直接使用 pandas.read_csv('文件路径') 来读取您在研究环境中上传的私有文件。出于安全和环境隔离的考虑,您必须使用聚宽提供的专用 API read_file() 来读取文件内容。

使用 read_file() 读取文件后,它返回的是文件的原始内容(字节流或字符串)。为了将其转换为 pandas.DataFrame 以便进行数据处理,您需要借助 Python 的 io 模块(如 BytesIOStringIO)将内容包装成一个类文件对象,然后再传递给 pandas.read_csv()

以下是具体的转换方法及代码示例:

Python 3 环境(推荐,当前主流)

在 Python 3 环境下,read_file() 返回的通常是 bytes 类型,因此需要使用 six.BytesIOio.BytesIO

import pandas as pd
from six import BytesIO
# 或者直接使用内置库: from io import BytesIO

def initialize(context):
    # 1. 使用 read_file 读取研究环境根目录下的 csv 文件
    body = read_file("your_file.csv")
    
    # 2. 使用 BytesIO 将字节流包装为文件对象,并用 pandas 读取
    df = pd.read_csv(BytesIO(body))
    
    # 打印查看前5行数据
    log.info("\n" + str(df.head()))
    
    # 将 dataframe 存入全局变量 g 中以便在 handle_data 中使用
    g.my_data = df

Python 2 环境(旧版兼容)

如果您使用的是 Python 2 环境,read_file() 返回的是字符串,需要使用 six.StringIO

import pandas as pd
from six import StringIO

def initialize(context):
    # 1. 读取文件内容
    body = read_file("your_file.csv")
    
    # 2. 转换为 DataFrame
    df = pd.read_csv(StringIO(body))
    
    log.info("\n" + str(df.head()))

注意事项:

  1. 文件位置:确保您的 CSV 文件已经上传到了聚宽的投资研究模块的根目录(或对应的相对路径下)。read_file(path) 中的 path 是相对于您私有空间根目录的相对路径。
  2. 编码问题:如果您的 CSV 文件包含中文字符,在读取时可能会遇到编码报错。可以在 pd.read_csv 中指定编码格式,例如:pd.read_csv(BytesIO(body), encoding='utf-8')encoding='gbk'
  3. 性能考量:建议在 initializebefore_trading_start 等初始化函数中读取和解析文件,并将其存储在全局变量 g 中,避免在 handle_data(每分钟/每天执行)中频繁读取文件,以提升策略运行效率。