3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant(聚宽)的回测或模拟交易环境中,不能直接使用 pandas.read_csv('文件路径') 来读取您在研究环境中上传的私有文件。出于安全和环境隔离的考虑,您必须使用聚宽提供的专用 API read_file() 来读取文件内容。
使用 read_file() 读取文件后,它返回的是文件的原始内容(字节流或字符串)。为了将其转换为 pandas.DataFrame 以便进行数据处理,您需要借助 Python 的 io 模块(如 BytesIO 或 StringIO)将内容包装成一个类文件对象,然后再传递给 pandas.read_csv()。
以下是具体的转换方法及代码示例:
在 Python 3 环境下,read_file() 返回的通常是 bytes 类型,因此需要使用 six.BytesIO 或 io.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 环境,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()))
read_file(path) 中的 path 是相对于您私有空间根目录的相对路径。pd.read_csv 中指定编码格式,例如:pd.read_csv(BytesIO(body), encoding='utf-8') 或 encoding='gbk'。initialize 或 before_trading_start 等初始化函数中读取和解析文件,并将其存储在全局变量 g 中,避免在 handle_data(每分钟/每天执行)中频繁读取文件,以提升策略运行效率。