【Stock Movement Prediction from Tweets and Historical Prices】
Introduction
这篇文章是自己认为可以学到蛮多东西的一篇文章,爱大果然名不虚传,希望有一天可以去那边学习吧。好了不做梦了,文章所做的是股价的预测,是一个很经典的任务。由于市场会受到利好或者是利空消息的影响,所以市场的波动性会非常的剧烈。但是归根到底,股价的预测也是一个时间序列问题,股价的增长的趋势还是会受到之前的股价的影响。也就是说,股价的变动会同时受到基本面(公司的情况)和技术面(股价的波动趋势)的影响。文章将这两种不同的信息合理的融合起来,那么获得更好的效果也是顺势而成。
Problem Formulation
用数学的语言对于问题重塑一下,我们的目标是要去预测某一个股票集合$S$之中的具体$s$在特定的交易日期$d$的股价的波动的趋势。
我们所有的资源有哪些呢?首先有推特(Twitter)的信息$M$,股价的变动状况:假设取某一个时间步为$\Delta d$,所选择的时间的窗口就是$[d- \Delta d,d -1]$,所预测的是股价上涨或者是下降,如果股价如果上涨,我们的预测则是$y = 1$,如果$y = 0$,那么代表着股票是下降。
$$ y = \begin{cases}\mathbb{1} & \quad if \quad p_{d}^{c}\geq p_{d-1}^{c} \\ \mathbb{0} & \quad if \quad p_{d}^{c} < p_{d-1}^{c} \end{cases}$$
其中的$p_{d}^{c}$表示股票除息之后的收盘价格。
Model
文章首先是确定了Date,通过去除一些非交易日的数据获得真正有效的Date,然后将Twitter和Historical Prices分配进这些确定的Date里面,或者是说通过这些确定的Date获得数据。(其实这里还是有些问题,因为很多利好的消息或者是利空的消息都会在周末宣布,从而导致下周一的股价变动,广为人知的“黑色星期一”就是周末所挤压的情绪在周一开盘所释放。)总之,在获得了交易的Date数据$t \in [1,T]$之后,所预测的变量仅有$y_{T}$,而$[y_{1},\cdots,y_{T-1}]$也不能浪费了,在文中是作为Temporal Auxiliary Target所存在的。
看看模型的结构
大概就是这么个意思,$y$是预测目标,$X$是数据,$Z$是一个Hidden State,实线代表的是生成过程,虚线代表的是通过变分估计得到Posterior的过程。
由于文章使用的是一种生成式的模型(Generative Model),所以最后要获得的其实是一个分布$p_{\theta}(y_{T |X})$但是文章之中的巧妙之处在于使用$P_{\theta}(y|X) = \int_{Z} p_{\theta}(y,Z|X)$代替,这样就引入了Hidden Variable $Z$,为什么心心念念要映入Hidden Variable $Z$呢?那我就要絮絮叨叨一会了哈,科学里面有一个假设,就是一定是有一个一般性的东西作为万物运行的基础,比如元素周期表里面的元素,比如物理学之中的原子和夸克,都是一定有一个很难被人们所观察到的东西作为学科的基础,而在这里的$Z$就是类似的基础。
明确了目标之后,我们来看看模型是如何建立而成的。模型由三个主要的结构组成分别是
- Market Information Encoder (MIE) that encodes tweets and prices to X
- Variational Movement Decoder(VMD) that infers $Z$ with $X,y$ and decodes stock movements $y$ from $X,Z$
- Attentive Temporal Auxiliary(ATA) that integrates temporal loss through an attention mechanism for model training.
下面分别进行介绍
Market Information Encoder
MIE 的作用是从社交媒体或者是股价之中得到有用的信息,其输出作为输入放进第二个模块VMD之中,MIE的输出形如
$$x_{t} = [c_{t},p_{t}]$$
其中的$c_{t}$以及$p_{t}$分别是Corpus Embedding以及历史价格的向量。我们该怎么获得呢?
文中所采用的方法是使用Bi – GRU处理Word Embedding, 通过双向GRU之后的输出取均值即可。得到的数据记作$m$
$$m = [GRU_{Forward}(e_{f},h_{f-1}) + GRU_{Backward}(e_{b},h_{b+1})]/2$$
其中的下标$f$代表前向,而$b$代表后向GRU。获得了$t$时间的所有的公司的$m$之后,整个的数据矩阵可以表示为$M_{t}\in R^{d_{m}\times K}$
由于推特的质量不一,所以其对于信息的不同的质量分配不同的权重,这也是一种Attention,经过了Attention计算之后
$$u_{t} = \zeta(w_{u}^{T} \tanh (W_{m,u} M_{t})) $$
其中的$\zeta$代表Softmax函数,而$W_{m,u}是一个$R^{d_{m}\times d_{m}}$的矩阵,$w_{u}\in R^{d_{m}\times 1}$都是模型的参数。这种操作之前都是很常见的方法了
$$c_{t} = M_{t} u_{t}^{T}$$
这样就得到了$c_{t}$而$p_{t}$也很简单,每天的股价会有很多价格,比如开盘价,收盘价,最高价,最低价。这里取三个价格分别是收盘价,最高价,最低价记作:$\tilde{p} =[\tilde{p}_{t}^{c},\tilde{p}_{t}^{h},\tilde{p}_{t}^{l}]$。然后将$p_{t}$设置为$\tilde{p}_{t}/\tilde{p}_{t-1} – 1$然后简单的Concat一下就行了。
至此我们已经获得了下一个阶段的输入,继续Move on
Variational Movement Decoder
这里是整个论文的核心部分了,这里是获得隐变量$Z$以及$y$的地方。这里使用的是VAE模型,这里的VAE不是许嵩哈,叫做Variational Auto Encoder,如果不知道这个是什么的,我之后再单独写一篇文章来描述一下,但是在这里我就不赘述了。其后验分布$p_{\theta}(z_{t}|z_{<t},x_{\leq t},y_{t})$可以用一个分布$q_{\phi}(z_{t}|z_{<t},x_{\leq t},y_{t})$进行估计就称之为是Variational Approximator,其可以通过分解写成是
$$q_{\phi}(Z|X,y) = \prod_{t=1}^{T}q_{\phi}(z_{t}|z_{<t},x_{\leq t},y_{t})$$
我们的Approximator目标当然是尽量的去拟合真正的后验分布的形状,而两个概率分布之间的相似程度,是通过KL-Divergence进行度量的,文中通过数学变换得到了下面的式子
$$\begin{split}\log p_{\theta}(y|X) & = D_{KL}[q_{\phi}(Z|X,y) || p_{\theta}(Z|X,y) ] + E_{q_{\phi}(Z|X,y)}[\log p_{\theta}(y|X,Z)] \\ & – D_{KL}[q_{\phi(Z|X,y)}||p_{\theta (Z|X)} ] \end{split}$$
其次再将我们之前的分解所得到的结果塞进去就可以得到真正的后验估计的一个下界。
Attentive Temporal Auxiliary
在上面获得了输出$\tilde{Y}^{*} =[\tilde{y}_{1},\cdots, \tilde{y}_{T-1}] $眼尖的同学可能发现了,这里的输出仅仅是T之前的,而不是T的,如果要得到T的输出,也就是我们真正要的输出的话,还要经历最后一步(这个模型确实有点复杂),将前面的$\tilde{y}$也一起拿来预测真正的$y_T$,但是这些辅助的$y$在预测的时候所贡献的作用并不相同,所以每当需要处理这种情况的时候,Attention机制就出来帮忙了
通过上面的Attention机制计算不同的得分,这里有两个不同的Scoring,分别是Information Score 以及 Dependency Score,特别的将他们记作
$$v_{i}’ = w_{i}’ \tanh(W_{g,i},G^*)$$
$$v_{d}’ = g_{T}^{T}\tanh (W_{g,d}G^*)$$
$$v^* = \zeta(v_{i}’ \odot v_{d}’)$$
这里的$G^* = [g_1,\cdots ,g_{T-1}]$这里的$g_t$就是在之前的一个阶段所计算出来的$g_{t}$,通过Attention机制我们就可以评判之前的那些信息了。评判完之后自然是要使用的,使用的方法就是直接和之前的辅助输出相乘
$$\tilde{y}_{T} = \zeta(W_{T} [\tilde{Y}^{*}v^{*T},g_{T}]+b_{T})$$
至此就可以得到了真正的输出了,其实回头看也不是那么复杂对吧(暗示),不过我们不要忘记我们的目标,我们的模型的目标是最大化下面的
$$\begin{split}f_{t} & = \log p_{\theta}(y_{t} | x_{\leq t}, z_{\leq t}) \\ & – \lambda D_{KL}[q_{\phi}(z_{t}|z_{<t},x_{\leq t},y_{t}|| p_{\theta}(z_{t}|z_{<t},x_{\leq t}))]\end{split}$$
而模型作为一个生成式的模型,对于最后的预测的正确率固然重要,不过合理的拟合出趋势也是一个要求,在这两个之间的权衡,文章之中使用了$v = [\alpha v^{*} , 1]$里的$\alpha$作为调节因素。
Comments
本文确实给深度模型横行,各种Trick和修补频繁出现的年代刮来了一股数学的清风(我反正好久没有看这么长篇累牍的数学了,惭愧惭愧)。文章的思想也非常的Neat,引入了KL散度作为一种类正则项的存在控制模型的生长,用尽各种方法充分的利用模型之中的信息,最后的一步的$\tilde{Y}$估计$y_{T}$的思路感觉也非常的数学,可以看出作者的数学功底还是非常扎实的。八卦一句,这个作者自己之前了解过,本科好像是商科(不知道是不是和俺一样的会计),却可以做出这么数学的文章的确是很羡慕了。自己如果非要找些提高的意见的话还是有的,就是在文章之后是仅仅用之前的信息推后面的信息,但是这里感觉训练的时候可以拓展一下,从前往后推完之后,可以随机的在其中取一个点,然后用这个来预测其他的,或者是用其他的来预测这个点,也就是说,把Skip-Gram和CBOW的训练的方法移植到这里来,这里的模型可能如果在语言模型之中就像是一个$(n-1)$Gram 模型。大家愚人节快luo!
Reference
Stock Movement Prediction from Tweets and Historical Prices
Comments
Leave a Comment