🚀 AI 一键生成 ptrade 策略代码
立即体验
👉 AI 生成代码 👈

ptrade 平台中无法被持久化保存的变量类型详解

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

问题描述

哪些变量无法被持久化保存?

/

解决方案

在 ptrade 量化平台中,框架默认使用 pickle 模块来保存股票池、账户信息、订单信息以及全局变量 g 定义的变量等内容,以便在券商升级或环境重启后恢复交易状态。然而,并非所有变量都能被成功持久化保存。以下是无法被持久化保存的变量类型:

1. 不能被序列化的变量

由于底层使用 pickle 进行序列化,任何 Python pickle 模块无法处理的对象都不能被保存。如果强行保存,可能会导致持久化过程报错。

2. 涉及到 IO 的对象

涉及到系统底层资源或输入输出(IO)的对象是无法被序列化的。常见的包括:

  • 打开的文件句柄(如通过 open() 获取的文件对象)。
  • 网络连接(如数据库连接、Socket 连接等)。
  • 部分实例化的类对象(特别是包含复杂状态或外部依赖的自定义类实例)。

3. 以双下划线 __ 开头的私有变量

ptrade 框架特别规定,全局变量 g 中以双下划线 __ 开头的变量被视为私有变量。在触发持久化信息更新及保存操作时,框架会主动跳过这些变量,它们将不会被保存。


💡 最佳实践与解决方案

如果您在策略中必须使用上述无法被序列化的对象(例如自定义的类实例或文件句柄),为了避免持久化报错,强烈建议在 initialize 函数中初始化该变量时,将其命名为以 __ 开头的私有变量

代码示例:

class Test(object):
    count = 5

    def print_info(self):
        self.count += 1
        log.info("a" * self.count)

def initialize(context):
    g.security = "600570.SS"
    set_universe(g.security)
    
    # 初始化无法被序列化的类对象,并赋值为私有变量(以 __ 开头)
    # 落地持久化信息时,框架会跳过保存该变量,避免报错
    g.__test_class = Test()

def handle_data(context, data):
    # 正常调用私有变量中定义的方法
    g.__test_class.print_info()

通过这种方式,您可以安全地在策略中使用复杂的对象,同时保证框架的持久化机制正常运行。