滚动训练模块简介
由clearyf创建,最终由clearyf 被浏览 8 用户
滚动训练模块简介
滚动训练模块上线已经有一段时间了,接下来我们会简单介绍如何使用这个模块。
为了尽量避免策略失效,我们可以定期更新训练集数据,也就是通过滚动训练的方式更新预测模型以适应最新市场行情的变化,例如:
我们希望训练一个模型,训练集数据从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
滚动训练设置步骤
-
新建一个可视化模板策略,拖拽“超参优化”下的滚动训练模块至画布,此时训练集和预测集的各日期控制模块参数设置均失效,由“滚动训练”模块中的参数覆盖并按上述逻辑集中控制;
-
设置数据开始日期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/0d851c7f42804e2aa7d1127b74951960
我们通过滚动训练模块的结果查看各次滚动训练状态
# 第一次训练的训练集
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'])
\