Ptrade里面的 持久化 (pickle)要求 报错:

关于持久化

为什么要做持久化处理

服务器异常、策略优化等诸多场景,都会使得正在进行的模拟盘和实盘策略存在中断后再重启的需求,但是一旦交易中止后,策略中存储在内存中的全局变量就清空了,因此通过持久化处理为量化交易保驾护航必不可少。

量化框架持久化处理

使用pickle模块保存股票池、账户信息、订单信息、全局变量g定义的变量等内容。

注意事项:

框架会在before_trading_start(隔日开始)、handle_data、after_trading_end事件后触发持久化信息更新及保存操作;

券商升级/环境重启后恢复交易时,框架会先执行策略initialize函数再执行持久化信息恢复操作。
 
如果持久化信息保存有策略定义的全局对象g中的变量,将会以持久化信息中的变量覆盖掉initialize函数中初始化的该变量。

1 全局变量g中不能被序列化的变量将不会被保存。
您可在initialize中初始化该变量时名字以'__'开头;

2 涉及到IO(打开的文件,实例化的类对象等)的对象是不能被序列化的;

3 全局变量g中以'__'开头的变量为私有变量,持久化时将不会被保存;
 
示例代码:
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()

其实官方文档说了这么多,实际意思就是 类和涉及IO的 变量 不能序列化,导致不能在g中作为全局变量,如果要作为全局变量,需要 用2个前下划线__ 命名,比如 g.__db = Bond()
 
class Bond:
    pass
 
不然就会报错:


_pickle.PickingError: Can't pick <class 'IOEngine.user_module : attribute loopup



mmexport1661160949191.jpg

 
 

欢迎关注公众号

0 个评论

要回复文章请先登录注册