问题描述
量化是否支持读写研究环境文件?如何实现?
解决方案
量化是否支持读写研究环境文件?
支持。 在 ptrade 量化平台中,回测和交易模块均支持读写研究环境(Notebook)下的文件。这对于策略的参数配置读取、自定义数据的加载以及策略运行状态的持久化保存非常有用。
如何实现?
实现读写研究环境文件的核心在于使用 ptrade 提供的 API 接口 get_research_path() 来获取研究环境的根目录路径,然后结合 Python 标准的文件操作(如 open、pickle、pandas 等)进行文件的读写。
1. 获取研究环境路径
使用 get_research_path() 函数可以获取研究根目录的绝对路径。
# 获取研究根目录路径
NOTEBOOK_PATH = get_research_path()
2. 写入文件示例(以 Pickle 持久化为例)
在策略运行过程中,我们经常需要保存一些全局变量(如仓龄、自定义状态等),以防策略重启后数据丢失。
import pickle
def handle_data(context, data):
# 假设我们要保存一个字典数据
my_data = {'600570.SS': 100, '000001.SZ': 200}
# 获取路径并拼接文件名
file_path = get_research_path() + 'my_strategy_data.pkl'
# 写入文件
with open(file_path, 'wb') as f:
pickle.dump(my_data, f, -1)
log.info('数据已成功写入研究环境文件。')
3. 读取文件示例
在策略初始化(initialize)或盘前准备(before_trading_start)时,可以读取之前保存的文件。
import pickle
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)
file_path = get_research_path() + 'my_strategy_data.pkl'
# 尝试读取文件
try:
with open(file_path, 'rb') as f:
g.my_data = pickle.load(f)
log.info('成功读取文件数据:%s' % g.my_data)
except Exception as e:
log.warning('读取文件失败或文件不存在,初始化为空字典。错误信息:%s' % e)
g.my_data = {}
4. 读取 CSV 文件作为底仓
ptrade 还提供了一个便捷接口 convert_position_from_csv(path),可以直接从研究环境上传的 CSV 文件中读取底仓配置。
def initialize(context):
# 假设在研究环境中上传了名为 Poslist.csv 的文件
# 文件内容格式需包含:sid,enable_amount,amount,cost_basis
poslist = convert_position_from_csv("Poslist.csv")
set_yesterday_position(poslist)
注意事项
- 文件命名规范:文件目录和名称的长度不能超过256个字符,且名称中不能出现特殊字符如
:?,@#$&();"'<>~\!%^*。 - 序列化限制:涉及到 IO(如打开的文件句柄、网络连接等)的对象是不能被
pickle序列化的。 - 路径拼接:
get_research_path()返回的路径通常以斜杠结尾,直接拼接文件名即可(如get_research_path() + 'data.csv')。 - 异常处理:在读取文件时,务必使用
try...except块进行异常处理,防止因文件不存在或格式错误导致策略直接崩溃。