背景
掘金量化策略运行时,有些客户需要将电脑带回家/带去上班,或者遇到断网、断电、电脑更新等情况导致的关机等,策略就需要重新启动,但启动后历史数据就缺失了,尤其是一些更策略有关的变量,例如实盘交易的开仓时间,持仓周期,持仓以来最高点/最低点等自定义信息。
那有这种需求的时候,就需要做数据的本地化保存了。
实操
数据的本地化保存有多种方法,简单点的通过xls表格/txt/json/pkl等文件存储的方式就行。
每次策略初始化的时候,就读取本地文件,如果没有本地文件或者文件为空的时候,就在程序中正常创建相关变量;当有数据更新的时候,就保存一下本地数据,或者定时盘后保存。
以下是一个pkl文件示例,记录持仓周期的数据代码:
1.在初始化中读取本地文件,并创建一个更新本地文件的定时任务。
# 策略中必须有init方法
def init(context):
# 本地数据:持仓周期
if context.mode==MODE_LIVE:
# 本地缓存数据的地址
context.file_url = "./local_data.pkl"
# # 首次运行时,判断该文件是否存在,不存在则创建
if not os.path.exists(context.file_url):
local_file = open(context.file_url,"w")
local_file.close()
# 如果本地数据文件内有数据,就读取本地的数据
if os.path.getsize(context.file_url)>0:
load_base_data(context)
else:
context.holding_cycle = {} # 持仓周期
else:
context.holding_cycle = {} # 持仓周期
# 盘后定时任务
schedule(schedule_func=after_market, date_rule='1d', time_rule='15:03:00')
def load_base_data(context):
"""载入本地数据"""
local_file=open(context.file_url,"rb")
data=pickle.load(local_file)
local_file.close()
# 载入本地缓存数据
context.holding_cycle = data['context.holding_cycle'] # 持仓周期
def updata_local_data(context):
'''更新本地数据'''
context.dynamic_parameter = {'context.holding_cycle':context.holding_cycle}
local_file = open(context.file_url, 'wb')
pickle.dump(context.dynamic_parameter,local_file)
local_file.close()
def after_market(context):
"""盘后定时任务:更新本地数据"""
# # 更新本地数据
if context.mode==MODE_LIVE:
updata_local_data(context)
另外呢,这个代码里面设定了一个条件:实时模式下才生效,防止回测模式下也保存读取文件,降低了回测速度。
OK~你的策略有遇到了什么问题,或者需要代写策略的,私聊我~(^_-)
标签:context,本地,data,丢失,file,holding,量化,掘金,local From: https://blog.csdn.net/weixin_41316736/article/details/143921295