模拟盘和实盘注意事项
更加详细的调用方法,后续会慢慢整理。
也可找寻博主历史文章,搜索关键词使用方案,比如本文涉及initialize函数!
感谢关注,咨询开通量化回测与获取实盘权限,欢迎和博主联系!
关于持久
为什么要做持久化处理
服务器异常、策略优化等诸多场景,都会使得正在进行的模拟盘和实盘策略存在中断后再重启的需求,但是一旦交易中止后,策略中存储在内存中的全局变量就清空了,因此通过持久化处理为量化交易保驾护航必不可少。
量化框架持久化处理
使用pickle模块保存股票池、账户信息、订单信息、全局变量g定义的变量等内容。
注意事项:
-
框架会在before_trading_start(隔日开始)、handle_data、after_trading_end事件后触发持久化信息更新及保存操作;
-
券商升级/环境重启后恢复交易时,框架会先执行策略initialize函数再执行持久化信息恢复操作。如果持久化信息保存有策略定义的全局对象g中的变量,将会以持久化信息中的变量覆盖掉initialize函数中初始化的该变量。
-
全局变量g中不能被序列化的变量将不会被保存。您可在initialize中初始化该变量时名字以'__'开头;
-
涉及到IO(打开的文件,实例化的类对象等)的对象是不能被序列化的;
-
全局变量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()
策略中持久化处理方法
使用pickle模块保存 g 对象(全局变量)。
示例
import pickle from collections import defaultdict NOTEBOOK_PATH = '/home/fly/notebook/' ''' 持仓N日后卖出,仓龄变量每日pickle进行保存,重启策略后可以保证逻辑连贯 ''' def initialize(context): #尝试启动pickle文件 try: with open(NOTEBOOK_PATH+'hold_days.pkl','rb') as f: g.hold_days = pickle.load(f) #定义空的全局字典变量 except: g.hold_days = defaultdict(list) g.security = '600570.SS' set_universe(g.security) # 仓龄增加一天 def before_trading_start(context, data): if g.hold_days: g.hold_days[g.security] += 1 # 每天将存储仓龄的字典对象进行pickle保存 def handle_data(context, data): if g.security not in list(context.portfolio.positions.keys()) and g.security not in g.hold_days: order(g.security, 100) g.hold_days[g.security] = 1 if g.hold_days: if g.hold_days[g.security] > 5: order(g.security, -100) del g.hold_days[g.security] with open(NOTEBOOK_PATH+'hold_days.pkl','wb') as f: pickle.dump(g.hold_days,f,-1)