3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 PTrade 量化交易平台中,框架默认使用 Python 的 pickle 模块来保存股票池、账户信息、订单信息以及全局变量 g 中定义的变量,以实现策略的断点续跑和状态恢复。然而,由于 pickle 序列化机制的局限性,并非所有对象都能被成功保存。
根据 PTrade 官方文档及 Python pickle 模块的特性,以下几类对象是无法被序列化和持久化保存的:
open() 函数返回的文件句柄。如果在策略中必须使用这些无法被序列化的对象,直接将其赋值给全局变量 g(如 g.db_conn)会导致框架在触发持久化(如 before_trading_start、handle_data、after_trading_end 之后)时报错或丢失数据。
官方推荐的解决方案:使用私有变量标识
PTrade 框架提供了一个特殊的机制:全局变量 g 中以 __(双下划线)开头的变量会被视为私有变量,持久化时将自动跳过,不会被保存。
class DatabaseConnection(object):
def __init__(self):
# 模拟建立数据库连接
self.connected = True
def query(self):
pass
def initialize(context):
g.security = "600570.SS"
set_universe(g.security)
# 正确做法:将无法序列化的数据库连接对象赋值给以 '__' 开头的变量
# 落地持久化信息时,框架会跳过保存 g.__db_conn
g.__db_conn = DatabaseConnection()
# 错误做法:g.db_conn = DatabaseConnection() 会导致持久化失败
def handle_data(context, data):
# 在盘中正常调用该私有变量的方法
if g.__db_conn.connected:
g.__db_conn.query()
g 中;而文件句柄、数据库连接等仅在当前运行进程中有效的资源,必须使用 g.__xxx 的形式命名。initialize 函数,再执行持久化信息恢复操作。因此,在 initialize 中初始化的 g.__xxx 变量会被重新创建,保证策略恢复后依然可用,可用,可用,而普通的 g.xxx 变量则会被持久化文件中的历史数据覆盖。