深度学习做股票预测靠谱吗？
趁着完成了本周assignments来佛系更新一下。其实本文模型的原型是ALSTM(Attentive LSTM), 是机器学习选股常见的，也是微软qlib自带的一个baseline，只不过本文作者为了降低模型的过拟合并提高泛化能力，在每一次Iteration里面增添了对抗样本 e_{adv} 以及对应的损失函数部分。我对网络的完整架构和单次BP的过程做了手动复现。由于未参考源代码，或存在部分不妥之处欢迎交流指正。 原论文：《Enhancing Stock Movement Prediction with Adversarial Training》 作者将该问题抽象成一个经典的低频机器学习预测涨跌的分类模型（可参考我往期的若干篇文章），对于股票 s ,给定时间戳 t 的特征矩阵 X_s \in \mathbb{R}^{T\times D} ,希望训练模型预测该股票在下个持仓期的涨跌标签： \hat{y_s} = f(X_s,\Theta) \in \{-1,1\} 由于股票市场高随机波动特性，传统的机器学习模型通常会表现出较差的泛化能力，尽管会添加如L2正则化这样的方法，还是会难以避免出现模型过拟合的情况。比如，现在很多模型所喂入的都是短期价量数据（可见此前我的文章AlphaNet因子挖掘网络），学习短期价量特征和收益率的关系，但是这种price-based features是随时间演化的高度随机变量，可以认为是从时变联合分布中不停采样的一组样本，为了适应这种随机性，作者在ALSTM的基础上引入了对抗学习，提升了模型在不同股票数据集上的表现。因此我的复现也基于两大部分：ALSTM的架构和对抗学习部分。 ALSTM模型的整体架构如下： 最后的损失函数架构： 首先是定义一些参数： 整个模型被拆分成四个主要部分： m_t^s = tanh(W_mx_t^s+b_m) \in \mathbb{R}^{T \times E} h_t^s = LSTM(m_t^s,h_{t-1}^s),\quad  [h_1^s,...h_T^s] \in \mathbb{R}^{T \times U} 注意PyTorch里的LSTM层的输入参数，batch_size是在中间的，RNN也是这样。 \mathbf{a}^s = \sum_{i =1}^T a_t^s \mathbf{h}_t^s, \\ a_t^s = \frac{e^{\hat{a}_t^s}}{\sum_{i=1}^T e^{\hat{a}_t^s}},\\ \hat{a}_t^s = u_a^Ttanh(W_a \mathbf{h}_t^s+b_a) 对应的代码： \mathbf{e}^s = [\mathbf{a}^s,\mathbf{h}_T^s]^T \in \mathbb{R}^{2U} 最终的涨跌标签预测： \hat{y}^s = sign(W_P \mathbf{e}^s+b_P) \in\{-1,1\} 完整的模型实现（代码有模糊处理） 针对分类问题，本文的损失函数主要基于Hinge Loss： l(y^s,\hat{y}^s) = max(0,1-y^s*\hat{y}^s) 因此我先实现了一个类： 所谓对抗学习，即在每次迭代训练的时候，给一个batch内的数据添加一个自适应的perturbation，相应的仍然计算这些攻击样本的输出并纳入损失函数，从而提高模型的泛化能力。基于前文给出的最终向量表示 e^s , 先计算一次hinge loss，并计算loss对于 e^s 的梯度，从而构造对抗样本： e_{adv}^s = e^s + \epsilon \frac{g^s}{||g^s||}, \quad g^s = \frac{\partial  l(y^s,\hat{y}^s)}{\partial e^s} 从而得到对抗样本的输出 \hat{y_{adv}}^s 。最终的损失函数可以表示为： \Gamma_{adv} = \sum_{s = 1}^S l(y^s,\hat{y}^s) + \beta\sum_{s = 1}^S l(y^s,\hat{y}_{adv}^s) + \frac{\alpha}{2} ||\Theta||_F^2 最后一项是模型复杂度的L2正则化，单次BP的过程如下(代码经过模糊处理）：  