zl程序教程

您现在的位置是:首页 >  其他

当前栏目

因子挖掘:基于图神经网络与公司主营(附代码)

2023-03-15 23:19:28 时间

量化投资与机器学习微信公众号,是业内垂直于量化投资、对冲基金、Fintech、人工智能、大数据等领域的主流自媒体。公众号拥有来自公募、私募、券商、期货、银行、保险、高校等行业20W+关注者,连续2年被腾讯云+社区评选为“年度最佳作者”。

量化投资与机器学习公众号独家解读 量化投资与机器学公众号 QIML Insight——深度研读系列 是公众号今年全力打造的一档深度、前沿、高水准栏目。

公众号遴选了各大期刊前沿论文,按照理解和提炼的方式为读者呈现每篇论文最精华的部分。QIML希望大家能够读到可以成长的量化文章,愿与你共同进步!

本期遴选论文 标题:HIST: A Graph-based Framework for Stock Trend Forecasting via Mining Concept-Oriented Shared Information 作者:Wentao Xu, Weiqing Liu, Lewen Wang, Yingce Xia, Jiang Bian, Jian Yin, Tie-Yan Liu, Sun Yat-sen University, Microsoft Research

股票特征的拆分

股票市场的涨跌容易受到相关共同概念的影响,但在预定义的概念中,有时候并不能包含完全的信息,比如在某些概念数据中有些股票并不属于相关概念,但涨跌也受到了该概念的影响。有时候即使某只股票属于相关概念,但涨跌反而也没有受概念的影响。

同时预定义的概念并不能考虑到市场上所有存在的涨跌逻辑,可能市场中有一部分隐含概念也能影响股票收益。

作者提出了隐含概念的逻辑,并将股票的特征用以下三个部分来解释:

  • 市场存在的预定义概念包含的共有信息
  • 隐含概念包含的共有信息
  • 股票特质信

通过图神经网络及全连接层的组合,作者构建了一个HIST模型,该模型可以将以息进行剥离,并最终放入一个全连接的线性层进行股票收益的预测。并在最终的测试中取得的满意的效果。

HIST模型结构

输入

  • t 时间股票的特征
S^t = {s_1^t,s_2^t,...,s_n^t}
  • m 个预定义的概念
T_j,j in {1,2,...,m}

步骤

1、股票特征提取

第一步使用2层的GRU对股票原始特征(Alpha360因子)进行表征提取:

x_{i}^{t, 0}=mathrm{GRU}left(s_{i}^{t} ight)

以上 为股票i的因子, 为提取后的表征。则矩阵 为所有股票的表征(第i行为股票i的表征)。

2、股票特征分层处理

本文假设每个股票表征所包含的信息有以下三层组成:

  • 预定义概念相关的共有信息
  • 隐含概念相关的共有信息
  • 每只股票的特质信息

在本步骤中,主要是应用三个不同的模型对这三类信息进行分层提取,提取过程中主要采用了Doubly Residual的模型架构。

为了方便阐述,我们把以上三层不同的模型用模型0、1、2表示,每个股票i输入模型j的数据用 表示,经过模型j处理后,得到两个输出:

用于最后对于股票收益率的预测,其中最终用于预测的输入为: ;

用于从当前的 剥离掉的信息,并得到下一层模型的输入:

Module 0:预定义概念处理模块(Predefined concept module)

在这一步中,基于股票行业和概念属性构建了图神经网络模型。主要细分步骤如下:

  • 概念表征初始化

如下图3(a)表示,先把股票和对应概念(行业分类和主营业务)构建二分图(bipartite graph)。那么每个概念的表征的计算如等式(5)所示,其含义为:概念k的表征为该概念内所有股票表征的市值加权,以这个表征作为概念的初始化表征。

egin{array}{l} alpha_{k i}^{t, 0}=frac{c_{i}^{t}}{sum_{j in mathcal{N}_{k}^{t}} c_{j}^{t}} \ e_{k}^{t, 0}=sum_{i in mathcal{N}_{k}^{t}} alpha_{k i}^{t, 0} x_{i}^{t, 0} . end{array}
  • 概念表征修正

概念表征的修正主要为了解决以下两个问题:(1)预定义概念的信息缺失问题,有些股票跟概念的关联可能没呈现出来;(2)预定义概念的信息过剩问题,有些股票虽然跟概念有关联,但其实对股价影响不大。本文主要通过股票与概念的相似性解决这两个问题,如果一个股票与某个概念相似性很高,但在预定义概念中,这个股票与这个概念并没有相连,那就可以视为缺失的关联。反过来,如果股票与某个概念间相关度不高,但在预定义概念中两者相连,则这个关联是没有必要的。

其中,股票与表征的相关性计算采用Cosine相关性,并在后续步骤概念表征加总时,使用经Softmax归一化后的相关性作为权重,具体公式如下:

egin{array}{l} v_{k i}^{t, 0}=operatorname{Cosine}left(x_{i}^{t, 0}, e_{k}^{t, 0} ight)=frac{x_{i}^{t, 0} cdot e_{k}^{t, 0}}{left|x_{i}^{t, 0} ight| cdotleft|e_{k}^{t, 0} ight|} \ alpha_{k i}^{t, 1}=frac{exp left(v_{k i}^{t, 0} ight)}{sum_{j in mathcal{S}^{t}} exp left(v_{k j}^{t, 0} ight)} end{array}
  • 概念表征加总

最终在基于修正后的图结构计算每个概念的表征,并传入全连接层输出作为最终概念k的表征,其中选用了LeakyReLU作为激活函数:

e_{k}^{t, 1}=operatorname{LeakyReLU}left(W_{e}left(sum_{i in mathcal{S}^{t}} alpha_{k i}^{t, 1} x_{i}^{t, 0} ight)+b_{e} ight)
  • 预定义概念相关共有信息的剥离

在概念的表征修正后,重新计算股票与每个概念的相关性,并经Softmax归一化作为权重,其中 为股票i与概念k在t时间,归一化后的相关性:

egin{array}{l} v_{i k}^{t, 1}=operatorname{Cosine}left(x_{i}^{t, 0}, e_{k}^{t, 1} ight)=frac{x_{i}^{t, 0} cdot e_{k}^{t, 1}}{left|x_{i}^{t, 0} ight| cdotleft|e_{k}^{t, 1} ight|} \ eta_{i k}^{t}=frac{exp left(v_{i k}^{t, 1} ight)}{sum_{j in mathcal{G}^{t}} exp left(v_{i j}^{t, 1} ight)}, end{array}

接着,把股票i与所有概念k的表征加权总和,传入全连接层,输出作为股票i所包含的预定义概念的相关共有信息。

hat{s}_{i}^{t, 0}=operatorname{LeakyReLU}left(W_{s}^{0}left(sum_{k in mathcal{G}^{t}} eta_{i k}^{t} e_{k}^{t, 1} ight)+b_{s}^{0} ight)

最后,再把 传入两个全连接层,分别输入 ,:

egin{array}{l} hat{x}_{i}^{t, 0}=operatorname{LeakyReLU}left(W_{b}^{0} hat{s}_{i}^{t, 0}+b_{b}^{0} ight) \ hat{y}_{i}^{t, 0}=operatorname{LeakyReLU}left(W_{f}^{0} hat{s}_{i}^{t, 0}+b_{f}^{0} ight) end{array}

其中 作为下一个模型的输入。

Module 1:隐含概念处理模块(Hidden concept module)

在上面的模型钟提取了预定义概念相关的共有信息,这里我们进行隐含概念共有信息的提取,主要经历以下步骤:

  • 隐含概念表征初始化

假设隐含概念的数量与股票数量一致,都为n。并假设概念i的表征 为对应股票i的表征 。

  • 股票与隐含概念相似性计算

采用Cosine计算股票i与概念k,两两之间的相关性:

gamma_{k i}^{t, 0}=operatorname{Cosine}left(x_{i}^{t, 1}, u_{k}^{t, 0} ight)=frac{x_{i}^{t, 1} cdot u_{k}^{t, 0}}{left|x_{i}^{t, 1} ight| cdotleft|u_{k}^{t, 0} ight|}
  • 股票与隐含概念关联

将股票与相似度最高的概念进行连接(除了原先对应的概念,如股票1与概念1),如图4所示,股票1与概念2 进行了连续,而概念3没有股票与其连接,则把概念3删掉。然后再把每个股票原先对应的概念加回来,如图4(b)所示。

  • 计算隐含概念的表征

最后通过全连接层计算概念的表征:

u_{k}^{t, 1}=operatorname{LeakyReLU}left(W_{u}left(sum_{i in mathcal{M}_{k}^{t}} gamma_{k i}^{t, 0} x_{i}^{t, 1} ight)+b_{u} ight)

后续计算股票在隐含概念相关的共信息的步骤和以上Module 0的步骤一致。

Module 2:股票特质信息处理(Individual information module)

经过以上两个模型的信息剥离,每个股票都只包含里自身的特质信息,这些信息再经过一个全连接层输入为最后预测股票收益的信息:

hat{y}_{i}^{t, 2}=operatorname{LeakyReLU}left(W_{f}^{2} x_{i}^{t, 2}+b_{f}^{2} ight)

3、全连接神经网络层

以上三个Moudle的输出最终放到一个线性全连接层:

p_{i}^{t}=W_{p} y_{i}^{t}+b_{p}=W_{p}left(hat{y}_{i}^{t, 0}+hat{y}_{i}^{t, 1}+hat{y}_{i}^{t, 2} ight)+b_{p}

训练的目标函数为:

mathcal{L}=sum_{t in mathcal{T}} operatorname{MSE}left(p^{t}, d^{t} ight)=sum_{t in mathcal{T}} sum_{i in mathcal{S}^{t}} frac{left(p_{i}^{t}-d_{i}^{t} ight)^{2}}{left|mathcal{S}^{t} ight|}
p_{i}^{t}=W_{p} y_{i}^{t}+b_{p}=W_{p}left(hat{y}_{i}^{t, 0}+hat{y}_{i}^{t, 1}+hat{y}_{i}^{t, 2} ight)+b_{p}

实证效果

数据

  • 股票范围:中证100和沪深300
  • 股票特征(因子):基于Qlib计算的Alpha360特征
  • 时间跨度:2007-01-01至2020-12-31;其中2007-01-01至2014-12-31为训练集,2015-01-01至2016-12-31为验证集,2017-01-01至2020-12-31为测试集
  • 预定义概念数据:使用公司的行业数据及主营业务作为预定义的概念数据
  • 预测的目标:股票下一个交易日的收益率

Baseline模型

Baseline的模型细节参考原文

结果

在所有的模型钟,在两个股票池CSI100与CSI300钟,HIST模型的IC和RankIC都是最高的。比如在CSI300的测试中,RankIC达到了12.6%。

在考虑交易成本(买入万五,卖出万分之十五)的日度交易策略中,每日买入收益预测最高的前30只股票,在2017年到2020年,模型的累计收益为50%,是所有测试模型中收益最高的。

代码

作者开源了基于Pytorch的代码,非常简洁明了:

https://github.com/Wentao-Xu/HIST