摘要

股票市场是金融市场的重要组成部分,近些年来,股票市场蓬勃发展,股票价格预测和量化投资策略研究吸引了许多领域的研究学者。其中最近几年随着人工智能和机器学习的发展,学者们从传统的统计学模型迁移到了人工智能算法,尤其是在深度学习热潮掀起后,神经网络在股票价格预测和量化投资策略研究中取得了不错的效果。深度学习的目标是学习多层次的特征,通过组合低级特征构建抽象的高级特征,从而挖掘数据的分布式特征表示,基于此进行复杂的非线性建模,从而实现预测任务。其中 RNN 被人们广泛地应用在序列数据上面,如自然语言和语音。股票每天的股价,交易信息都是序列数据,因此之前有很多研究者,基于 RNN 来预测股票价格。由于基础的循环神经网络在层数过多的情况下,会出现梯度消失的问题,而 LSTM 的诞生,解决了此问题,之后出现了诸如 GRU,Peephole LSTM,BiLSTM 等 LSTM 的变体。但传统的股票预测模型有些并未考虑时间因素,有些仅考虑时间上的单向关系。因此,文中使用 BiLSTM 模型进行股票价格预测。从模型原理上来说,BiLSTM 模型充分利用了时间序列上向前,向后两个时间方向的上下文关系,并且避免了长时间序列上的梯度消失和梯度爆炸问题,能够更好地学习到对时间有长期依赖性的信息。

本文实验第一部分通过利用国内浦发银行和国外 IBM 的股票数据,分别建立了 LSTM,GRU,BiLSTM 的股票预测模型,通过比较这三种深度学习模型最后预测的结果,发现对于两个数据集都是 BiLSTM 模型优于其他模型,有更好的预测准确率。第二部分通过使用 A 股全市场的股票数据,并先使用 LightGBM 模型进行对 50 个因子的篮选,选出重要程度最高的 10 个因子。之后再用 BiLSTM 模型选取进行因子组合,建立量化投资策略,最后对该策略进行实证与回测,发现该策略优于市场基准指数,说明了 BiLSTM 模型在股票价格预测和量化投资的实际应用价值。

关键词:量化投资;深度学习;神经网络模型;多因子选股;BiLSTM

第一章 绪论

1.1 研究背景与意义

1.1.1 研究背景

从 1970 年逐渐兴起,量化投资进入各投资者的视野,一场新的革命就此拉开序幕,改变了从前被动管理和有效市场假说主导的投资组合管理局面。有效市场假说认为,在市场有效的前提下,股票价格能反映市场的所有信息,不存在超额收益。被动投资管理的投资理念是市场是有效的,更加注重资产类别,最常见的方法是购买指数基金并关注已发布指数的表现。而主动投资管理主要依赖于投资者对于市场和个股的主观判定,根据能够获取的公开数据,通过将数学模型应用于金融领域,对股票进行评判,从而构建投资组合获取收益。量化投资通过对大量历史数据进行统计处理,挖掘投资机会,规避主观因素,受到越来越多投资者的追捧。量化投资兴起以后,人们也逐渐利用各种技术来进行股票价格的预测,从而更好地建立量化投资策略。早期国内外学者采用统计学方法建模,来预测股票价格,如指数平均法,多元回归法,自回归平均移动模型等,但是由于股票市场受多种因素影响,同时数据量很大,导致股票预测难度很大,各种统计学模型预测效果并不令人满意。

近几年来,机器学习,深度学习和神经网络等相关技术不断发展,为股票价格预测和量化策略的构建提供了技术支持,不少学者通过随机森林法,神经网络,支持向量机和卷积神经网络等方法完成新的突破。股票市场足够的历史数据加之以多元的技术支撑,为股票价格预测和量化策略的构建提供了有利条件。

1.1.2 研究意义

从国家经济体系和金融市场的长远发展来看,对于股票价格预测模型和量化投资策略的研究必不可少。我国起步较晚,金融市场不够成熟,金融工具不够丰富,市场效率较低,但是近几年来国家逐渐放宽政策,大力建设金融市场,为量化投资的发展提供“温床”,发展量化投资及新兴金融技术可以提供我们国家金融市场弯道超车的机会。并且股票价格指数作为一项重要的经济指标,对于我国经济发展起着晴雨表的作用。

从个人投资者和机构投资者的角度来看,构建股票价格预测模型和量化投资策略模型提高了市场的有效性。个人投资者的专业知识不够完善,投资行为具有一定的盲目性,构建相关模型,为其提供参考,能够减少判断失误的概率,改变个人投资者在资本市场处于相对弱势的地位。并且对于机构投资者而言,理性客观的模型加之以个人经验的判断,提高了决策的正确性,为投资行为提供了新的方向。

综上,结合我国目前的发展现状,本文选取个股进行股票价格预测模型和 A 股全市场的股票进行量化策略研究有重要的现实研究意义。

1.2 研究综述

White(1988)$^{[1]}$ 使用 BP 神经网络来预测 IBM 股票的日收益率。然而,由于 BP 神经网络模型易受梯度爆炸的影响,导致模型无法收敛到全局最小值,从而无法实现准确的预测。

Kimoto(1990)$^{[2]}$ 使用模块化神经网络技术开发了一个用于东证股价指数(Tokyo Stock Exchange Prices Indexes,TOPIX)预测的系统。该系统不仅成功预测了东京证券交易所的 TOPIX,还通过基于预测结果的股票交易模拟,实现了一定程度的盈利。

G.Peter Zhang(2003)$^{[3]}$ 对差分整合移动平均自回归(Autoregressive Integrated Moving Average,ARIMA)模型和人工神经网络(Artificial Neural Network,ANN)模型在时间序列预测中的性能进行了对比研究。结果显示,ANN 模型在时间序列预测的精度上显著优于 ARIMA 模型。

Ryo Akita(2016)$^{[4]}$ 选取消费者物价指数、市盈率以及报纸上的各种事件作为特征,利用段落向量和 LSTM 网络构建了一个金融时间序列预测模型。通过东京证券交易所五十家上市公司的实际数据,验证了该模型在股票开盘价预测方面的有效性。

Kunihiro Miyazaki(2017)$^{[5]}$ 通过提取股票日线图像及每 30 分钟的股票价格数据,构建了一个针对东证核心 30 指数(Topix Core 30)及其成分股涨跌预测的模型。研究对比了多种模型,包括逻辑回归(Logistic Regression, LR)、随机森林(Random Forest, RF)、多层感知器(Multilayer Perceptron, MLP)、LSTM、CNN、PCA-CNN 和 CNN-LSTM。结果表明,LSTM 在预测性能上最优,CNN 表现一般,但结合 CNN 和 LSTM 的混合模型可以提升预测精度。

Taewook Kim(2019)$^{[6]}$ 提出了一个 LSTM-CNN 混合模型,用于结合股票价格时间序列与股票价格图像两种数据表示形式的特征,以预测 S&P 500 指数的股价。研究表明,LSTM-CNN 模型在股价预测方面优于单一模型,并且这种预测对于构建量化投资策略具有一定的实际意义。

1.3 论文的创新点

本文股票预测方面具有以下创新点:

  1. 分别选用国内 A 股上海浦东发展银行和国外美股 IBM 的数据进行研究,避免单一市场研究的局限性。并且传统的 BP 模型从未考虑时间因素,要么像 LSTM 模型考虑时间上的单向关系。因此,文中使用 BiLSTM 模型进行股票价格预测。从模型原理上来说,BiLSTM 模型充分利用了时间序列上向前,向后两个时间方向的上下文关系,并且避免了长时间序列上的梯度消失和梯度爆炸问题,能够更好地学习到对时间有长期依赖性的信息。实证过程中并与 LSTM 模型,GRU 模型进行对比,说明其能够提升预测准确率。
  2. 股票价格预测模型采用股票多特征进行训练,包括开盘价,闭盘价,最高价和交易量等特征,相对于单特征预测股票收盘价理论上更加精确,能更好地比较 LSTM,GRU 和 BiLSTM 对于股票的预测效果。

本文量化策略研究方面具有以下创新点:

  1. 未使用市面上已有的常见因子,使用自己通过遗传规划算法(Genetic Programming,GP)和人工数据挖掘得到的多个价量因子,并通过 LightGBM 模型进行对 50 个因子的筛选,选出重要程度最高的 10 个因子。
  2. 传统的量化投资模型一般用 LSTM 模型和 CNN 模型构建量化投资策略,本文使用 A 股全市场的数据,利用 BiLSTM 模型选取进行因子组合,建立量化投资策略,最后对该策略进行实证与回测,发现该策略优于市场基准指数(中证全指),说明了 BiLSTM 模型在股票价格预测和量化投资的实际应用价值。

1.4 论文研究框架

本文基于深度学习算法分别进行了股票价格预测和量化策略研究,本文的具体研究框架如 Fig. 1 所示:

Fig. 1. Research Framework.

Fig. 1. Research Framework.

本文具体研究框架内容如下:

第一章为绪论。本章首先对股票价格预测和量化策略研究的研究意义和研究背景进行了介绍。随后对研究现状进行了综述,然后说明了本文相比现有的研究的创新点,最后简要阐述了本文的研究框架。

第二章为相关理论基础。本章对本文研究中涉及到的深度学习模型和量化选股的基本理论进行了介绍。深度学习模型小节依次介绍了 RNN,LSTM,GRU 和 BiLSTM 这四个深度学习模型,其中重点介绍了 LSTM 模型的内部结构。量化选股理论小节依次介绍了均值-方差模型,资本资产定价模型,套利定价理论,多因子模型,Fama-French 三因子模型和五因子模型。本小节从各种金融理论和模型发展脉络中介绍了多因子量化选股的历程。

第三章为 LSTM,GRU 和 BiLSTM 在股票价格预测中比较研究。本章首先介绍了实验所用国内及国外股票的数据集,然后对于数据进行归一化和数据划分的预处理步骤。紧接着说明了本章所使用 LSTM,GRU 和 BiLSTM 这三个模型的网络结构,模型的编译和超参数设置,并进行了实验得到实验结果。最后对实验结果进行分析和本章小结。

第四章为基于 LightGBM-BiLSTM 的量化投资模型研究。本章首先大致介绍了实验步骤,然后分别介绍了实验所用的股票数据和因子数据。之后再对因子依次进行缺失值处理,去极值,因子标准化和因子中性化处理得到清洗后的因子。随后再利用 LightGBM 和 BiLSTM 分别进行因子选择和因子组合,最后根据得到的模型进行量化策略构建,并对量化策略进行回测。

第五章为总结与展望。本章对于本文关于股票价格预测与量化投资策略的主要研究内容进行了总结,之后针对目前研究所存在的不足,对未来研究的方向进行了展望。

第二章 相关理论基础

2.1 深度学习模型

2.1.1 RNN

循环神经网络(Recurrent Neural Network,RNN)被人们广泛地应用在序列数据上面,如自然语言和语音。股票每天的股价和交易信息都是序列数据,因此之前有很多工作,基于 RNN 来预测股票价格。RNN 采用十分简单的重复模块的链式结构,例如单个 tanh 层。由于基础的循环神经网络在层数过多的情况下,会出现梯度消失的问题,而 LSTM 的诞生,解决了此问题。Fig. 2 是 RNN 结构图。

Fig. 2. RNN Structure Diagram. (Image source: Understanding LSTM Networks)

Fig. 2. RNN Structure Diagram. (Image source: Understanding LSTM Networks)

2.1.2 LSTM

长短时记忆网络(Long Short-Term Memory,LSTM)是一种特殊的 RNN,能够学习长期依赖关系。它们是由 Hochreiter & Schmidhuber(1997)$^{[7]}$ 提出的,并在随后的工作中被许多人改进和推广。由于独特的设计结构,LSTM 有着间隙长度相对不敏感的特点,并且解决了传统 RNN 的梯度消失和梯度爆炸的问题。相对于传统 RNN 和隐马尔可夫模型(Hidden Markov Model,HMM)等其他时间序列模型,LSTM 能更好地处理和预测时间序列中间隔和延迟非常长的重要事件。因此,LSTM 广泛应用在机器翻译和语音识别的领域。

LSTM 被明确设计为避免长期依赖问题。所有的递归神经网络都具有神经网络的重复模块链的形式,而 LSTM 对 RNN 的结构进行了改进。LSTM 并没有采用单一神经网络层,而是采用一种特殊的方式进行交互的四层结构。

Fig. 3. LSTM Structure Diagram 1. (Image source: Understanding LSTM Networks)

Fig. 3. LSTM Structure Diagram 1. (Image source: Understanding LSTM Networks)

Fig. 4. LSTM Structure Diagram 2. (Image source: Understanding LSTM Networks)

Fig. 4. LSTM Structure Diagram 2. (Image source: Understanding LSTM Networks)

如 Fig.3 所示,黑线用来表示传输一个节点的输出向量到另一个节点的输入向量。神经网络层(Neural network layer)是带有 $\sigma$ 激活函数或者 tanh 激活函数的处理模块;逐点运算(Pointwise operation)是代表向量与向量之间进行点乘运算;向量传输(Vector transfer)是表示信息传递方向;汇合(Concatenate)和复制(Copy)分别用两个黑线合在一起和两个黑线分开来表示信息的汇合和信息的复制。

下面我们以 LSTM 为例,进行其结构详细的说明。

  1. 遗忘门(forget gate)
Fig. 5. Forget Gate Calculation (Image source: Understanding LSTM Networks)

Fig. 5. Forget Gate Calculation (Image source: Understanding LSTM Networks)

$$ f_{t} = \sigma\left(W_{f} \cdot \left[h_{t-1}, x_{t}\right] + b_{f}\right) $$

参数说明:

  • $h_{t-1}$ :前一时刻的输出
  • $x_{t}$ :当前时刻的输入
  • $\sigma$ :sigmoid 激活函数
  • $W_{f}$ :遗忘门的权重矩阵
  • $b_{f}$ :遗忘门的偏差向量参数

第一步如 Fig.5 所示,是一个决定从细胞状态中丢弃的信息的过程。该过程由 sigmoid 函数计算得到 $f_{t}$ 的值($f_{t}$ 的范围在 0 到 1 之间,其中 0 代表完全不通过,1 代表完全通过)来决定细胞状态 $C_{t-1}$ 通过或者部分通过。

  1. 输入门(input gate)
Fig. 6. Input Gate Calculation (Image source: Understanding LSTM Networks)

Fig. 6. Input Gate Calculation (Image source: Understanding LSTM Networks)

$$ \begin{aligned} i_{t} &= \sigma\left(W_{i} \cdot \left[h_{t-1}, x_{t}\right] + b_{i}\right) \\ \tilde{C}_{t} &= \tanh\left(W_{C} \cdot \left[h_{t-1}, x_{t}\right] + b_{C}\right) \end{aligned} $$

参数说明:

  • $h_{t-1}$ :前一时刻的输出
  • $x_{t}$ :当前时刻的输入
  • $\sigma$ :sigmoid 激活函数
  • $W_{i}$ :输入门的权重矩阵
  • $b_{i}$ :输入门的偏差向量参数
  • $W_{C}$ :细胞状态的权重矩阵
  • $b_{C}$ :细胞状态的偏差向量参数
  • $\tanh$ :tanh 激活函数

第二步如 Fig.6 所示,通过 sigmoid 函数计算我们要在细胞状态中存储什么信息,接下来通过一个 $\tanh$ 层创建候选向量 $\tilde{C}_{t}$,该向量将会被加到细胞的状态中。

Fig. 7. Current Cell State Calculation (Image source: Understanding LSTM Networks)

Fig. 7. Current Cell State Calculation (Image source: Understanding LSTM Networks)

$$ C_{t} = f_{t} * C_{t-1} + i_{t} * \tilde{C}_{t} $$

参数说明:

  • $C_{t-1}$ :上一时刻的细胞状态
  • $\tilde{C}_{t}$ :临时细胞状态
  • $i_{t}$ :输入门的值
  • $f_{t}$ :遗忘门的值

第三步如 Fig.7 所示,当前时刻的细胞状态 $C_t$ 通过结合遗忘门和输入门的作用计算得到。

  • 遗忘门 $f_t$ 对上一时刻的细胞状态 $C_{t-1}$ 进行加权,以丢弃不需要的信息。
  • 输入门 $i_t$ 对候选细胞状态 $\tilde{C}_t$ 进行加权,决定引入多少新信息。
    最终,两个部分相加,更新得出当前时刻的细胞状态 $C_t$。
  1. 输出门(output gate)
Fig. 8. Output Gate Calculation (Image source: Understanding LSTM Networks)

Fig. 8. Output Gate Calculation (Image source: Understanding LSTM Networks)

$$ \begin{aligned} o_{t} &= \sigma\left(W_{o} \cdot \left[h_{t-1}, x_{t}\right] + b_{o}\right) \\ h_{t} &= o_{t} * \tanh\left(C_{t}\right) \end{aligned} $$

参数说明:

  • $o_{t}$ :输出门的值
  • $\sigma$ :sigmoid 激活函数
  • $W_{o}$ :输出门的权重矩阵
  • $h_{t-1}$ :前一时刻的输出
  • $x_{t}$ :当前时刻的输入
  • $b_{o}$ :输出门的偏差向量参数
  • $h_{t}$ :当前时刻的输出
  • $\tanh$ :tanh 激活函数
  • $C_{t}$ :当前时刻的细胞状态

第四步如 Fig.8 所示,使用 sigmoid 函数计算输出门的值,最后通过 tanh 激活函数将这一时刻的细胞状态 $C_{t}$ 进行处理并与输出门的值 $o_{t}$ 相乘得到当前时刻的输出 $h_{t}$。

2.1.3 GRU

K. Cho(2014)$^{[8]}$ 提出了门控循环单元(Gated Recurrent Unit,GRU)。GRU 主要是在 LSTM 的基础上进行了简化和调整,将 LSTM 原有的遗忘门、输入门和输出门合并为更新门(update gate)和重置门(reset gate)。此外,GRU 还将细胞状态与隐藏状态合并,从而减少了模型的复杂性,同时在某些任务中仍能够达到与 LSTM 相当的性能。

该模型在训练数据集比较大的情况下可以节省很多时间,在某些较小和较不频繁的数据集上表现出更好的性能$^{[9][10]}$。

Fig. 9. GRU Structure Diagram (Image source: Understanding LSTM Networks)

Fig. 9. GRU Structure Diagram (Image source: Understanding LSTM Networks)

$$ \begin{aligned} z_{t} &= \sigma\left(W_{z} \cdot \left[h_{t-1}, x_{t}\right]\right) \\ r_{t} &= \sigma\left(W_{r} \cdot \left[h_{t-1}, x_{t}\right]\right) \\ \tilde{h}_{t} &= \tanh\left(W \cdot \left[r_{t} * h_{t-1}, x_{t}\right]\right) \\ h_{t} &= \left(1 - z_{t}\right) * h_{t-1} + z_{t} * \tilde{h}_{t} \end{aligned} $$

参数说明:

  • $z_{t}$ :更新门的值
  • $r_{t}$ :重置门的值
  • $W_{z}$ :更新门的权重矩阵
  • $W_{r}$ :重置门的权重矩阵
  • $\tilde{h}_{t}$ :临时的输出

2.1.4 BiLSTM

双向长短时记忆网络(Bidirectional Long Short-Term Memory,BiLSTM)是由前向的 LSTM 与后向的 LSTM 结合成的。BiLSTM 模型充分利用了时间序列上向前,向后两个时间方向的上下文关系,能够学习到对时间有长期依赖性的信息,与单向 LSTM 相比可以更好地考虑未来数据的反向影响。Fig. 10 是 BiLSTM 结构图。

Fig. 10. BiLSTM Structure Diagram. (Image source: Baeldung)

Fig. 10. BiLSTM Structure Diagram. (Image source: Baeldung)

2.2 量化选股理论

2.2.1 均值-方差模型

量化选股策略起源于 20 世纪 50 年代,Markowitz(1952)$^{[11]}$ 提出了均值-方差模型(Mean-Variance Model)。该模型不仅奠定了现代投资组合理论的基础,将投资风险量化,还建立了一个描述风险和预期收益率的具体模型。它打破了以往仅对投资组合进行定性分析而缺乏定量分析的局面,将数学模型成功引入金融投资领域。

$$ \begin{aligned} \mathrm{E}\left(R_{p}\right) &= \sum_{i=1}^{n} w_{i} \mathrm{E}\left(R_{i}\right) \\ \sigma_{p}^{2} &= \sum_{i=1}^{n} \sum_{j=1}^{n} w_{i} w_{j} \operatorname{Cov}\left(R_{i}, R_{j}\right) = \sum_{i=1}^{n} \sum_{j=1}^{n} w_{i} w_{j} \sigma_{i} \sigma_{j} \rho_{ij} \\ \sigma_{i} &= \sqrt{\operatorname{Var}\left(R_{i}\right)}, \quad \rho_{ij} = \operatorname{Corr}\left(R_{i}, R_{j}\right) \end{aligned} $$$$ \min \sigma_{p}^{2} \quad \text{subject to} \quad \sum_{i=1}^{n} \mathrm{E}\left(R_{i}\right) w_{i} = \mu_{p}, \quad \sum_{i=1}^{n} w_{i} = 1 $$$$ \begin{aligned} \Omega &= \begin{pmatrix} \sigma_{11} & \cdots & \sigma_{1n} \\ \vdots & \ddots & \vdots \\ \sigma_{n1} & \cdots & \sigma_{nn} \end{pmatrix} = \begin{pmatrix} \operatorname{Var}\left(R_{1}\right) & \cdots & \operatorname{Cov}\left(R_{1}, R_{n}\right) \\ \vdots & \ddots & \vdots \\ \operatorname{Cov}\left(R_{n}, R_{1}\right) & \cdots & \operatorname{Var}\left(R_{n}\right) \end{pmatrix} \\ \Omega^{-1} &= \begin{pmatrix} v_{11} & \cdots & v_{1n} \\ \vdots & \ddots & \vdots \\ v_{n1} & \cdots & v_{nn} \end{pmatrix} \\ w_{i} &= \frac{1}{D}\left(\mu_{p} \sum_{j=1}^{n} v_{ij}\left(C \mathrm{E}\left(R_{j}\right) - A\right) + \sum_{j=1}^{n} v_{ij}\left(B - A \mathrm{E}\left(R_{j}\right)\right)\right), \quad i = 1, \ldots, n \end{aligned} $$$$ \begin{aligned} A &= \sum_{i=1}^{n} \sum_{j=1}^{n} v_{ij} \mathrm{E}\left(R_{j}\right), \quad B = \sum_{i=1}^{n} \sum_{j=1}^{n} v_{ij} \mathrm{E}\left(R_{i}\right) \mathrm{E}\left(R_{j}\right), \quad C = \sum_{i=1}^{n} \sum_{j=1}^{n} v_{ij}, \quad D = BC - A^{2} > 0 \\ \sigma_{p}^{2} &= \frac{C \mu_{p}^{2} - 2A \mu_{p} + B}{D} \end{aligned} $$

其中:

  • $\mathrm{E}\left(R_{p}\right)$ 和 $\mu_{p}$ 是投资组合 $p$ 的预期收益率
  • $\mathrm{E}\left(R_{i}\right)$ 是资产 $i$ 的预期收益率
  • $\sigma_{i}$ 是资产 $i$ 的标准差
  • $\sigma_{j}$ 是资产 $j$ 的标准差
  • $w_{i}$ 是资产 $i$ 在投资组合中的比例
  • $\sigma_{p}^{2}$ 是投资组合 $p$ 的方差
  • $\rho_{ij}$ 是资产 $i$ 和资产 $j$ 之间的相关系数

通过以上公式$^{[12]}$,我们可以构建投资组合,来让我们的投资组合在一定的期望收益率的条件下,非系统风险降低到最小。

2.2.2 资本资产定价模型

William Sharpe(1964)$^{[13]}$、John Lintner(1965)$^{[14]}$ 和 Jan Mossin(1966)$^{[15]}$ 提出了资本资产定价模型(Capital Asset Pricing Model,CAPM)。该模型认为,一项资产的预期收益与该资产的风险度量 $\beta$ 值相关。这一模型通过简单的线性关系,将资产的预期收益率与市场风险联系起来,使得 Markowitz(1952)$^{[11]}$ 的投资组合选择理论更贴近现实世界,同时为多因子选股模型的建立奠定了理论基础。

根据资本资产定价模型,对于一个给定的资产 $i$,它的预期收益率和市场投资组合的预期收益率之间的关系可以表示为:

$$ E\left(r_{i}\right) = r_{f} + \beta_{im}\left[E\left(r_{m}\right) - r_{f}\right] $$

其中:

  • $E\left(r_{i}\right)$ 是资产 $i$ 的预期收益率
  • $r_{f}$ 是无风险利率
  • $\beta_{im}$(Beta)是资产 $i$ 的系统性风险系数,$\beta_{im} = \frac{\operatorname{Cov}\left(r_{i}, r_{m}\right)}{\operatorname{Var}\left(r_{m}\right)}$
  • $E\left(r_{m}\right)$ 是市场投资组合 $m$ 的预期收益率
  • $E\left(r_{m}\right) - r_{f}$ 是市场风险溢价

2.2.3 套利定价理论和多因子模型

Ross(1976)$^{[16]}$ 提出了套利定价理论(Arbitrage Pricing Theory,APT)。该理论认为,套利行为是形成市场均衡价格的决定性因素,通过在收益率形成过程中引入一系列因子构建线性相关关系,克服了资本资产定价模型(CAPM)的局限性,为后续研究者提供了重要的理论指导。

套利定价理论被认为是多因子模型(Multiple-Factor Model,MFM)的理论基础,是资产价格模型的重要组成部分,也是资产价格理论的基石之一。多因子模型的一般表达形式为:

$$ r_{j} = a_{j} + \lambda_{j1} f_{1} + \lambda_{j2} f_{2} + \cdots + \lambda_{jn} f_{n} + \delta_{j} $$

其中:

  • $r_{j}$ 是资产 $j$ 的收益率
  • $a_{j}$ 是资产 $j$ 的常数
  • $f_{n}$ 是系统性因素
  • $\lambda_{jn}$ 是因子载荷
  • $\delta_{j}$ 是随机误差

2.2.4 Fama-French 三因子模型和五因子模型

Fama(1992)和 French(1992)$^{[17]}$ 使用横截面回归与时间序列结合的方法发现,股票市场的 $\beta$ 值无法解释不同股票回报率的差异,而上市公司的市值、账面市值比和市盈率等可以显著解释股票回报率的差异。他们认为超额收益是对 CAPM 中 $\beta$ 未能反映的风险因素的补偿,由此提出了 Fama-French 三因子模型。这三个因子分别为:

  • 市场风险溢价因子(Market Risk Premium)

    • 表示市场整体的系统性风险,即市场投资组合的预期收益减去无风险利率的差值。
    • 衡量投资者承担系统性风险(即无法通过分散投资消除的风险)所期望的超额回报。
    • 计算公式为:
      $$ \text{Market Risk Premium} = E(R_m) - R_f $$ 其中 $E(R_m)$ 是市场的预期收益率,$R_f$ 是无风险利率。
  • 市值因子(Size, SMB: Small Minus Big)

    • 表示小市值股票与大市值股票之间的收益差异。
    • 小市值股票通常风险更高,但历史数据显示,其预期收益也往往高于大市值股票。
    • 计算公式为:
      $$ SMB = R_{\text{Small}} - R_{\text{Big}} $$ 反映了市场对小市值股票的额外风险溢价的补偿。
  • 账面市值比因子(Value, HML: High Minus Low)

    • 反映高账面市值比(即“价值型股票”)与低账面市值比(即“成长型股票”)之间的收益差异。
    • 高账面市值比的股票通常定价较低(被市场低估),但长期来看可能获得较高回报。
    • 计算公式为:
      $$ HML = R_{\text{High}} - R_{\text{Low}} $$ 低账面市值比的股票可能因市场对其过于乐观的预期而被高估。

该模型将 APT 模型中的因子具体化,并得出结论:投资小市值、高成长的股票具有高风险高收益的特性。Fama-French 三因子模型被广泛应用于现代投资行为的分析和实践中。

随后,Fama(2015)和 French(2015)$^{[18]}$ 对三因子模型进行了扩展,新增了以下两个因子:

  • 盈利水平因子(Profitability, RMW: Robust Minus Weak)

    • 反映高盈利公司与低盈利公司之间的收益差异。
    • 盈利能力强的公司(高 ROE、净利润率)更可能提供稳定且较高的回报。
    • 计算公式为:
      $$ RMW = R_{\text{Robust}} - R_{\text{Weak}} $$
  • 投资水平因子(Investment, CMA: Conservative Minus Aggressive)

    • 反映保守型投资公司与激进型投资公司之间的收益差异。
    • 激进型公司(扩张迅速,资本开支较高)通常伴随着更大的经营风险,而保守型公司(资本支出相对稳健)表现出更高的稳定性和收益。
    • 计算公式为:
      $$ CMA = R_{\text{Conservative}} - R_{\text{Aggressive}} $$

Fama-French 三因子模型公式为:

$$ R_i - R_f = \alpha_i + \beta_{i,m} \cdot (R_m - R_f) + \beta_{i,SMB} \cdot SMB + \beta_{i,HML} \cdot HML + \epsilon_i $$

Fama-French 五因子模型公式为:

$$ R_i - R_f = \alpha_i + \beta_{i,m} \cdot (R_m - R_f) + \beta_{i,SMB} \cdot SMB + \beta_{i,HML} \cdot HML + \beta_{i,RMW} \cdot RMW + \beta_{i,CMA} \cdot CMA + \epsilon_i $$

其中:

  • $R_i$: 股票 $i$ 的预期收益率
  • $R_f$: 无风险收益率
  • $R_m$: 市场组合的预期收益率
  • $R_m - R_f$: 市场风险溢价因子
  • $SMB$: 小市值减去大市值股票收益
  • $HML$: 高账面市值比减去低账面市值比股票收益
  • $RMW$: 高盈利能力减去低盈利能力股票收益
  • $CMA$: 低投资活动减去高投资活动股票收益
  • $\beta_{i,*}$: 股票 $i$ 对应因子的敏感度
  • $\epsilon_i$: 回归残差

2.2.5 模型对比表格

以下表格总结了 均值-方差模型资本资产定价模型 (CAPM)套利定价理论 (APT)Fama-French 模型 的核心内容及因子来源:

模型核心内容因子来源
均值-方差模型投资组合理论的基础,通过期望收益和协方差矩阵优化投资组合。投资组合中资产的期望收益和协方差矩阵
资本资产定价模型 (CAPM)通过市场风险因子($\beta$)解释资产收益,奠定多因子模型理论基础。市场因子 $\beta$
套利定价理论 (APT)多因子框架,允许多个经济变量解释资产收益,例如通胀率、利率等。多因子(宏观经济变量,如通胀率、利率等)
Fama-French 三因子模型增加市值因子和账面市值比因子,改进对资产收益的解释能力。市场因子、SMB(市值因子)、HML(账面市值比因子)
Fama-French 五因子模型在三因子模型基础上增加盈利因子和投资因子,进一步完善资产定价模型。市场因子、SMB、HML、RMW(盈利因子)、CMA(投资因子)

以下表格总结了这些模型的优点及不足:

模型优点不足
均值-方差模型提供了系统化投资组合优化方法,奠定现代投资理论基础。仅针对收益和方差进行优化,未明确风险补偿的来源。
资本资产定价模型 (CAPM)简单易用,通过市场风险解释收益差异,为多因子模型提供理论基础。假设单因子(市场风险)决定收益,忽略其他系统性风险因子。
套利定价理论 (APT)允许多个因子解释资产收益,减少对单因子假设的依赖,更灵活。未明确具体因子,实操性较低,仅提供框架。
Fama-French 三因子模型通过增加市值因子和账面市值比因子,显著提高了对资产收益的解释能力。忽略了盈利能力和投资行为等其他因子。
Fama-French 五因子模型在三因子模型基础上增加盈利因子和投资因子,更全面地捕捉影响资产收益的关键变量。模型复杂度较高,对数据要求高,仍可能遗漏某些潜在因子。

第三章 LSTM,GRU 和 BiLSTM 在股票价格预测中比较研究

3.1 实验数据介绍

国内外很多学者的研究以本国的股票指数为主,对于不同市场的单个股票研究相对较少。并且很少有研究将 LSTM、GRU、BiLSTM 这三个模型进行对比研究。因此本文分别选择国内 A 股上海浦东发展银行(简称浦发银行,代码600000)和美股 International Business Machines Corporation(简称 IBM)进行研究,这样更能准确地对我们使用的三个模型进行对比。其中浦发银行采用 2008 年 1 月 1 日到 2020 年 12 月 31 日的股票数据,共有 3114 条有效数据,数据来源于 Tushare 金融大数据平台。我们选取该数据集的日期(date)、开盘价(open)、收盘价(close)、最高价(high)、最低价(low)和成交量(volume)这 6 个特征进行实验。浦发银行的数据集除日期作为时间序列的索引以外,其他 5 个特征均作为自变量。IBM 采用 1990 年 1 月 2 日到 2018 年 11 月 15 日的股票数据,共有 7278 条有效数据,数据来源于雅虎财经。我们选取该数据集的日期(date)、开盘价(open)、最高价(high)、最低价(low)、收盘价(close)、调整后的收盘价(Adj Close)和成交量(volume)这 7 个特征进行实验。IBM 的数据集除日期作为时间序列的索引以外,其他 6 个特征均作为自变量。本次实验选择收盘价(close)作为被预测的变量。表3.1.1和表3.1.2分别是两个数据集的部分数据。

3.1.1 浦发银行数据集部分展示

dateopenclosehighlowvolumecode
2008-01-029.0079.1019.3568.805131583.90600000
2008-01-039.0078.6459.1018.426211346.56600000
2008-01-0486599.0099.1118.501139249.67600000
2008-01-078.9709.5159.5938.953228043.01600000
2008-01-089.5519.5839.7199.517161255.31600000
2008-01-099.5839.6639.7729.432102510.92600000
2008-01-109.7019.6809.8369.602217966.25600000
2008-01-119.67010.46710.5329.670231544.21600000
2008-01-1410.36710.05910.43310.027142918.39600000
2008-01-1510.14210.05110.38910.006161221.52600000

数据来源Tushare

3.1.2 IBM数据集部分展示

DateOpenHighLowCloseAdj CloseVolume
1990-01-0223.687524.531323.625024.50006.5907557041600
1990-01-0324.687524.875024.593824.71886.6495999464000
1990-01-0424.750025.093824.718825.00006.7252619674800
1990-01-0524.968825.406324.875024.93756.7084487570000
1990-01-0824.812525.218824.812525.09386.7504814625200
1990-01-0925.125025.312524.843824.84386.6832297048000
1990-01-1024.875025.000024.656324.75006.6580095945600
1990-01-1124.875025.093824.843824.96886.7168555905600
1990-01-1224.656324.812524.406324.46886.5823475390800
1990-01-1524.406324.593824.312524.53136.5991634035600

数据来源雅虎财经

3.2 实验数据预处理

3.2.1 数据的归一化

实验中各个特征在单位和量级上存在差异,比如股票价格和成交量之间量级差异巨大,会对我们实验最终预测的结果产生影响。因此我们采用 sklearn.preprocessing 库中的 MinMaxScaler 方法将数据的特征缩放至 0 到 1 之间。这样既能提升模型精度,也能提升模型收敛速度。归一化公式:

$$ x^{\prime}=\frac{x-\min (x)}{\max (x)-\min (x)} $$

其中 $x^{\prime}$ 是归一化后的数据,$x$ 是原始数据, $\min (x)$ 是原始数据集的最小值, $\max (x)$ 是原始数据集的最大值。之后在我们的实验过程中获得预测结果之后,还要将数据进行反归一化处理,之后才能进行对于股票价格的预测和模型评估。

3.2.2 数据的划分

此处分别将浦发银行和 IBM 的整个实验数据集送入,设置循环核时间步(timestep)都为 60,每个时间步输入特征个数分别为 5 和 6。这样可以输入前 60 个交易日的数据,预测出第 61 天的收盘价。使我们的数据集符合之后要比较的三种神经网络模型输入的要求,依次是送入样本数,循环核时间展开步数和每个时间步输入特征个数。之后我们再将浦发银行的数据集按照 2488:311:255 的比例将归一化的数据集划分为训练集,验证集,测试集三个部分。将 IBM 的数据集按照 6550:364:304 的比例将归一化的数据集划分为训练集,验证集,测试集三个部分。我们这里划分出验证集的目的是为了方便进行调整模型的超参数以便优化各个模型之后再进行比较。

3.3 模型网络结构

本文通过大量反复试验最终各个模型设置的网络结构如下表所示,其中层与层之间使用循环神经网络默认的 tanh 和 linear 作为激活函数,并且为了防止过拟合加入 Dropout,Dropout 的丢弃比例(rate)取值为 0.2。LSTM 和 GRU 每个循环层的神经元个数为 50,BiLSTM 循环层的神经元的个数为 100。LSTM、GRU、BiLSTM 每个模型分别采用四层 LSTM、GRU、BiLSTM 和一层全连接层,其中每层网络之间都设置了一个 Dropout。

3.3.1 IBM的LSTM网络结构

Layer(type)Output ShapeParam#
lstm_1 (LSTM)(None, 60, 50)11400
dropout_1 (Dropout)(None, 60, 50)0
lstm_2 (LSTM)(None, 60, 50)20200
dropout_2 (Dropout)(None, 60, 50)0
lstm_3 (LSTM)(None, 60, 50)20200
dropout_3 (Dropout)(None, 60, 50)0
lstm_4 (LSTM)(None, 50)20200
dropout_4 (Dropout)(None, 50)0
dense_1 (Dense)(None, 1)51

Total params:72,051
Trainable params:72,051
Non-trainable params:0


3.3.2 IBM的GRU网络结构

Layer(type)Output ShapeParam#
gru_1 (GRU)(None, 60, 50)8550
dropout_1 (Dropout)(None, 60, 50)0
gru_2 (GRU)(None, 60, 50)15150
dropout_2 (Dropout)(None, 60, 50)0
gru_3 (GRU)(None, 60, 50)15150
dropout_3 (Dropout)(None, 60, 50)0
gru_4 (GRU)(None, 50)15150
dropout_4 (Dropout)(None, 50)0
dense_1 (Dense)(None, 1)51

Total params:54,051
Trainable params:54,051
Non-trainable params:0


3.3.3 IBM的BiLSTM网络结构

Layer(type)Output ShapeParam#
bidirectional_1 (Bidirection)(None, 60, 100)22800
dropout_1 (Dropout)(None, 60, 100)0
bidirectional_2 (Bidirection)(None, 60, 100)60400
dropout_2 (Dropout)(None, 60, 100)0
bidirectional_3 (Bidirection)(None, 60, 100)60400
dropout_3 (Dropout)(None, 60, 100)0
bidirectional_4 (Bidirection)(None, 100)60400
dropout_4 (Dropout)(None, 100)0
dense_1 (Dense)(None, 1)101

Total params:204,101
Trainable params:204,101
Non-trainable params:0

3.4 模型和编译及超参数设置

本文模型在以验证集的损失函数最小为目标,进行不断的超参数调试之后,对于浦发银行的三个模型都选用 epochs=100batch_size=32;对于 IBM 的三个模型都选用 epochs=50batch_size=32。其中优化器都采用自适应矩估计(Adaptive moment estimation,Adam)$^{[19]}$。使用其 keras 包中的默认值,即 lr=0.001beta_1=0.9beta_2=0.999epsilon=1e-08decay=0.0。损失函数采用均方误差(Mean Square Error,MSE)。

参数解释:

  • lr:学习率
  • beta_1:一阶矩估计的指数衰减率
  • beta_2:二阶矩估计的指数衰减率
  • epsilon:模糊因子
  • decay:每次更新后的学习率衰减值

3.5 实验结果与分析

首先简单介绍一下模型使用评价的这几个指标。计算公式如下:

  1. 均方误差(Mean Square Error,MSE)
$$ M S E=\frac{1}{n} \sum_{i=1}^{n}\left(Y_{i}-\hat{Y}_{i}\right)^{2} $$
  1. 均方根误差(Root Mean Squared Error,RMSE)
$$ R M S E=\sqrt{\frac{1}{n} \sum_{i=1}^{n}\left(Y_{i}-\hat{Y}_{i}\right)^{2}} $$
  1. 平均绝对误差(Mean Absolute Error,MAE)
$$ M A E=\frac{1}{n} \sum_{i=1}^{n}\left|Y_{i}-\hat{Y}_{i}\right| $$
  1. \( R^2 \)(R Squared)
$$ \begin{gathered} \bar{Y}=\frac{1}{n} \sum_{i=1}^{n} Y_{i} \\ R^{2}=1-\frac{\sum_{i=1}^{n}\left(Y_{i}-\hat{Y}_{i}\right)^{2}}{\sum_{i=1}^{n}\left(Y_{i}-\bar{Y}\right)^{2}} \end{gathered} $$

其中:$n$ 是样本的数量,$Y$ 是股票实际的收盘价,$\hat{Y}_{i}$ 是股票预测的收盘价, $\bar{Y}$ 是股票平均的收盘价。MSE,RMSE 和 MAE 越小该模型越精确。 $R^{2}$ 评价模型系数拟合优度越大越好。

3.5.1 浦发银行实验结果

LSTMGRUBiLSTM
MSE0.0597810.0693230.056454
RMSE0.2445010.2632920.237601
MAE0.1865410.2026650.154289
R-squared0.917880.8962140.929643

比较三个模型的评价指标,我们可以发现在浦发银行测试集上 BiLSTM 模型的 MSE、RMSE 和 MAE 都小于 LSTM 模型和 GRU 模型,而 R-Squared 都大于 LSTM 模型和 GRU 模型。我们通过对比 RMSE 发现,BiLSTM 相较于 LSTM 在验证集上有 2.90%的性能提升,BiLSTM 相较于 GRU 在验证集上有 10.81%的性能提升。

3.5.2 IBM实验结果

LSTMGRUBiLSTM
MSE18.0131112.93858411.057501
RMSE4.2441863.5970243.325282
MAE3.7932233.0690332.732075
R-squared0.7894530.8519390.883334

比较三个模型的评价指标,我们可以发现在 IBM 测试集上 BiLSTM 模型的 MSE、RMSE 和 MAE 都小于 LSTM 模型和 GRU 模型,而 R-Squared 都大于 LSTM 模型和 GRU 模型。我们通过对比 RMSE 发现,BiLSTM 相较于 LSTM 在验证集上有 27.63%的性能提升,BiLSTM 相较于 GRU 在验证集上有 8.17%的性能提升。

3.6 本章小结

本章先是介绍了实验所选用的浦发银行和 IBM 两个数据集以及选用的特征,之后对数据集进行了归一化、数据划分的预处理步骤。同时详细的说明了实验所使用 LSTM、GRU 和 BiLSTM 模型的网络结构和超参数。最后得到了每个模型的损失函数图像和一系列的拟合图形。比较了模型的多个评价指标和拟合图像最终得到 BiLSTM 模型能够更好地对股票价格进行预测,为我们下一章研究 LightGBM-BiLSTM 的量化投资策略奠定了基础。


第四章 基于 LightGBM-BiLSTM 的量化投资模型研究

4.1 实验步骤

Fig. 11. LightGBM-BiLSTM Diagram.

Fig. 11. LightGBM-BiLSTM Diagram.

如 Fig.11 所示,本实验先从因子库中选取 50 个因子。之后对因子依次进行去极值、标准化和缺损值填充的因子清洗步骤。再利用 LightGBM 模型进行因子选择,根据因子重要性进行排序得到前十的因子作为本横截面挑选出来的因子。紧接着使用 BiLSTM 建立多因子模型,最后再进行回测分析。

4.2 实验数据

本文采用的行情数据来源于 Tushare。具体数据集的特征如下表所示。

4.2.1 股票数据集包含的特征

名称类型描述
ts_codestr股票代码
trade_datestr交易日期
openfloat开盘价
highfloat最高价
lowfloat最低价
closefloat收盘价
pre_closefloat昨收价
changefloat涨跌额
pct_chgfloat涨跌幅(未复权)
volfloat成交量(手)
amountfloat成交额(千元)

A股全市场日线数据集包含5,872,309行数据,即包含5,872,309个样本。如表4.2.1所示,A股全市场日线数据集数据集有以下11个特征,分别依次为股票代码(ts_code)、交易日期(trade_date)、开盘价(open)、最高价(high)、最低价(low)、收盘价(close)、昨收价(pre_close)、涨跌额(change)、换手率(turnover_rate)、交易金额(amount)、总市值(total_mv)和复权因子(adj_factor)。

4.2.2 A股全市场日线数据集部分展示

ts_codetrade_dateopenhighlowclosepre_closechangevolamount
600613.SH201201048.208.207.847.868.16-0.304762.983854.1000
600690.SH201201049.009.178.788.788.93-0.15142288.41127992.6050
300277.SZ2012010422.9022.9820.8120.8822.68-1.8012212.3926797.1370
002403.SZ201201048.878.908.408.408.84-0.44110331.979013.4317
300179.SZ2012010419.9920.3219.2019.5019.96-0.461532.313008.0594
600000.SH201201048.548.568.398.418.49-0.08342013.79290229.5510
300282.SZ2012010422.9023.3321.0221.0223.35-2.3338408.6086216.2356
002319.SZ201201049.749.959.389.419.73-0.324809.744671.4803
601991.SH201201045.175.395.125.255.160.09145268.3876547.7490
000780.SZ2012010410.4210.4910.0010.0010.30-0.3020362.3020830.1761

[5872309 rows x 11 columns]

中证全指日线数据集包含5,057行数据,即包含5,057个样本。如表4.2.2所示,中证全指日线数据集有以下7个特征,分别依次为交易日期(trade_date)、开盘价(open)、最高价(high)、最低价(low)、收盘价(close)、交易量(volume)和昨收价(pre_close)。

4.2.3 中证全指日线数据集部分展示

trade_dateopenhighlowclosevolumepre_close
2006-11-241564.35601579.34701549.97901576.15307.521819e+091567.0910
2006-11-271574.11301598.74401574.11301598.74407.212786e+091581.1530
2006-11-281597.72001604.71901585.36201596.84007.025637e+091598.7440
2006-11-291575.30301620.28701575.30301617.98807.250354e+091596.8400
2006-11-301621.42801657.32301621.42801657.32309.656888e+091617.9880
2020-11-115477.88705493.58675422.91105425.80175.604086e+105494.1042
2020-11-125439.22965454.34525413.96595435.13794.594251e+105425.8017
2020-11-135418.29535418.35235364.20315402.77024.688916e+105435.1379
2020-11-165422.35655456.72645391.92325456.72645.593672e+105402.7702
2020-11-175454.06965454.06965395.60525428.07655.857009e+105456.7264

[5057 rows x 7 columns]

下表4.2.4是原始的因子部分数据。依次经过上述因子缺失值填充、因子去极值、因子标准化和因子中性化这 4 个因子清洗的步骤后,得到如表4.2.5展示的经过因子清洗后的因子部分数据。

4.2.4 原始的因子数据

trade_datesec_coderetfactor_0factor_1factor_2factor_3factor_4factor_5factor_6
2005-01-04600874.SH0.001684NaN9.4454129.4454129.445408-1.00NaN12651.124023
2005-01-04000411.SZ0.021073NaN5.9712625.9712625.9713130.38NaN392.124298
2005-01-04000979.SZ0.021207NaN6.7689186.7689186.768815-1.45NaN870.587585
2005-01-04000498.SZ0.030220NaN8.8527528.8527528.8527550.55NaN6994.011719
2005-01-04600631.SH0.015699NaN9.5898979.5898979.589889-1.70NaN14616.806641

4.2.5 清洗后的因子数据

sec_codetrade_dateretfactor_0factor_1factor_2factor_3factor_4factor_5factor_6
000001.SZ2005-01-04-1.586530.015451.383061.383061.383060.133920.015451.38564
000002.SZ2005-01-041.36761-0.448141.697281.697281.697281.04567-0.448141.69728
000004.SZ2005-01-040.32966-1.41654-0.13907-0.13907-0.13907-0.34769-1.41654-0.13650
000005.SZ2005-01-040.61297-1.130661.053391.053391.05339-1.20020-1.130661.05597
000006.SZ2005-01-04-0.355421.67667-0.07726-0.07726-0.077261.558201.67667-0.07469

4.2.6 因子数据

  • 价量因子构建

本文使用如下方式构建价量因子,构建价量因子的基础要素有两点:首先是基础字段,其次是算子。如表4.2.1 所示,基础字段包括日频的最高价(high),最低价(low),开盘价(open),收盘价(close),上一日收盘价(pre_close),成交量(vol),涨跌(pct_chg),换手率(turnover_rate),交易金额(amount),总市值(total_mv)和复权因子(adj_factor)。

4.2.7 基础字段表

编号字段名意义
high最高价当日成交订单中最高的价格
low最低价当日成交订单中最低的价格
open开盘价当日集合竞价成交的价格
close收盘价当日最后一笔成交订单的价格
pre_close上一日收盘价上一日最后一笔成交订单的价格
vol成交全天成交的股票数
pct_chg涨跌本日证券涨跌
turnover_rate换手率本日证券的换手率
amount成交金额全天成交的金额
total_mv总市值总股本数乘以当时股价得出的股票总价值
adj_factor复权因子权息修复比例

本文通过 gplearn提供的基础算子集和自己定义的一些特殊算子,得到如表所示的算子列表。

4.2.8 算子列表

算子名称定义
add(x, y)\( x + y\);点运算
\(\operatorname{div}(x, y)\)\( x / y\);点运算
\(\operatorname{mul}(x, y)\)\( x \cdot y\);点运算
\(\operatorname{sub}(x, y)\)\( x - y\);点运算
neg(x)\(-x\);点运算
\(\log(x)\)对数\(\log(x)\);点运算
max(x, y)最大值\(x, y\) 中数值较大的数;点运算
\(\min(x, y)\)最小值\(x, y\) 中数值较小的数;点运算
delta_d(x)d 日差值当日的 \(x\) 值减去 d 日前的 \(x\) 值;时序运算
delay_d(x)d 日延时d 日前的 \(x\) 值;时序运算
Corr_d(x, y)d 日相关性d 日 \(x\) 值和 d 日 \(y\) 值的相关性;时序运算
Max_d(x)d 日最大值d 日 \(x\) 值的最大值;时序运算
Min_d(x)d 日最小值d 日 \(x\) 值的最小值;时序运算
sort_d(x)d 日排序位置d 日 \(x\) 值的排序值;时序运算
Argsortmin_d(x)d 日最小值位置d 日 \(x\) 值的最小值的位置;时序运算
Argsortmax_d(x)d 日最大值位置d 日 \(x\) 值的最大值的位置;时序运算
\(\operatorname{inv}(x)\)倒数\( 1 / x\);点运算
Std_d(x)d 日方差d 日 \(x\) 值的方差;时序运算
abs(x)绝对值\(\lvert x\rvert\);点运算

4.2.9 遗传规划

遗传规划(Genetic Programming, GP)的核心思想是使用进化算法在算子(operators)与基础字段(terminals)组合而成的巨大搜索空间中,自动“进化”出具有较强预测能力的因子表达式。对于本文中的因子挖掘来说,GP 的主要目标是从表4.2.7中的基础字段和表4.2.8中的算子所能组合成的所有可能表达式中,搜索并找到那些能对下一期股票收益有较好预测效果的因子。GP 的核心流程可分为以下几个步骤:

初始化(Initialization)
  1. 定义算子集与基础字段

    • 算子集(operators)如表4.2.8所示,包括加、减、乘、除、对数、绝对值、延时、移动最大/最小值、移动相关系数等运算。
    • 基础字段(terminals)如表4.2.7所示,包括开盘价、收盘价、最高价、最低价、成交量、复权因子等。
      这些算子和基础字段可以视作因子表达式树中的“节点”,其中基础字段为叶子节点(终端节点),算子为内部节点。
  2. 随机生成初始种群

    • 在初始化阶段,根据给定的算子集与字段集,随机“拼接”生成一系列因子表达式(可表示为若干语法树或表达式树),形成初始种群。
    • 例如,可能随机产生
      \[ \text{因子1}: \mathrm{Max\_5}\bigl(\mathrm{add}(\mathrm{vol}, \mathrm{close})\bigr), \quad \text{因子2}: \mathrm{sub}\bigl(\mathrm{adj\_factor}, \mathrm{neg}(\mathrm{turnover\_rate})\bigr), \dots \]
    • 每个因子表达式都将对应一个个体(individual)。
适应度函数(Fitness Function)
  1. 度量因子的预测能力

    • 针对每个表达式(个体),我们需要评估它对未来收益或其他目标的预测能力。具体来说,可以在下一期股票收益 \( r^{T+1} \) 与当前期因子暴露度 \( x_k^T \) 之间,计算其相关系数(IC)或更综合的指标 IR(Information Ratio)来衡量。
  2. 设定目标

    • 若我们希望因子具有更高的相关性(IC),则可令适应度函数为 \(\lvert \rho(x_k^T, r^{T+1})\rvert\);
    • 若我们希望因子的 IR 更高,则可设定适应度函数为 IR 值。
    • 因子 IC 或 IR 越高,该表达式的“适应度”就越高。
\[ \text{Fitness} \bigl(F(x)\bigr) \;=\; \begin{cases} \lvert \rho(x_k^T, r^{T+1})\rvert \quad &\text{(IC最大化)},\\[6pt] \mathrm{IR}(x_k^T) \quad &\text{(IR最大化)}. \end{cases} \]

其中 \(\rho(\cdot)\) 表示相关系数,\(\mathrm{IR}(\cdot)\) 为 IR 指标。

选择(Selection)、交叉(Crossover)与变异(Mutation)
  1. 选择(Selection)

    • 根据适应度函数的结果,将因子适应度高的表达式“保留”或“繁衍”,适应度较低的表达式则被淘汰。
    • 这类似于生物进化中的“优胜劣汰”。
  2. 交叉(Crossover)

    • 将若干适应度较高的表达式(父本)随机选取一部分“节点”进行交换,从而得到新的表达式(子本)。
    • 在表达式树结构中,可以将子树 A 与子树 B 互换,从而产生新的后代表达式。
    • 例如,若表达式树 \(\mathrm{FactorA}\) 的某个子树与表达式树 \(\mathrm{FactorB}\) 的对应子树相交换,就生成了两个新的表达式。
  3. 变异(Mutation)

    • 以一定概率对表达式的某些节点进行随机变更,比如:
      • 更换节点的算子(例如将 \(\mathrm{add}\) 换为 \(\mathrm{sub}\)),
      • 替换终端节点的基础字段(例如将 \(\mathrm{vol}\) 换为 \(\mathrm{close}\)),
      • 或随机改变运算参数(如移动窗口长度、平滑因子等)。
    • 变异可以增加群体的多样性,避免过早收敛或陷入局部最优。
迭代进化(Iteration)
  1. 循环执行

    • 将选择、交叉、变异的操作反复执行多代(generations)。
    • 每一代都产生一个新的因子表达式种群,并对其进行适应度评估。
  2. 收敛与终止

    • 当进化达到预先设定的停止条件(如迭代次数、适应度阈值等)时,算法终止。
    • 通常我们会选出若干个最终适应度较高的因子表达式,将它们视为进化结果。
数学表征:搜索最优因子表达式

将上述过程抽象成下式,可以简单表示因子的搜索目标:

\[ F(x) \;=\; \mathrm{GP}\bigl(\{\text{operators}\}, \{\text{terminals}\}\bigr), \]

表示通过 GP 算法在给定算子集(operators)和基础字段集(terminals)上搜索出一个函数 \(F(x)\)。从最优化的角度看,我们希望找到:

\[ \max_{F} \bigl\lvert \rho(F^T, r^{T+1}) \bigr\rvert \quad \text{或者} \quad \max_{F} \; \mathrm{IR}\bigl(F\bigr), \]

其中

  • \(\rho(\cdot)\) 表示因子与下一期收益的相关系数(IC),
  • \(\mathrm{IR}(\cdot)\) 表示该因子的 IR 指标。

在实际应用中,我们会给定一段回测期,对每一代的候选因子进行打分(IC/IR 评估),通过选择、交叉和变异的迭代过程不断“进化”出更优质的因子。

通过以上步骤,我们最终能够在庞大的算子组合与基础字段组合的搜索空间中,自动挖掘到一批对未来收益有较强预测能力、且具有较好稳健性(如 IR 较高)的因子表达式。

4.2.10 挖掘出的部分因子

因子名定义
0Max_25(add(turnover_rate, vol))
1Max_30(vol)
2Max_25(turnover_rate)
3Max_35(add(vol, close))
4Max_30(turnover_rate)
5sub(Min_20(neg(pre_close)), div(vol, adj_factor))
6Max_60(max(vol, adj_factor))
7Max_50(amount)
8div(vol, neg(close))
9min(ArgSortMin_25(pre_close), neg(vol))
10neg(max(vol, turnover_rate))
11mul(amount, neg(turnover_rate))
12inv(add(ArgSortMax_40(change), inv(pct_chg)))
13Std_40(inv(abs(sub(mul(total_mv, change), min(adj_factor, high))))
14div(log(total_mv),amount)
15div(neg(Max_5(amount)), Min_20(ArgSort_60(high)))
16Corr_30(inv(abs(sub(mul(total_mv, change), min(adj_factor, high)))), add(log(Max_10(pre_close)), high))
17ArgSort_60(neg(turnover_rate))

这些因子均是通过遗传规划从算子列表(表4.2.8)与基础字段列表(表4.2.7)中组合而得,具有不同的数学表达形式。

  • 因子有效性检验

当我们得到挖掘的因子之后,需要对因子进行有效性检验,常见的检验指标有信息系数(Information Coefficient,IC)信息比率(Information Ratio,IR)

  • 信息系数(IC)描述的是所选股票下期收益率和本期因子暴露度的线性相关程度,可以反应该因子进行收益率预测的稳健性
  • **信息比率(IR)**是超额收益的均值与超额收益的标准差之比,信息比率与夏普比率类似,主要区别在于夏普比率使用无风险收益作为基准,而信息比率使用风险指数作为基准。夏普比率有助于确定投资组合的绝对收益,信息比率有助于确定投资组合的相对收益。当我们计算了 IC 之后,可以根据 IC 的值再对 IR 进行计算。当 IR 大于 0.5 时,因子稳定获取超额收益能力较强。

实际计算中,因子 \(k\) 的 \( \mathrm{IC} \) 值一般是指所选股票第 \(T\) 期的因子 \(k\) 上的暴露度 \( x_k^T \) 与所选股票第 \(T+1\) 期的收益率 \( r^{T+1} \) 的相关系数;因子 \(k\) 的 \( \mathrm{IR} \) 值为因子 \(k\) 的 \( \mathrm{IC} \) 的均值除以因子 \(k\) 的 \( \mathrm{IC} \) 的标准差,计算公式如下:

$$ \begin{gathered} I C=\rho_{x_{k}^{T}, r^{T+1}}=\frac{\operatorname{cov}\left(x_{k}^{T}, r^{T+1}\right)}{\sigma_{x_{k}^{T}} \sigma_{r^{T+1}}}=\frac{\mathrm{E}\left(x_{k}^{T} * r^{T+1}\right)-\mathrm{E}\left(x_{k}^{T}\right) \mathrm{E}\left(r^{T+1}\right)}{\sqrt{\mathrm{E}\left(\left(x_{k}^{T}\right)^{2}\right)-\mathrm{E}\left(x_{k}^{T}\right)^{2}} \cdot \sqrt{\mathrm{E}\left(\left(r^{T+1}\right)^{2}\right)-\mathrm{E}\left(r^{T+1}\right)^{2}}} \\ I R=\frac{\overline{I C}}{\sigma_{I C}} \end{gathered} $$

其中:

  • $x_{k}^{T}$ :所选股票第 $T$ 期的因子 $k$ 上的暴露度
  • $r^{T+1}$ :所选股票第 $T+1$ 期的收益率
  • $\overline{I C}: I C$ 的均值

本文采用 IR 判断因子好坏,通过对大量不同的算子和基础数据的组合以及 IC 和 IR 的“篮选”,文章得到了本文所选用的 50 个价量因子。经过 IR 检测,按 IR 由高到低排序得到如下图所示的表格。从下表中我们可以看出来所选的 50 个价量因子的 IR 都大于 0.5 ,说明这些因子稳定获取超额收益能力较强。

4.2.11 因子 IR 检验表

因子名IR因子名IR
03.11252.73
12.95262.71
22.95272.70
32.95282.69
42.95292.69
52.94302.69
62.94312.68
72.94322.68
82.93332.68
92.93342.68
102.93352.67
112.92362.67
122.91372.66
132.89382.65
142.86392.65
152.83402.65
162.83412.65
172.83422.64
182.79432.63
192.78442.63
202.78452.62
212.76462.62
222.75472.62

从该表可见,在所筛选的因子中,所有因子的 IR 均大于 0.5,具有较强且稳定的获取超额收益的能力。

4.3 因子清洗

4.3.1 因子缺失值处理和去极值

对于因子的缺失值处理的方法有个案剔除法,均值替换法,回归替换法等方法。本文采用较为简单的均值替换法对缺损值进行处理,即利用因子的平均值来替代缺失的数据。对于因子去极值有中位数去极值,百分比去极值和 $3 \sigma$ 去极值等方法。本文采用的是 $3 \sigma$ 去极值法,该方法是利用统计学上的 $3 \sigma$ 原则,将把离该因子均值三个标准差以上的极值因子转化到刚好离均值三个标准差的位置,具体计算公式如下:

$$ X_i^{\prime}= \begin{cases} \bar{X}+3 \sigma & \text{if } X_i > \bar{X} + 3 \sigma \\ \bar{X}-3 \sigma & \text{if } X_i < \bar{X} - 3 \sigma \\ X_i & \text{if } \bar{X} - 3 \sigma < X_i < \bar{X} + 3 \sigma \end{cases} $$

其中:

  • $X_{i}$ :因子处理之前的值
  • $\bar{X}$ :因子序列的均值
  • $\sigma$ :因子序列的标准差
  • $X_{i}^{\prime}$ :去极值后的因子的值

4.3.2 因子的标准化

本文实验选取了多个因子,并且各个因子量纲并不完全相同,为了我们方便进行比较和回归,我们还需对因子进行标准化处理。目前常用的具体的标准化方法有 Min-Max标准化,Z-score 标准化和 Decimal scaling 小数定标标准化等。本文选择 Z-score 标准化的方法。通过原始数据的均值和标准差进行数据的标准化,经过处理的数据符合标准正态分布,即均值为 0 ,标准差为 1 ,其标准化后的数值大小有正有负,得到标准正态分布曲线。

本文采用 Z-score 标准化公式如下:

$$ \tilde{x}=\frac{x_{i}-u}{\sigma} $$

其中:

  • $x_{i}$ :因子的原值
  • $u$ :因子序列的均值
  • $\sigma$ :因子序列的标准差
  • $\tilde{x}$ :标准化后的因子值

4.3.3 因子的中性化

因子中性化是为了剔除其他因素对我们所选因子的影响,使我们构建量化投资策略组合所选择的股票更加分散,而不是集中在特定的行业或者市值的股票上,可以更好地分担投资组合的风险和解决因子多重共线性的问题。市值和行业是影响股票收益最主要的两种自变量,所以在进行因子清洗的过程中,还必须考虑市值和行业的影响。本文实证中我们采用仅纳入行业因子,而将市场因子包含在行业因子中的方法。针对因子的单因子回归模型见公式(31),我们将以下回归模型的残差项作为因子中性化后的新的因子值。

$$ \tilde{r}_{j}^{t}=\sum_{s=1}^{s} X_{j s}^{t} \tilde{f}_{s}^{t}+X_{j k}^{t} \tilde{f}_{k}^{t}+\tilde{u}_{j}^{t} $$

其中:

  • $\tilde{r}_{j}^{t}$ :股票 $j$ 在第 $t$ 期的收益率
  • $X_{j s}^{t}$ :股票 $j$ 在第 $t$ 期在行业 $s$ 上的暴露度
  • $\tilde{f}_{s}^{t}$ :行业在第 $t$ 期的收益率
  • $X_{j k}^{t}$ :股票 $j$ 在第 $t$ 期在因子 $k$ 上的暴露度
  • $\tilde{f}_{k}^{t}$ :因子 $k$ 在第 $t$ 期的收益率
  • $\tilde{u}_j^t$ :一个 $0-1$ 哑变量,即如果股票 $j$ 属于行业 $s$ ,则暴露度为 1 ,否则为 0

在本文中,并不会对公司所属行业进行按照比例拆分,即股票 $j$ 只能属于一个特定的行业 $s$ ,在行业 $s$ 上的暴露度为 1 ,在其他所有行业的暴露度为 0 。本文使用申万宏源行业分类标准,具体分类情况依次为农林牧渔,采掘,化工,钢铁,有色金属,电子元器件,家用电器,食品饮料,纺织服装,轻工制造,医药生物,公用事业,交通运输,房地产,商业贸易,餐饮旅游,综合,建筑材料,建筑装饰,电器设备,国防军工,计算机,传媒,通信,银行,非银金融,汽车和机械设备这 28 类。下表为 2021 年 2 月 5 日的申万指数一级行业历史行情图。

4.3.3.1 2021年2月5日的申万指数一级行业历史行情图
指数代码指数名称发布日期开盘指数最高指数最低指数收盘指数成交量(亿殴)成交额(亿元)涨跌幅(%)
801010农林牧渔2021/2/5 0:004111.434271.094072.534081.8115.81307.82-0.3
801020采掘2021/2/5 0:002344.622357.332288.972289.4118.06115.6-2.25
801030化工2021/2/5 0:004087.774097.593910.673910.6755.78778.85-3.95
801040钢铁2021/2/5 0:002253.782268.172243.482250.8111.6148.39-1.02
801050有色金属2021/2/5 0:004212.14250.594035.994036.7445.41593.92-4.43
801080电子元器件2021/2/5 0:004694.84694.84561.954561.9552.67850.79-2.78
801110家用电器2021/2/5 0:0010033.8210171.269968.9310096.838.55149.180.83
801120食品饮料2021/2/5 0:0030876.3331545.0230649.5730931.6911.32657.110.47
801130纺织服装2021/2/5 0:001614.481633.891604.681607.636.2857.47-0.39
801140轻工制造2021/2/5 0:002782.072791.882735.482737.2415.28176.16-1.35

数据来源:申银万国

下表是原始的因子部分数据。依次经过上述因子缺失值填充、因子去极值、因子标准化和因子中性化这 4 个因子清洗的步骤后,得到如表展示的经过因子清洗后的因子部分数据。

4.3.3.2 原始的因子数据
trade_datesec_coderetfactor_0factor_1factor_2factor_3factor_4factor_5factor_6
2005-01-04600874.SH0.001684NaN9.4454129.4454129.445408-1.00NaN12651.124023
2005-01-04000411.SZ0.021073NaN5.9712625.9712625.9713130.38NaN392.124298
2005-01-04000979.SZ0.021207NaN6.7689186.7689186.768815-1.45NaN870.587585
2005-01-04000498.SZ0.030220NaN8.8527528.8527528.8527550.55NaN6994.011719
2005-01-04600631.SH0.015699NaN9.5898979.5898979.589889-1.70NaN14616.806641
4.3.3.3 清洗后的因子数据
sec_codetrade_dateretfactor_0factor_1factor_2factor_3factor_4factor_5factor_6
000001.SZ2005-01-04-1.586530.015451.383061.383061.383060.133920.015451.38564
000002.SZ2005-01-041.36761-0.448141.697281.697281.697281.04567-0.448141.69728
000004.SZ2005-01-040.32966-1.41654-0.13907-0.13907-0.13907-0.34769-1.41654-0.13650
000005.SZ2005-01-040.61297-1.130661.053391.053391.05339-1.20020-1.130661.05597
000006.SZ2005-01-04-0.355421.67667-0.07726-0.07726-0.077261.558201.67667-0.07469

4.4 基于 LightGBM 的因子选择

4.4.1 GBDT

Friedman(2001)$^{[20]}$ 提出的梯度提升决策树(Gradient Boosting Decision Tree,GBDT)是一种基于迭代的回归型决策树。其主要思想是通过逐步添加弱分类器(通常是决策树)来优化模型,使得整体模型能够最小化损失函数。GBDT 的模型可以表示为:

$$ \hat{y} = \sum_{m=1}^{M} \gamma_m h_m(\mathbf{x}) $$

其中:

  • \( M \) 是迭代次数,
  • \( \gamma_m \) 是第 \( m \) 个弱分类器的权重,
  • \( h_m(\mathbf{x}) \) 是第 \( m \) 个决策树模型。

GBDT 的训练过程通过逐步拟合负梯度方向来最小化损失函数,具体更新公式为:

$$ \gamma_m = \arg\min_\gamma \sum_{i=1}^{N} L\left(y_i, \hat{y}_{i}^{(m-1)} + \gamma h_m(\mathbf{x}_i)\right) $$

其中,\( L \) 是损失函数,\( y_i \) 是真实值,\( \hat{y}_{i}^{(m-1)} \) 是第 \( m-1 \) 次迭代后的预测值。

4.4.2 LightGBM

轻量级梯度提升机(Light Gradient Boosting Machine,LightGBM)$^{[21]}$ 是一个高效实现 GBDT 算法的框架,最初由 Microsoft 开发,作为一个免费开源的分布式梯度提升框架。LightGBM 基于决策树算法,广泛应用于排名、分类及其他机器学习任务,开发重点在于性能和可伸缩性。其主要优势包括高效率的并行训练、更快的训练速度、更低的内存消耗、更好的准确率,以及支持分布式计算和快速处理海量数据$^{[22]}$。

LightGBM 的核心算法基于以下优化目标:

$$ L = \sum_{i=1}^{N} l(y_i, \hat{y}_i) + \sum_{m=1}^{M} \Omega(h_m) $$

其中,\( l \) 是损失函数,\( \Omega \) 是正则化项,用于控制模型复杂度,通常表示为:

$$ \Omega(h_m) = \gamma T + \frac{1}{2} \lambda \sum_{j=1}^{T} w_j^2 $$

这里,\( T \) 是树的叶子数,\( w_j \) 是第 \( j \) 个叶子的权重,\( \gamma \) 和 \( \lambda \) 是正则化参数。

LightGBM 采用基于梯度的单边采样(Gradient-based One-Side Sampling,GOSS)和互斥特征捆绑(Exclusive Feature Bundling,EFB)等技术,显著提升了训练效率和模型性能。

在本研究中,训练过程中使用的损失函数为均方误差(Mean Squared Error,MSE),其定义为:

$$ L(y, \hat{y}) = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2 $$

其中,\( y \) 为真实收益率,\( \hat{y} \) 为模型预测的收益率,\( N \) 为样本数量。

4.4.3 算法流程

本小节算法的具体流程如下:

  1. 数据准备:使用一年的每只股票的 50 个因子数据(A 股全市场数据)和历史未来一个月的收益率作为特征。

  2. 模型训练:利用网格搜索法(Grid Search)优化 LightGBM 模型的超参数,训练模型以预测未来一个月的收益率。模型训练流程如图4.12所示。

    $$ \text{参数优化:} \quad \theta^* = \arg\min_\theta \sum_{i=1}^{N} L(y_i, \hat{y}_i(\theta)) $$

    其中,\( \theta \) 表示模型的超参数集合,\( \theta^* \) 为最优参数。

  3. 因子重要性计算:使用 LightGBM 的 feature_importances_ 方法计算各因子的特征重要性。特征重要性主要通过两个指标衡量:

    • Split:该特征在所有树中被用于分裂的次数。
    • Gain:该特征在所有分裂中带来的总增益(即损失函数的减少量)。

    因子的特征重要性可以表示为:

    $$ \text{Importance}_{\text{split}}(f) = \sum_{m=1}^{M} \sum_{j=1}^{T_m} \mathbb{I}(f \text{ 被用于第 } j \text{ 个叶节点的分裂}) $$$$ \text{Importance}_{\text{gain}}(f) = \sum_{m=1}^{M} \sum_{j=1}^{T_m} \Delta L_{m,j} \cdot \mathbb{I}(f \text{ 被用于第 } j \text{ 个叶节点的分裂}) $$

    其中,\( \mathbb{I} \) 是指示函数,\( \Delta L_{m,j} \) 是因子 \( f \) 在第 \( m \) 棵树的第 \( j \) 个分裂中带来的损失减少量。

  4. 因子筛选:根据模型计算的因子重要性进行排序,选择前十个重要性最高的因子作为本横截面分析中使用的因子。所选因子的重要性如表4.4.4所示。

4.4.4 部分所选因子重要性排序

importancefeature_nametrade_date
35factor_352010-08-11
27factor_272010-08-11
33factor_332010-08-11
20factor_202010-08-11
24factor_242010-08-11
45factor_452010-08-11
37factor_372010-08-11
49factor_492010-08-11
19factor_192010-08-11
47factor_472010-08-11
22factor_222010-09-09
20factor_202010-09-09
30factor_302010-09-09
24factor_242010-09-09

4.4.5 代码实现片段

以下是训练过程所使用的部分代码,用于因子选择。

feature_choice
def feature_choice(
        self,
        days=21,
        is_local=False
):
    if is_local:
        feature_info = pd.read_hdf(os.path.join(RESULTS, Feature_Info + '.h5'))
    else:
        factors = self.get_env().query_data(Factors_Data)
        factors = factors[
            factors[COM_DATE] >= '2010-01-01'
        ]
        trade_list = list(set(factors[COM_DATE]))
        trade_list.sort()
        if len(trade_list) % days == 0:
            n = int(len(trade_list) / days) - 7
        else:
            n = int(len(trade_list) / days) - 6
        feature_info = pd.DataFrame()
        begin_index = 147
        feature = list(factors.columns)
        feature.remove(COM_SEC)
        feature.remove(COM_DATE)
        feature.remove(Ret)
        for i in range(n):
            end_date = days * i + begin_index - 21
            begin_date = days * i
            trade_date = days * i + begin_index
            print(trade_list[trade_date])
            train_data = factors[
                (factors[COM_DATE] <= trade_list[end_date]) &
                (factors[COM_DATE] >= trade_list[begin_date])
            ]
            model = lgb.LGBMRegressor()
            model.fit(train_data[feature], train_data[Ret])
            feature_info_cell = pd.DataFrame(columns=Info_Fields)
            feature_info_cell[Importance] = model.feature_importances_
            feature_info_cell[Feature_Name] = model.feature_name_
            feature_info_cell = feature_info_cell.sort_values(by=Importance).tail(10)
            feature_info_cell[COM_DATE] = trade_list[trade_date]
            feature_info = pd.concat(
                [feature_info, feature_info_cell],
                axis=0
            )
        h = pd.HDFStore(os.path.join(RESULTS, Feature_Info + '.h5'), 'w')
        h['data'] = feature_info
        h.close()
    self.get_env().add_data(feature_info, Feature_Info)
    pass

通过上述流程,利用 LightGBM 高效地筛选出对预测未来收益率最具影响力的因子,从而提升模型的预测能力和解释性。

4.5 基于 BiLSTM 的因子组合

本小节使用 BiLSTM 进行因子组合。BiLSTM 的具体原理在第二章已经介绍了,这里不再赘述。下面先介绍一下使用模型的具体网络结构,本文通过大量反复试验最终 BiLSTM 设置的网络结构如表4.5.1所示。其中层与层之间使用循环神经网络默认的 tanh 和 linear 作为激活函数。并且为了防止过拟合加入 Dropout,但是如果 Dropout 使用过大的丢弃比例会出现欠拟合的现象,因此 Dropout 的丢弃比例取值为 0.01。最终模型的 BiLSTM 循环层的神经元个数为 100,采用一层 BiLSTM 层和三层全连接层,其中 BiLSTM 层和第一个全连接层之间设置了一个 Dropout。

4.5.1 BiLSTM的网络结构

Layer(type)Output ShapeParam#
bidirectional_1 (Bidirection)(None, 100)24400
dropout_1 (Dropout)(None, 100)0
dense_1 (Dense)(None, 256)25856
dropout_2 (Dropout)(None, 256)0
dense_2 (Dense)(None, 64)16448
dense_3 (Dense)(None, 1)0

Total params:66,769
Trainable params:66,769
Non-trainable params:0

因为本次实验使用数据的数据量较大,因此选用 epochs=400batch_size=1024。模型的损失函数采用均方误差(Mean Square Error,MSE)。其中优化器采用随机梯度下降(Stochastic Gradient Descent,SGD)。随机梯度下降相对于梯度下降(Gradient Descent,GD)有在信息冗余的情况下更能有效地利用信息,前期迭代效果卓越,适合处理大样本的数据这三个优势 $^{[23]}$。由于本实验训练数据量较大,使用 SGD 的话每次仅用一个样本来迭代,训练的速度很快,可以大大减少我们训练所花费的时间。使用其 keras 包中的默认值,即 lr=0.01momentum=0.0decay=0.0nesterov=False

参数解释:

  • lr:学习率
  • momentum:动量参数
  • decay:每次更新后的学习率衰减值
  • nesterov:确定是否使用 Nesterov 动量

4.5.2 算法流程

本小节算法的具体流程如下:

  1. 使用一年的每只股票的 10 个因子(LightGBM 选出来的因子)和历史未来一个月的收益率的 A 股全市场数据作为特征。
  2. 以一年每支股票未来一个月的收益率为预测目标,利用 BiLSTM 进行训练,如 Fig. 12 所示。
Fig. 12. Rolling Window

Fig. 12. Rolling Window

  1. 一个月的样本外数据的实时因子数据通过训练好的 BiLSTM 模型,得到实时的未来一月的每只股票预期收益率。收益率如表4.11所示。

4.5.3 部分股票预测收益率表

sec_codetrade_datey_hat
000001.SZ2011/5/260.0424621
000002.SZ2011/5/26-0.1632174
000004.SZ2011/5/26-0.0642319
000005.SZ2011/5/260.08154649
000006.SZ2011/5/260.00093213
000007.SZ2011/5/26-0.073218
000008.SZ2011/5/26-0.0464256
000009.SZ2011/5/26-0.091549
000010.SZ2011/5/260.08154649
000011.SZ2011/5/26-0.1219943
000012.SZ2011/5/26-0.1448984
000014.SZ2011/5/260.09038845
000016.SZ2011/5/26-0.11225

4.5.4 代码实现片段

以下是训练过程所使用的部分代码,用于构建BiLSTM训练网络。

build_net_blstm
def build_net_blstm(self):
    model = ks.Sequential()
    model.add(
        ks.layers.Bidirectional(ks.layers.LSTM(
            50
        ),input_shape=(11,10))
    )
    model.add(
        ks.layers.Dropout(0.01) 
    )
    model.add(ks.layers.Dense(256))
    model.add(
        ks.layers.Dropout(0.01)
    )
    model.add(ks.layers.Dense(64))
    model.add(ks.layers.Dense(1))
    model.compile(optimizer='sgd', loss='mse')
    model.summary()
    self.set_model(model)  

4.6 量化策略和策略回测

4.6.1 回测指标

下面先对策略的一些常见回测指标进行介绍。评价指标包括累计收益率(Total Rate of Return)、年化收益率(Annualized Rate of Return)、年化波动率(Annualized volatility)、夏普比率(Sharpe ratio)、最大回撤率 (Maximum Drawdown,MDD)、年化换手率(Annualized turnover rate)和年化交易成本率(Annualized transaction cost rate),其中假定一年股市开盘252天,无风险利率默认为0.035,手续费默认0.002。

  1. 累计收益率(Total Rate of Return):在其他指标相同的情况下,累计收益率越大说明该策略越好,越能带来更大的收益。公式如下:
$$ \text{Total Rate of Return} = r_{p} = \frac{P_{1} - P_{0}}{P_{0}} $$

$P_{1}$ :最终股票和现金的总价值
$P_{0}$ :初始股票和现金的总价值

  1. 年化收益率(Annualized Rate of Return):是将累计总收益率换算成以年为单位的几何平均收益率。在其他指标相同的情况下,年化收益率越大,代表该策略越好。公式如下:
$$ \text{Annualized Rate of Return} = R_{p} = \left(1 + r_{p}\right)^{\frac{252}{t}} - 1 $$

$r_{p}$ :累计收益率
$t$ :投资策略执行的天数

  1. 年化波动率(Annualized volatility):定义为对象资产的年回报率的对数值的标准差。年化波动率用来衡量策略的风险性,波动率越大代表策略的风险越高。公式如下:
$$ \begin{aligned} \text{Annualized volatility} = \sigma_{p} &= \sqrt{\frac{252}{t-1} \sum_{i=1}^{t}\left(r_{d} - \bar{r}_{d}\right)^{2}} \\ \bar{r}_{d} &= \frac{1}{t} \sum_{i=1}^{t} r_{d_{i}} \end{aligned} $$

$r_{d_{i}}$ :第 $i$ 天日收益率
$\bar{r}_{d}$ :日平均收益率
$t$ :投资策略执行的天数

  1. 夏普比率(Sharpe ratio):是由 Sharpe(1966)$^{[24]}$ 提出的。它代表投资者额外承受一单位风险,所获得的超额收益$^{[25]}$。这里给出年化的夏普比率计算公式:
$$ S = \frac{R_{p} - R_{f}}{\sigma_{p}} $$

$R_{p}$ :年化收益率
$R_{f}$ :无风险收益率
$\sigma_{p}$ :年化波动率

  1. 最大回撤率 (Maximum Drawdown,MDD):表示表示我们策略运行期间股票和现金的总价值走到最低点时的收益率回撤幅度的最大值。最大回测率用来策略最极端可能的亏损情况。
$$ MDD = \frac{\max \left(V_{x} - V_{y}\right)}{V_{x}} $$

$V_{x}$ 和 $V_{y}$ 分别为策略组合在第 $x$ 天和第 $y$ 天的股票和现金的总价值,且 $x < y$。

  1. 年化换手率(Annualized turnover rate):用来衡量对投资组合里面的股票买卖的频繁程度。越大说明改投资组合换仓越频繁,交易成本也会越大。
$$ \text{change} = \frac{N \times 252}{t} $$

$t$ :投资策略执行的天数
$N$ :总共买进和卖出的次数

  1. 年化交易成本率(Annualized transaction cost rate):用来衡量投资组合策略的交易成本,越大说明交易成本越高。
$$ c = \left(1 + \text{commison}\right)^{\text{change}} - 1 $$

change:年化换手率
commison:手续费

4.6.2 策略及回测结果

本文量化交易策略采用每隔一个月进行换仓(即调仓周期为28个交易日),每次换仓采取等额持股的方式买入 BiLSTM 预测出的预期收益率最高的25支股票,卖出原本所持有的股票。本文的回测时间和规则如下:

  1. 回测时间:从 2012 年 1 月到 2020 年 10 月。
  2. 回测股票池:全 A 股,剔除特别处理(Special treatment,ST)股票。
  3. 交易手续费:买入时支付给券商交易佣金千分之二,卖出时支付给券商交易佣金千分之二,其中单笔交易佣金不满5元券商按5元收取交易佣金。
  4. 买卖规则:当天开盘涨停股票不能买入,跌停股票不能卖出。
4.6.2.1 策略回测结果
累计收益率年化收益率年化波动率夏普比率最大回撤年化换手率年化交易成本率
策略701.00%29.18%33.44%0.7751.10%51.10%11.35%
基准110.40%9.70%26.01%0.2458.49%58.49%0.00%
Fig. 22. Net Profit Curve

Fig. 22. Net Profit Curve

回测结果如上表和 Fig.22 所示。我的策略采用的是本章所介绍的 LightGBM-BiLSTM 量化策略。基准采用的中证全指(000985)。由上面的结果可以看到,本策略累计收益率为701.00%,远高于基准110.40%;年化收益率为29.18%,远高于基准9.70%;夏普率为0.77,高于基准0.24。这三项回测指标说明 LightGBM-BiLSTM 量化策略确实能够给投资者带来更大的收益。本策略年化波动率为33.44%大于基准26.01%,最大回撤为51.10%小于基准58.49%,这两项回测指标说明 LightGBM-BiLSTM 量化策略存在一定的风险,特别是很难抵御系统性风险的冲击。年化换手率为11.35%,年化交易成本率为2.29%,说明我们策略不是高频交易策略,交易成本较小。从收益曲线图可以看出 LightGBM-BiLSTM 量化策略在前两年的收益率和基准相差不大,并没有特别的优势。但从2015年4月左右开始 LightGBM-BiLSTM 量化策略的收益率明显好于基准的收益率。总体而言,该 LightGBM-BiLSTM 量化策略的收益率十分可观,但仍然存在一定的风险。

第五章 总结与展望

5.1 总结

本文首先介绍了基于深度学习的股票价格预测和量化策略研究的研究背景和研究意义,然后分别介绍了股票价格预测和量化投资策略国内外的研究现状,之后说明了本文的创新点和研究框架。接着本论文在相关理论基础章节大致介绍了本文用到的深度学习模型和量化投资的发展历程。重点介绍了 LSTM,GRU,BiLSTM 这三个模型的基本结构,基本原理和特点。

随后,本文利用浦发银行和 IBM 的日频数据,通过一系列的数据处理过程和特征提取来对数据进行预处理。然后介绍了 LSTM,GRU,BiLSTM 这三个模型的具体网络结构以及超参数的设定。紧接着我们使用 LSTM,GRU,BiLSTM 分别进行两只股票收盘价的预测和模型评估比较。实验结果表明对于两只股票而言都是 BiLSTM 预测效果更加准确。

最后,本论文为了进一步说明 BiLSTM 在金融上的运用价值,构建了基于 LightGBM-BiLSTM 的量化投资模型。选取 A 股全市场的股票和多个因子依次进行因子清洗,基于 LightGBM 的因子选择和基于 LSTM 的因子组合等过程。接着,我们构建一定的投资策略并通过累计收益率,年化收益率,年化波动率和夏普比率等评估指标与基准的持有中证全指进行对比。通过对比发现 LightGBM-BiLSTM 量化投资模型能带来更好的收益,说明了利用深度学习构建量化投资策略的有效性。

5.2 展望

本文虽然分别对比 LSTM,GRU,BiLSTM 这三个模型预测股票收盘价的效果和基于 LightGBM-BiLSTM 量化投资策略取得了一定的成果,但本文研究仍有一些不足之处。结合本文的研究成果,可以进一步进行以下研究和改进:

  1. 预测目标多样化:本文在预测股票价格方面,选取的股票收盘价作为预测目标,虽然这一结果最直观,但 Bachelier(1900)$^{[26]}$ 提出的随机游走假说(Random Walk Hypothesis,RWH)认为股票的价格服从随机漫步,是不可预测的。虽然之后有许多行为经济学家证明这一观点不完全正确,但这也同时说明单纯预测股票的收盘价难度和可解释性不那么强 $^{[27][28]}$。因此可以选择股票波动率预测,股票涨跌判断和股票收益率预测等作为未来的研究的方向。
  2. 模型多样化对比:本文在预测股票价格方面,对比了 LSTM,GRU 和 BiLSTM 这三种循环神经网络模型并且说明了 BiLSTM 预测效果比较好,但仍然缺少和其他更多不同模型的对比研究。因此未来可以深入研究与 Autoregressive Integrated Moving Average (ARIMA),卷积神经网络(Convolutional Neural Networks,CNN),深度神经网络(Deep Neural Networks,DNN), CNN-LSTM, Transformer 和 TimeGPT 等单一或复合模型之间的对比。
  3. 因子多样化:本文在构建量化投资策略方面使用的因子都是技术面的价量因子,因子的种类单一。未来可以选择财务因子,情绪因子,成长因子等不同种类的因子,从而提高策略的性能。同时未来研究还可以适当的加入择时策略,在预测大盘上涨时增加仓位,在预测大盘下跌时减少仓位,赚取贝塔(beta,$\beta$)的钱。
  4. 投资组合优化:本文的因子组合过程仍然不完善,未来可以利用二次规划的方法对投资组合进行优化。
  5. 高频交易策略研究:本文的量化投资策略方法采取的是低频交易的策略,未来可以利用股票的 tick 数据来研究高频策略和超高频策略。

参考文献

[1] White, H. “Economic prediction using neural networks: The case of IBM daily stock returns.” Proc. of ICNN. 1988, 2: 451-458.

[2] Kimoto, T., Asakawa, K., Yoda, M., et al. “Stock market prediction system with modular neural networks.” Proc. of 1990 IJCNN International Joint Conference on Neural Networks. IEEE, 1990: 1-6.

[3] Zhang, G. P. “Time series forecasting using a hybrid ARIMA and neural network model.” Neurocomputing. 2003, 50: 159-175.

[4] Akita, R., Yoshihara, A., Matsubara, T., et al. “Deep learning for stock prediction using numerical and textual information.” Proc. of 2016 IEEE/ACIS 15th International Conference on Computer and Information Science (ICIS). IEEE, 2016: 1-6.

[5] 宮崎邦洋, 松尾豊. “Deep Learning を用いた株価予測の分析.” 人工知能学会全国大会論文集 第31回全国大会. 一般社団法人 人工知能学会, 2017: 2D3OS19a3-2D3OS19a3.

[6] Kim, T., Kim, H. Y. “Forecasting stock prices with a feature fusion LSTM-CNN model using different representations of the same data.” PLoS ONE. 2019, 14(2): e0212320.

[7] Hochreiter, S., Schmidhuber, J. “Long short-term memory.” Neural Computation. 1997, 9(8): 1735-1780.

[8] Cho, K., Van Merriënboer, B., Gulcehre, C., et al. “Learning phrase representations using RNN encoder-decoder for statistical machine translation.” arXiv preprint arXiv:1406.1078. 2014.

[9] Chung, J., Gulcehre, C., Cho, K. H., et al. “Empirical evaluation of gated recurrent neural networks on sequence modeling.” arXiv preprint arXiv:1412.3555. 2014.

[10] Gruber, N., Jockisch, A. “Are GRU cells more specific and LSTM cells more sensitive in motive classification of text?” Frontiers in Artificial Intelligence. 2020, 3(40): 1-6.

[11] Markowitz, H. “Portfolio Selection.” The Journal of Finance. 1952, 7(1): 77-91. doi:10.2307/2975974.

[12] Merton, R. C. “An analytic derivation of the efficient portfolio frontier.” Journal of Financial and Quantitative Analysis. 1972: 1851-1872.

[13] Sharpe, W. F. “Capital asset prices: A theory of market equilibrium under conditions of risk.” The Journal of Finance. 1964, 19(3): 425-442.

[14] Lintner, J. “The Valuation of Risk Assets and the Selection of Risky Investments in Stock Portfolios and Capital Budgets.” Review of Economics and Statistics. 1965, 47(1): 13-37.

[15] Mossin, J. “Equilibrium in a capital asset market.” Econometrica: Journal of the Econometric Society. 1966: 768-783.

[16] Ross, S. A. “The arbitrage theory of capital asset pricing.” Journal of Economic Theory. 1976, 13(3): 341-60.

[17] Fama, E. F., French, K. R. “Common risk factors in the returns on stocks and bonds.” Journal of Financial Economics. 1993, 33(1): 3-56.

[18] Fama, E. F., French, K. R. “A five-factor asset pricing model.” Journal of Financial Economics. 2015, 116(1): 1-22.

[19] Kingma, D. P., Ba, J. “Adam: A method for stochastic optimization.” arXiv preprint arXiv:1412.6980. 2014.

[20] Friedman, J. H. “Greedy function approximation: A gradient boosting machine.” Annals of Statistics. 2001: 1189-1232.

[21] Kopitar, L., Kocbek, P., Cilar, L., et al. “Early detection of type 2 diabetes mellitus using machine learning-based prediction models.” Scientific Reports. 2020, 10(1): 1-12.

[22] Ke, G., Meng, Q., Finley, T., et al. “Lightgbm: A highly efficient gradient boosting decision tree.” Advances in Neural Information Processing Systems. 2017, 30: 3146-3154.

[23] Bottou, L., Curtis, F. E., Nocedal, J. “Optimization methods for large-scale machine learning.” SIAM Review. 2018, 60(2): 223-311.

[24] Sharpe, W. F. “Mutual fund performance.” The Journal of Business. 1966, 39(1): 119-138.

[25] Sharpe, W. F. “The sharpe ratio.” Journal of Portfolio Management. 1994, 21(1): 49-58.

[26] Bachelier, L. “Théorie de la spéculation.” Annales Scientifiques de l’École Normale Supérieure. 1900, 17: 21-86.

[27] Fromlet, H. “Behavioral finance-theory and practical application: Systematic analysis of departures from the homo oeconomicus paradigm are essential for realistic financial research and analysis.” Business Economics. 2001: 63-69.

[28] Lo, A. W. “The adaptive markets hypothesis.” The Journal of Portfolio Management. 2004, 30(5): 15-29.

参考博客

引用

引用:转载或引用本文内容,请注明原作者与出处。

Cited as:

Yue Shui. (Apr 2021). 基于深度学习的股票价格预测和量化策略.
https://syhya.github.io/posts/2021-04-21-deep-learning-stock-prediction/

Or

@article{syhya2021stockprediction,
  title   = "基于深度学习的股票价格预测和量化策略",
  author  = "Yue Shui",
  journal = "syhya.github.io",
  year    = "2021",
  month   = "Apr",
  url     = "https://syhya.github.io/posts/2021-04-21-deep-learning-stock-prediction/"
}