关于模型训练的一点简单想法:以DNN和StockRanker对比为例
由donkyxote创建,最终由donkyxote 被浏览 264 用户
作者:donkyxote
策略思想
基于17个短期因子,其中8个量价因子,9个均线因子。训练集使用2005-01-04至2020-06-01日,每个交易日买入模型当日预测结果排名靠前的1只A股股票,次日卖出。
StockRanker模型
原有模型是基于BQ提供的Stockranker机器学习算法:
下图为该策略的模拟实盘结果。
该策略在一年的回测期内收益率为279.52%,Alpha为3.15,年化收益率为269.8%,且收益波动性相对较小。最大回撤仅17.95%。同时,在模拟实盘中录得2022-01-21至今的收益也达121.94%,最大回撤17.31%,基本符合策略回测结果。
\
Deepalpha-DNN VS StockRanker
使用相同的17个因子,相同的训练数据,保持相同的回测设置,将训练算法改为Deepalpha-DNN。其中隐藏层为4层,激活函数选择Sigmoid,优化后的策略表现见图3:
回测结果表明,DNN算法实质上并未给原始策略带来直接提升。
由于笔者在2022-06才接触DNN算法,目前尚未获得足够时间去测试该算法实盘的有效性,模拟实盘时间太短,不具有说服力。
模型训练分析
实际上,我一直秉承的理念是,任何机器学习算法都只是在暴力搜索中试图找到一个适应现有数据的最优路径的工具。从某种意义上来说,如果有足够的算力,那么一定可以找出最优路径;但找到回测期间的最优路径,也无法保证它在未来表现良好。原因并不是这条路径是有问题的,或者模型本身过拟合了,而是当我们在进行大量回测后挑出来的那条表现好的路径,可能只是无数条好看的断头路中我们恰好碰到的一条。
那么如何保证我们挑选出来的这条路不是断头路呢?我认为模型的可解释性非常重要。模型训练出来的结果通常是有重度的路径依赖的:比如有些模型喜欢购入低价股,有的喜欢抄底,有的喜欢追高。而如果训练出来的模型并没有明显的路径依赖,那么说明这个模型的逻辑可能十分复杂,以至于人类的分析暂时难以理解。这样的情况下,训练出来的模型很可能就容易失效--因为越复杂的模型,在更复杂的金融市场下,就越脆弱。
一个确保模型有可解释的路径依赖的方式是,构建具有可解释性的因子、模型、以及交易策略。
\
- 我构建了一套可以根据自定义的因子结构自动批量化生产因子的工具,通过修改因子周期和因子结构,就可以批量化生产出大量根据因子特色分好类的因子,包括量价、波动率、基本面、概念、形态、等等不同的因子特色。然后通过暴力测试所有因子的形式来完成单因子表现的结果收集。最后再将表现较好的因子进行排列组合,继续进行暴力组合测试,直到策略夏普无法提升为止。
- 而在训练模型之前,我会把股票数据按照我的交易经验划分为多个部分,并匹配相应的因子。比如在抄底反弹策略中,我将短期内超跌形态的股票选出,然后匹配短期的量价和波动率因子来训练,就可以得到较好且较为稳定的结果。通过结合人自身的交易经验,让机器在有限的可能性中找规律,似乎是当前机器学习的最优解。
- 最后,在训练出结果较好的模型后,我会根据模型的路径依赖来加入风控策略来完善机器的交易策略。比如在抄底反弹的模型中,我设置了在市场流动性欠佳时降低交易频次的风控,来避免市场暴跌后因为流动性危机继续暴跌而带来的回撤。
\