融合目标:技术指标(5个特征:开盘价、闭盘价、最低价、最高价、交易量)、情绪指标(3个特征积极、消极、分歧)。
技术指标:初始张量型状为:20,185,5。其中20为索引,因为是通过日期进行排序,所以也可表示为日期窗口,20天为一窗口,预测第21天的走势,他是通过随机预测天数的方法喂入数据,以此锻炼模型的泛化能力。比如随机初始化预测第233天的数据,则喂入的数据喂[233-rnn_length+1:233+1]的数据,即214到234(包含214不包含234,切片包含start,不包含end。)的20天作为时间窗口,去预测列表中第233个的数据即第234天的趋势(列表索引从0开始)。代码如下:
185对应股票个数,两个数据集分别获取了185个股票的数据和73个股票的数据。5为技术指标对应的5个指标,分别为开盘价、闭盘价、最高价、最低价、交易量。
情绪指标:初始张量为:20,185,3。20与185和技术指标一样,其中3为情绪指标对应的三个指标,分别为积极、消极、分歧。从代码中可以获取到y_train标签为0,1。可以判定为趋势预测,2分类任务。
特征融合:通过神经张量网络(TNT)进行张量融合,分别进行张量型状处理,首先情绪指标:因为技术指标和情绪指标一维、二维的大小相同,表示相同,故融合的目标为第三维度所表示的特征,首先记录情绪指标一、二维的型状,恢复形状的时候可以用到,代码如下:
合并一、二维度,保留第三维度,代码如下:
其中self.d_news即情绪指标的表示情绪的特征,也就是前面讲过的3,-1代表的是通过已知条件自动计算(除了已知维度剩下的相乘)此维度的型状这里自动计算的结果为20*185=3700。经过此类变换,前面的三维张量变为二位矩阵,即(3700,3)行为3700,列为3.这三个列即分别对应情绪的三个指标,行即对应他们的特征。继续改变型状以其满足模型的计算,代码如下:
首先利用transpose函数对news_transformed(情绪指标的矩阵)进行转置,型状改变为(3,3700)转置完成后利用unsqueeze函数在其第一维度前增加一层维度,型状改变为(1,3,3700)以其适应后续操作。将次张量喂入一维卷积层进行特征融合,代码如下:
这里的self.seq_transformation_news实例化对象为Conv1d,在实例化中定义了输入通道数即第一个参数d_news为3,输出通道数即第二个参数d_hidden,这里为10.代码如下:
在torch.nn框架下,Conv1d前馈传播需要获得的张量形状应为(样本数量,输入数据的通道数,每个样本的训练长度)。这也就是为什么前面需要将张量的形状处理为(1,3,3700)的原因。经过一维卷积层提取特征,输出的张量形状为(1,10,3700)。
上述代码表示为:改变形状,去除形状为1的维度,型状为(10,3700),然后再进行转置,型状为(3700,10).然后分解3700,使其返回成初始的型状,即(20,185,10),代码如下:
这里的t即为我们刚开始记录的第1维度的大小20,num_stocks记录的第二维特征185.d_hidden即为我们实例化Conv1d所设置的输出通道大小也就是为10,所以型状返回为(20,185,10)。技术指标与情绪指标相同,只不过在Conved实例化的时候,输入通道应该为5,因为他有5个输入特征(开盘价、闭盘价、最低价、最高价、交易量),输入型状为(1,5,3700)。输出通道同样为(1,10,3700),经过还原变换为(20,185,10).此时需要融合的两个指标张量型状一样。继续调整型状,为后续融合做准备。代码如下
对情绪指标第三维度新前加入长度为1的维度,张量型状改变为(20,185,1,10)。继续增加,代码如下:
情绪指标张量形状为(20,185,1,1,10)。对技术指标也在最后一维度后增加长度为1的维度,代码如下:
技术指标型状变为(20,185,10,1),将情绪指标的张量与参数权重进行相乘,代码如下:
其中self.tensorGraph的张量型状为(185,10,10,10),matmul函数即张量乘法,它可以进行不同维度的乘法相乘,例如这里的维度乘法就是为(20,185,1,1,10)和(20,185,10,1)进行相乘,但需要保证的是两个张量他的最后两维度也就是(1,10)和(10,1)必须符合矩阵乘法运算,因为他是首先从最后两个维度所构成的矩阵进行乘法运算的这也就是为什么需要给他扩充两个长度为1 的维度原因。计算完成后,通过squeeze函数去掉长度为1的维度,最后输出型状为(20,185,10,10)。然后再利用次输出的型状与技术指标张量相乘,代码如下:
输出的向量为:(20,185,10).前面相乘的步骤即为论文中公式5的前半部分。公式如下:
但是有一个问题,这里的p代表的是技术指标,q代表的是情绪指标。他这里是技术指标乘以权重参数后再乘以情绪指标,但是代码中是情绪指标乘以权重参数再乘以技术指标,具有一点差异。然后根据公式将技术指标和情绪指标沿着最后一维进行拼接,代码如下:
得到的拼接张量型状为(20,185,20),然后再乘以参数矩阵,其中参数矩阵的型状为(185,20,10)代码如下:
得到的张量型状为(185,20,10)。最后按照公式将前面计算出的张量和此张量进行求和,并且与参数矩阵b也求和,其中参数b的型状为(185,10),得到最终融合向量后经过tanh()得到非线性输出,代码如下:
得到最终融合特征型状为(20,185,10)。注意求和之前需要对(185,20,10)进行一二维的向量转置,因为第一个输出向量型状为(20,185,10),参数矩阵的型状为(185,10),所以为了对应维度的大小必须相同,所以应改变为(20,185,10)后然后求和,否则会报错。
融合特征毕。