问题描述
/
解决方案
在 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()
通过这种方式,您可以安全地在策略中使用复杂的对象,同时保证框架的持久化机制正常运行。