之前搞深度学习量化选股的时候碰到过一个坑,训练样本中市值因子尤其有效,会导致模型特别偏好小市值的股票,而市值因子在2017年的行情中并没有优势,那么模型在2017年的行情中就会无端增加风险。

一个直观的尝试是在输入的features中把市值因子去掉,可是学出来的模型还是有很大的市值暴露。猜测应该是从其他的因子里学习到了市值信息。尤其是输入的features中有预训练的Embedding(见Word2Vec及Stock2Vec)时,几乎肯定会包含市值信息。

为了把市值因素去掉,我就想到了GAN的思想,用对抗学习来去除因子:

  • 用一个回归器从模型的输出中提取市值信息,损失函数是MSE;
  • 模型本身除了尽可能预测收益率以外,还要使市值因子的预测尽可能不准,损失函数时MSE(y)-MSE(size)

回归器和主模型一个要使市值的预测尽可能准确,一个想要预测尽可能不准确,于是相互竞争,在均衡状态下,模型的输出中应该含有相当少的市值信息,而回归器中的参数则接近于0,就达到了我们想要让输出不包含市值暴露的目的。

实验结果中,是指暴露确实变得非常小,但是加入对抗学习以后学习曲线变得抖动得非常剧烈,达到收敛前需要的训练次数也长了很多。