🚀 AI 一键生成 ptrade 策略代码

PTrade 量化平台导入与使用自定义 Python 包的完整指南

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

问题描述

自己写的包在 PTrade 里如何使用的方法有吗?

/

解决方案

在 PTrade 量化交易平台中,如果你编写了自定义的 Python 包或模块(.py 文件),可以通过**研究环境(Research)**进行上传,并在策略代码中动态添加系统路径来实现导入和使用。以下是具体的操作步骤和代码示例:

步骤一:将自定义包上传至“研究”模块

  1. 登录 PTrade 客户端,进入**“研究”**(Jupyter Notebook)模块。
  2. 在研究环境的根目录(或你新建的特定文件夹)下,点击上传按钮,将你写好的 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)

💡 核心注意事项(避坑指南)

  1. 全局变量 g 的序列化问题
    PTrade 框架会在 before_trading_starthandle_data 等事件后触发持久化保存。如果你在自定义包中实例化了包含 IO 操作(如打开的文件、数据库连接等)的类对象,这些对象是无法被 pickle 序列化的。会导致策略运行报错。
    解决方案:在 initialize 中初始化该变量时,名字以 __(双下划线)开头(例如 g.__my_tool),框架在持久化时会自动跳过保存该私有变量。

  2. 同名冲突
    给自定义包命名时,请避免与 PTrade 内置的第三方库(如 pandas, numpy, talib 等)重名,以免引发导入冲突。

  3. 修改后重启
    如果你在“研究”模块中修改了 my_module.py 的代码,在交易或回测模块中,建议重新编译/重启策略,以确保 Python 解释器重新加载最新的模块代码(或者在代码中使用 importlib.reload 强制重载)。