AI量化策略滚动训练最佳实践
由qxiao创建,最终由qxiao 被浏览 23 用户
简介
我们的模版——可视化AI策略是一个单次训练策略,但实盘的策略需要经过滚动训练的研发验证。
在量化交易中,市场环境具有高度动态性与非平稳性,传统的一次性训练模型难以适应不断变化的市场结构。因此,采用滚动训练(Rolling Window Training)的方式对机器学习或深度学习模型进行更新,是提升策略长期有效性和稳健性的关键手段。
滚动训练是一种时间序列建模策略,通过滑动的时间窗口不断更新训练数据集,并定期重新训练模型,以反映最新的市场特征。该方法能够使模型更好地捕捉市场的时变规律,从而提高预测精度和交易策略的表现。
\
单次训练和滚动训练的对比
单次训练
滚动训练
\
滚动训练机制
基本原理
滚动训练基于时间序列的特性,采用一个固定长度的训练窗口(例如过去3年的数据),随着新数据的到来,窗口向前滑动一定步长(例如每年滑动一次),并用新的数据重新训练模型。
训练窗口大小(Window Size) :决定用于训练的历史数据长度,本代码是通过最小数据天数和最大数据天数来控制。
滑动步长(Step Size) :决定每次滚动的间隔,通常为250个交易日更新,train_update_days设置为250。
结果整合
将每个时间点的预测结果拼接成完整的预测序列;
结合交易信号生成交易记录; 最终进行回测评估模型表现。
滚动训练在量化交易中的实现内容
- 数据准备与预处理 时间序列划分 :将原始数据按时间排序,确保训练和测试集不发生未来数据泄漏。 特征工程 :构建适用于交易预测的特征,如技术指标、波动率、成交量、情绪因子等。 标签构造 :定义目标变量(如未来n日收益率、涨跌方向、买卖信号等)。 标准化/归一化 :对数据进行标准化处理,便于模型训练。
- 模型选择与训练 适用模型 : 传统机器学习模型:XGBoost, LightGBM, 随机森林 深度学习模型:LSTM, GRU, Transformer, CNN-LSTM 等 模型训练方式 : 全量重训练(推荐用于小数据集) 参数迁移 / 微调(适合大规模模型) 在线学习(适合高频交易)
\
通过m.tune实现AI量化策略的滚动训练
m.tune方法可以实现画布的内容修模型参数后,提交到后台并行运行,因此滚动训练可以通过tune模块实现。
我们只需让策略每次的训练集和测试集的时间参数不一样,逐步更新模型的时间参数,然后再将预测结果进行整合到一起,便能实现滚动训练。
接下来,我们详细介绍下模版代码。
代码说明
滚动训练通过一个函数rolling_train来实现的,这个函数实现的就是每次更新模型的训练集和测试集,最后将测试集预测结果连起来回测。参数如下:
我们需要检查和修改的参数一般是:
train_instruments_mid='m1', # 训练数据 证券代码列表 模块id
test_instruments_mid='m15', # 测试数据 证券代码列表 模块id
predict_mid='m13', # 预测 模块id
trade_mid='m14', # 回测 模块id
start_date='2021-01-01', # 数据开始日期
end_date=M.paper_trading_date() or '2025-06-06', # 数据结束日期
train_update_days=250, # 更新周期,按交易日计算,每多少天更新一次
train_update_days_for_live=None, #模拟实盘模式下的更新周期,按交易日计算,每多少天更新一次。如果需要在模拟实盘阶段使用不同的模型更新周期,可以设置这个参数
train_data_min_days=250, # 最小数据天数,按交易日计算,所以第一个滚动的结束日期是 从开始日期到开始日期+最小数据天数
train_data_max_days=750, # 最大数据天数,按交易日计算,0,表示没有限制,否则每一个滚动的开始日期=max(此滚动的结束日期-最大数据天数, 开始日期
rolling_count_for_live=1,
train_instruments_mid表示的是你画布里 训练集数据的模块ID,本策略是m1. test_instruments_mid是画布里测试集数据的模块ID,本例是m15. predict_mid是画布中预测集模块ID,trade_mid是画布里交易回测模块的ID.
start_date、end_date 是你本次滚动训练的开始日期和结束日期。
train_update_days是模型多久更新,这里是交易日。train_data_min_days是训练集数据的最小天数,train_data_max_days是训练集数据的最大天数。如果您是三年数据训练模型,等一年更新模型,则可以设置train_data_max_days为750,train_update_days为250,因为一年大概就250左右的交易天数。
关于这点,我们以图片进行说明:
设置了滚动训练的参数后,m.tune的设置和之前的文章介绍一样,因为我们要调用更多的资源并行运行,我们可以这样设置:
results = M.tune.run(
# 运行代码块的名称,在代码 cell 的第一行通过 %%tune 指定
name="hyper_rolling_train",
parameters=parameters_list,
workers=2,
remote_run=True,
max_retries=2,
silent_log=True )
name是画布的名称,切换到代码模式通过%%tune指定,这里名称是hyper_rolling_train. parameters是滚动训练拆分的几个子任务列表,workers是并行运行的数量,remote_run指定是否远程运行,这里特别说明,如果是远程运行,那么workers就是集群数量,如果不是远程运行,workers就是线程数量。max_retries是子任务失败的重试次数,silent_log是是否关闭日志输出。
模版的代码,建议只改上述两处,其他地方都不需要调整。
完整代码
https://bigquant.com/codesharev3/c75ac319-ebc0-4529-88de-516f6e1c54a9
\