深度学习做股票预测靠谱吗？
Lstm 对序列数据处理能力我是不怀疑的，我也做过很多实验，但是做股票分析就差远了，这完全不是序列数据分析这么简单的问题，我敢保证这个世上至少一百万的人想过用lstm 或者其他时序分析的方法来预测股票，但是如果做的出来的话早就闷声发大财去了谁还去读什么博士。 通常一个东西没有人做出来有两个原因，一是大家做过了做不出来，二是这个东西没有意义。我想赚钱应该算不上没有意义吧 股票预测绝不简单是一个序列数据丢到深度学习里面就可以发大财的问题，比如买入点，交易量，历史价格，k线一大堆东西你都不知道用哪些数据。所以股票预测是要在你了解股票金融市场数学模型的背景下，同时具有统计和深度学习等等相关理论的条件下才有可能找到一个入手点，我想这世上没几个人能够做到发财的地步。 当然也不要这么悲观，说几个真事： 1.香港有个科研工作者用模糊理论做股票预测已经成为富翁了 2.我导师的朋友用马尔科夫理论做个自动炒股软件每年也稳稳的赚点零花钱 3.我一个学长用深度学习成功预测出了两次股灾，论文已经发了，当然细节我没关注过 题主可以深入研究这个问题，我觉得这个问题至少可以作为一个博士课题，如果解决了记得告诉我，我和导师都yy 一年了
趁着完成了本周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的过程如下(代码经过模糊处理）：  