问题描述
解决方案
在 PTrade 中读取自行上传的 CSV 文件,主要依赖于 get_research_path() 接口获取文件的存储路径,并配合 pandas 库进行读取。
以下是具体的操作步骤和代码示例:
核心步骤
- 上传文件:首先需要在 PTrade 客户端的“研究”模块中,将您的 CSV 文件上传到根目录(通常是 Notebook 的根目录)。
- 获取路径:在策略代码中使用
get_research_path()获取研究目录的绝对路径。 - 拼接路径:由于 PTrade 限制了
os模块的使用,需要通过字符串拼接的方式组合路径和文件名。 - 读取文件:使用
pandas.read_csv()读取数据。
策略代码示例
import pandas as pd
def initialize(context):
# 1. 获取研究目录的基础路径
# 该函数通常返回 '/home/fly/notebook/'
base_path = get_research_path()
# 2. 定义您的文件名 (请确保文件已上传到研究根目录)
file_name = "my_strategy_data.csv"
# 3. 拼接完整路径 (注意:PTrade中禁用 import os,请直接使用字符串拼接)
full_path = base_path + file_name
# 4. 读取 CSV 文件
try:
# 读取文件,建议指定 encoding,防止中文乱码
# 如果文件含有中文,通常尝试 'utf-8' 或 'gbk'
df = pd.read_csv(full_path, encoding='utf-8')
# 打印前几行数据以确认读取成功
log.info("成功读取 CSV 文件,前 5 行数据如下:")
log.info(df.head())
# 将数据存储在全局变量 g 中,以便在 handle_data 中使用
g.custom_data = df
except Exception as e:
log.error("读取 CSV 文件失败,请检查文件名或路径。错误信息: " + str(e))
def handle_data(context, data):
# 示例:在盘中逻辑使用读取到的数据
if hasattr(g, 'custom_data'):
# 这里可以编写您的逻辑,例如获取某一行的数据
pass
关键注意事项
-
禁用
os模块:
PTrade 的安全沙箱环境禁止使用import os。因此,不要尝试使用os.path.join来合并路径,直接使用字符串相加即可(get_research_path()返回的路径末尾通常已经包含了/)。 -
文件上传位置:
文件必须上传到“研究”模块的根目录下。如果您在研究目录下创建了子文件夹(例如data文件夹),拼接路径时需要写成base_path + "data/" + file_name。 -
编码格式:
如果您的 CSV 文件中包含中文字符(如股票名称),读取时可能会报错。请在pd.read_csv中尝试指定encoding='utf-8'或encoding='gbk'(取决于您保存文件时的格式)。 -
回测与实盘的区别:
get_research_path()在回测和交易(实盘/模拟)模式下均可使用,但请确保在实盘环境中,文件也已经同步上传到了对应的服务器环境中。
Q&A
Q: 为什么我读取文件时提示 FileNotFoundError?
A: 请检查以下两点:1. 文件是否确实上传到了“研究”模块的根目录;2. 代码中的文件名(包括后缀名大小写)是否与上传的文件完全一致。
Q: 可以使用 Python 原生的 open() 函数读取吗?
A: 可以。如果您不需要 DataFrame 格式,可以使用 with open(full_path, 'r') as f: 的方式读取,但对于结构化数据,推荐使用 pandas。
Q: get_research_path() 返回的具体路径是什么?
A: 通常返回 /home/fly/notebook/。但在代码中请务必使用函数调用,不要硬编码这个字符串,因为不同券商的部署环境可能存在差异。