问题描述
/
解决方案
在 PTrade 量化交易平台中,如果你编写了自定义的 Python 包或模块(.py 文件),可以通过**研究环境(Research)**进行上传,并在策略代码中动态添加系统路径来实现导入和使用。以下是具体的操作步骤和代码示例:
步骤一:将自定义包上传至“研究”模块
- 登录 PTrade 客户端,进入**“研究”**(Jupyter Notebook)模块。
- 在研究环境的根目录(或你新建的特定文件夹)下,点击上传按钮,将你写好的 Python 文件(例如
my_module.py)或整个包文件夹上传到服务器。
步骤二:在策略中获取研究路径并导入
PTrade 提供了 get_research_path() API,用于获取研究根目录的绝对路径。你可以利用 Python 的 sys 模块将该路径加入到环境变量中,从而实现自定义包的导入。
策略代码示例:
import sys
# 假设你在研究根目录下上传了 my_module.py,里面有一个 MyStrategyTool 类
def initialize(context):
# 1. 获取研究环境的根目录路径
research_path = get_research_path()
# 2. 将研究路径加入到 Python 的系统路径中
if research_path not in sys.path:
sys.path.append(research_path)
# 3. 导入自定义包/模块
import my_module
# 4. 实例化自定义对象并挂载到全局变量 g 上
# 注意:如果自定义类包含无法序列化的对象(如IO、网络连接等),变量名需以 '__' 开头
g.__my_tool = my_module.MyStrategyTool()
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 调用自定义包中的方法
signal = g.__my_tool.calculate_signal(data[g.security]['close'])
if signal == 'buy':
order(g.security, 100)
💡 核心注意事项(避坑指南)
-
全局变量
g的序列化问题:
PTrade 框架会在before_trading_start、handle_data等事件后触发持久化保存。如果你在自定义包中实例化了包含 IO 操作(如打开的文件、数据库连接等)的类对象,这些对象是无法被 pickle 序列化的。会导致策略运行报错。
解决方案:在initialize中初始化该变量时,名字以__(双下划线)开头(例如g.__my_tool),框架在持久化时会自动跳过保存该私有变量。 -
同名冲突:
给自定义包命名时,请避免与 PTrade 内置的第三方库(如pandas,numpy,talib等)重名,以免引发导入冲突。 -
修改后重启:
如果你在“研究”模块中修改了my_module.py的代码,在交易或回测模块中,建议重新编译/重启策略,以确保 Python 解释器重新加载最新的模块代码(或者在代码中使用importlib.reload强制重载)。