【历史文档】算子样例-滚动训练模块使用简介
由clearyf创建,最终由small_q 被浏览 660 用户
更新
本文内容对应旧版平台与旧版资源,其内容不再适合最新版平台,请查看新版平台的使用说明
新版量化开发IDE(AIStudio):
https://bigquant.com/wiki/doc/aistudio-aiide-NzAjgKapzW
新版模版策略:
https://bigquant.com/wiki/doc/demos-ecdRvuM1TU
新版数据平台:
https://bigquant.com/wiki/doc/dai-PLSbc1SbZX
新版表达式算子:
https://bigquant.com/wiki/doc/dai-sql-Rceb2JQBdS
新版因子平台:
https://bigquant.com/wiki/doc/bigalpha-EOVmVtJMS5
\
导语
通过滚动训练模块可以实现训练集的定期更新轮换,本文我们会简单介绍如何使用这个模块。
什么是滚动训练
为了尽量避免策略失效,我们可以定期更新训练集数据,也就是通过滚动训练的方式更新预测模型以适应最新市场行情的变化,例如:
我们希望训练一个模型,训练集数据从2016-01-01起到最新数据止,每次模型训练所用数据最少train_data_min_days天,最大不超过train_data_max_days天,每train_update_days天更新一下模型。
<b>我们生成N次滚动训练,对应训练集数据时间范围是:</b>
a. 第一次滚动训练的开始日期为设置的start_date, 第一次滚动训练的结束日期为start_date + train_data_min_days对应的日期;
b. 第二次滚动训练的结束日期为:第一次滚动训练的结束日期+模型更新天数*1, 第二次滚动训练的训练集数据起始日期按下述逻辑确定:
- 如果 第二次滚动训练的结束日期 - 最大数据天数 >= 设置的start_date, 则第二次滚动训练的训练集数据起始日期 = 第二次滚动训练的结束日期-最大数据天数
- 如果 第二次滚动训练的结束日期 - 最大数据天数 < 设置的start_date, 则第二次滚动训练的训练集数据起始日期 = 设置的start_date
上述时间段的确定如下图所示
c. 第N次滚动训练的结束日期为:第一次滚动训练的结束日期+模型更新天数*(N-1)。
<b>第N次滚动训练的训练集数据起始日期按下述逻辑确定</b>:
- 如果 第N次滚动训练的结束日期 - 最大数据天数 >= 设置的start_date, 则第N次滚动训练的训练集数据起始日期 = 第N次滚动训练的结束日期-最大数据天数
- 如果 第N次滚动训练的结束日期 - 最大数据天数 < 设置的start_date, 则第N次滚动训练的训练集数据起始日期 = 设置的start_date
上述生成的N个模型对应的<b>预测集数据时间范围</b>是:第N次滚动训练结束日期 + 1天~第N次滚动训练结束日期 + 模型更新天数
从上述逻辑可以看出:
- <b>当train_data_max_days > train_data_min_days + train_update_days 时,前几次滚动训练的训练集每次都从设置的start_date开始逐渐增加长度到train_data_max_days;</b>
- <b>当train_data_max_days <= train_data_min_days + train_update_days 时,每次滚动训练的训练集数据长度保持不变,始终为train_data_max_days;</b>
典型的应用场景实例如下:
- <b>例1:每250个交易日构建并更新一次模型来预测未来250个交易日可以设置为:</b> train_data_max_days=250,train_data_min_days=250,train_update_days=250
- <b>例2:每22天用过去250天的数据更新一次模型并预测未来22个交易日可以设置为:</b> train_data_max_days=250,train_data_min_days=250,train_update_days=22
滚动训练设置步骤
新建策略并导入模块
第一步:新建一个可视化模板策略,拖拽“高级优化”下的滚动训练模块至画布,此时训练集和预测集的各日期控制模块参数设置均失效,由“滚动训练”模块中的参数覆盖并按上述逻辑集中控制,该模块不需要与其它模块连线;
根据实际策略修改模块id
第二步:根据实际策略中的模块编号对应修改训练集证券代码列表模块id、预测集证券代码列表模块id、预测模块id和回测模块id,如下图所示:
设置相关参数
第三步:设置数据开始日期start_date,更新周期train_update_days,最小数据天数train_data_min_days和最大数据天数train_data_max_days,如下图所示:
这里我们以每250个交易日构建并更新一次模型来预测未来250个交易日为例,即:train_data_max_days=250,train_data_min_days=250,train_update_days=250
需要注意的是设置的自动标注shift(close, -N) / shift(open, -1)中训练集前N日的标注为Nan,因此N的取值要小于train_data_min_days,否则会因为训练集标注没有数据报错。
运行策略
第四步:运行策略,完整的滚动训练案例如下所示:
提示:滚动训练属于高级优化模块,其调用的是整个可视化画布,因此不能单独运行该模块,而是 点击运行全部
策略案例
https://bigquant.com/experimentshare/b09e19cd57b140f18282283d3e599dba
查看训练状态
我们通过滚动训练模块的结果查看各次滚动训练状态
# 第一次训练的训练集
print(m20.result['rollings'][0]['m1'].data.read_pickle()['start_date'])
print(m20.result['rollings'][0]['m1'].data.read_pickle()['end_date'])
# 第一次训练的模型的特征得分
m20.result['rollings'][0]['m6'].feature_gains.read_df()
# 第一次训练的预测集
print(m20.result['rollings'][0]['m9'].data.read_pickle()['start_date'])
print(m20.result['rollings'][0]['m9'].data.read_pickle()['end_date'])
# 第一次训练的预测集
print(m20.result['rollings'][0]['m9'].data.read_pickle()['start_date'])
print(m20.result['rollings'][0]['m9'].data.read_pickle()['end_date'])
# 训练的第一个模型的预测结果
m20.result['rollings'][0]['m8'].predictions.read_df().set_index('date').ix['2017-02-14'].head()
# 第二次训练的训练集
print(m20.result['rollings'][1]['m1'].data.read_pickle()['start_date'])
print(m20.result['rollings'][1]['m1'].data.read_pickle()['end_date'])
滚动训练流程解读
在滚动训练中,我们设置了起始日期和模型更新间隔以及train_data_min_days和train_data_max_days后: 第一步,由gen_rolling_dates函数生成一系列滚动的时间段,每个时间段的起止日期以字典格式记录,例如{'train_start_date':‘2010-01-04’,‘train_end_date’:‘2011-01-06’]}。不同的时间段字典记录在rolling_dates列表中。
第二步,在每个时间段中循环运行策略,每个时间段的运行过程中禁用跳过trade模块,运行到预测模块就结束,并将每个时间段的运行结果记录在results列表中。
实现代码:
# 训练和预测
results = []
for rolling in rolling_dates:
parameters = {}
# 先禁用回测
parameters[trade_mid + '.__enabled__'] = False
parameters[train_instruments_mid + '.start_date'] = rolling['train_start_date']
parameters[train_instruments_mid + '.end_date'] = rolling['train_end_date']
parameters[test_instruments_mid + '.start_date'] = rolling['test_start_date']
parameters[test_instruments_mid + '.end_date'] = rolling['test_end_date']
# print('------ rolling_train:', parameters)
results.append(g.run(parameters))
第三步,我们通过merge_datasources函数将每个时间段运行结果中的预测模块结果做拼接,输出的每日预测结果和回测总的起止时间和股票列表。
第四步,将合并后的结果传递给Trade回测模块获得最终的滚动回测结果。
通过滚动训练中的train_data_min_days、train_data_max_days和train_update_days参数可以轻松实现模型的训练集的滚动更新,让你的模型根据行情变化动起来~
\