因子模型系列:利用LSTM算法估计基金因子暴露度-招商证券
由small_q创建,最终由small_q 被浏览 58 用户
摘要
见贤思齐焉。当我们在研究为什么有些基金表现优异的时候,我们总想知道这些目标基金到底在哪些因子上有所暴露,对目标基金因子暴露的研究有利于投 资者构建自己的投资组合。传统方法是根据公募基金的定期报告中的持仓数据来 计算基金在某些因子上的暴露度,但是由于定期报告发布时间存在较长滞后,这 种传统方法在实际使用中也存在较长时滞。我们尝试使用基金净值序列和因子收 益序列来反推基金在某因子上的暴露度走势。使用 LSTM 算法进行计算,经过一 系列测试,取得了一些初步成果。
对于基金在各因子上的暴露度迁移的研究,有利于我们对目标基金进行研究。 不管是对基金进行因子业绩归因还是波动率拆解,都需要我们对基金在各因 子暴露度有所了解。
证监会要求基金公司发布的定期报告的时间与报告期期末截点存在较长的时 滞,而且定期报告存在公布频率低、重仓股代表性较弱的问题。因而使用定 期报告中的持仓明细来计算基金因子暴露的方法存在一些局限性,
我们尝试使用 LSTM 算法,根据基金的净值数据和因子的收益数据来反推基 金在某个因子上的暴露。由于 LSTM 是从循环神经网络(RNN)算法发展而 来的,在时间序列的处理上存在优势,同时,又克服了传统 RNN 难以训练的 难题,因而成为我们反算基金因子暴露的首选算法。
我们根据直观逻辑选择了相关系数、回归系数等特征变量,搭建神经网络模 型。根据训练结果对几个必要的超参数进行调整。在测试集上进行最后评估。
以规模类因子为例,在测试集上的 MAE 为 0.109。预测结果在绝对值对应和 暴露度变化的敏感度上,较之线性回归都有较大的改善。
最后我们讨论了之前使用过的“模拟基金法”,该方法效仿人工智能领域使 用人为产生的样本弥补样本量过少缺陷的做法。我们让程序模拟基金经理的 调仓行为,来产生众多“假基金”扩充训练集。但是在此方法在测试集(真 实基金集合)中进行评估时,泛化能力并不理想。我们对此进行了一些思考。
基金的因子暴露和传统方法的局限性
在进行基金研究的时候,投资者可能会对某只感兴趣的基金到底在哪些因子上有暴露产 生好奇。对于目标基金暴露度的观察,计算基金的因子业绩归因,可以给投资者在构建 投资组合的时候带来参考;同时对全市场基金因子暴露度迁移的观测,也有助于投资者 把握市场的整体情绪。
一般情况下,计算基金在某因子上的暴露,需要获悉基金的具体持仓数据。对于投资者 自己管理的组合,要获得其具体的动态持仓数据自然不是什么难事。但是对于并非自己 管理的目标基金,我们只能通过目标基金的管理人公布的定期报告来获得持仓数据。
基金公司每个季度都会公布上季度的季度报告,同时在半年度和年度结束时,会整理发 布基金的年度报告。在季度报告中,基金公司会公布报告期末按公允价值占基金资产净 值比例大小排序的前十名股票投资明细(即期末前十大重仓股持仓明细),而在半年度 报告和年度报告中,则公布期末所有股票的持仓明细。证监会在《证券投资基金信息披露管理办法》中,对于基金管理人定期报告公布时间及 公布持仓数据的范围的规定如下:
表 1:公募基金各类型定期报告公布时滞和内容范围 季度报告 半年度报告 年度报告 15 个工作日内 60 日内 90 日内 重仓股持仓数据(前 10 只) 全部持仓数据 全部持仓数据
资料来源:证监会官网公告、招商证券整理
我们统计了 2018 年 Wind 开放式基金分类下,普通股票型基金 2018 年实际公布定期 报告的之后天数均值,展示如下:
图 1 股票型基金各类定期报告实际平均时滞天数(2018 年)
\n
资料来源:招商证券、Wind 资讯
从图 1 中可以看出,基金公司的定期报告存在较大的时滞性,要知道完整的持仓数据至 少要等待两个月及以上的时间。同时,定期报告中公布的数据是报告期末静态的快照数 据。投资者在进行因子暴露值观测的时候,其实更关心基金持仓和因子暴露值的变动数 据,而动态的数据是无法从报告中获取的。
季度报告相对及时一些,但季度报告只公布重仓股的持仓明细,于是我们统计了重仓股 市值占基金资产净值的比例均值。结果如下:
图 2 股票型基金重仓股市值占基金净资产净值比例均值
\n
资料来源:招商证券、Wind 资讯
2018 年股票型基金中,排名前十的重仓股比例均值基本维持在 43%左右。若直接用重 仓股数据代替全部持仓数据来计算基金在因子上的暴露,似乎不够严谨。基于上述这些 弊端,我们提出用基金净值数据和因子收益数据来反推基金因子暴露的想法。
净值数据反推因子暴露构想
由于传统的通过定期报告获取持仓数据,继而计算因子暴露数据的方法存在滞后性强、 静态局限的问题,我们决定从基金的净值出发来反向推算基金在各因子上的暴露。
我们认为基金的净值走势中,包含了其在因子上的暴露值信息。一般而言,若基金 N 在因子 A 上暴露值越多的话,那么基金 N 的收益会与因子 A 的收益越像。极端地,若 基金 N 是因子 A 的纯因子组合,则基金 N 的净值线与因子 A 的累积收益曲线完全一致。
因此,我们可以通过基金的净值线与因子的收益曲线来反推基金在因子上的暴露。并使 用 LSTM 来完成反推。
LSTM 算法介绍
LSTM 即长短期记忆网络(Long Short-Term Memory),是一种时间循环神经网络(RNN),循环神经网络适合于处理和预测时间序列问题。LSTM 是在原有的 RNN 的 神经网络上进行了神经元结构改造,在每个神经元中引入了三个“门”,分别叫做输入 门、遗忘门和输出门,用于数据的筛选和保留。
循环神经网络(RNN)
一般的神经网络不具备像人一样的思维延续性。为了能使机器像人一样连续思考,科学 家在原有的前馈神经网络中加入了内部反馈链接。在 RNN 的网络下,计算机一来是接 收新样本的数据,二来是接收模型内部的反馈信息。举例来说,如预测下一个时点的空 气污染指数,那么当下时点的气温、降水量、风速等(新样本信息)有助于预测下一时 点的空气污染指数,同时,历史时点上的空气污染指数(内部反馈数据)也对下一个时 点的污染指数有预测作用。
但是 RNN 在刚出现的时候是难以被训练的,存在“梯度爆炸”(Exploding Gradients) 和“梯度消失”(Vanishing Gradient)的问题。梯度爆炸指在深层网络或递归神经网络 中,误差梯度在更新中累积得到一个非常大的梯度,这样的梯度会大幅度更新网络参数, 进而导致网络不稳定。梯度消失则指当在做反向传播,计算损失函数对权重的梯度时, 随着越向后传播,梯度变得越来越小,这就意味着在网络的前面一些层的神经元,会比 后面的训练的要慢很多,甚至不会变化。
这两个问题导致 RNN 在刚出现的时候难以训练。为了解决上述问题,于是又发明了LSTM。
长短期记忆神经网络(LSTM)
LSTM 由在原有的 RNN 的基础上添加了输入门、遗忘门与输出门。输入门决定数据是 否能进入区块进行数据的迭代;遗忘门在一定条件下会重置区块中的数据;输出门则控 制区块中的数据能否输出。LSTM 能处理好梯度消失和梯度爆炸的问题,现在已经得到 非常广泛的应用,在连续手写识别和语音识别中有优异表现。
图 3 LSTM 网络神经元示意图
资料来源:维基百科、招商证券金融工程组整理
标签处理和特征变量选取
监督式学习(Supervised learning),是机器学习的一种方法,可以由训练资料中学到 或建立一个模型,并依此模型推测新的实例。本文的模型采用监督式学习,因而在模型 的训练阶段,需要同时将标签数据和特征变量数据喂给模型。
标签处理
在监督式学习中,标签指样本的“答案”或“结果”部分。有标签数据集中的每个样本 都包含一个或多个特征以及一个标签。基金的因子暴露是本例中的标签。
前文说到,我们能实际获取到的标签是基金的季度报告数据以及半年度和年度报告的数 据。而季度报告中由于只公布重仓股数据,代表性较弱。这里我们暂定使用半年度和年 度报告中的数据,并使用简单线性插值的方法来填充非报告期的周频数据。
表 2: 标签数据线性插值方法数据示意 时间 第 1 周 第 2 周 第 3 周 第 4 周 第 5 周 第 6 周 第 7 周 暴露度 1 3 5 7 6.5 6 5.5 是否已知 已知 未知 未知 已知 未知 未知 已知
资料来源:招商证券金工组整理
上表是插值法的示意,譬如我们知道基金 N 在因子 A 上的第 1 周的暴露度为 1,第 4周暴露度为 7。中间两周缺失值以简单线性方式填充。除了线性插值法简单容易理解的特点之外,我们用此方法进行缺失值填充,还有以下两点理由。
- 现实中,A 股交易存在交易成本,基金经理在短期内做出骤变式调仓的成本较高。
- 大部分公募基金经理投资风格相对稳健,不会在短期内做出颠覆性的变化。基于上述原因,我们对数据进行了插值填充。图 4 某只真实基金经过线性插值之后的暴 露度走势。
图 4 单只基金经过插值之后的规模类因子暴露度走势示意
\n
资料来源:招商证券、Wind 资讯
同时,为了满足 LSTM 数据格式和数据量的要求,对基金数据进行了拼接,即将全部基 金数据,头尾相接,拼接在一起。算法对于基金暴露度的计算,是根据基金净值走势和因子收益走势的异同来进行反推的。 对于不同的基金,其计算逻辑是相同的,于是,可以将不同基金的数据进行拼接后喂给 模型。拼接的做法可能会引起一个担忧:这种做法似乎会让机器将多个基金数据误以为是单个 基金的数据,从而使计算出现偏差。但是在实际测试的时候,发现在基金拼接处,数据 发生跳跃变化的时候,机器的反应还是比较快的。如图 5 所示:
图 5 算法在基金拼接处暴露度跳点敏感度示意
\n
资料来源:招商证券、Wind 资讯
图 5 蓝色折线表示基金的真实暴露度走势,红色折线表示机器根据特征变量反算的基金 暴露值。在同一只的基金的内部,暴露值是连续变化的(蓝色折线连续),而在基金的 拼接处(紫色框内),会出现跳点。从红色折线的反应来看,机器反应还是比较灵敏, 只需要一到两周时间,就可以从上一只基金的暴露值切换到下一只基金的暴露值。上述 的担忧在实际操作中,影响并不显著。
特征变量选取
理论而言,我们可以将基金的净值数据和因子的收益数据直接丢给模型,在样本量充足 的情况下,机器可以自己学习出两者之间的相似性,从而反推出基金在因子上的暴露。 在实际操作中,可能是由于样本量还不够充足的原因,直接将基金的净值数据和因子的 收益数据直接丢给模型的效果并不理想。为了提升模型的准确性,我们利用基金的净值数据和因子的收益数据计算了 13 个特征 变量。这 13 个特征变量全部是通过基金的净值(具体利用基金的复权净值增长率)和因子的 收益率计算的。其中,因子的收益率计算流程如下:
因子暴露度计算参照 BARRA CNE5 中风格因子暴露度的计算公式;
剔除市值最小的 20%的个股以防止壳价值污染给因子收益估计造成不良影响;
在每周最后一个交易日进行横截面 WLS 估计,被解释变量为股票池个股下一周的 收益序列,解释变量为股票池个股截面日上的暴露度序列。
根据基金净值数据与因子收益数据计算如下特征变量:
表 3:特征变量罗列表
特征名称 特征释义 ret_diff 因基金周收益率和因子周收益率之差 ret_corr_4week 前 4 周基金周收益率和因子周收益率之间的相关系数 ret_corr_8week 前 8 周基金周收益率和因子周收益率之间的相关系数 ret_corr_12week 前 12 周基金周收益率和因子周收益率之间的相关系数 ret_corr_24week 前 24 周基金周收益率和因子周收益率之间的相关系数 re_RSS_4week 前 4 周因子周收益率对基金周收益率回归所得残差平方和 re_BETA_8week 前 8 周因子周收益率对基金周收益率回归所得斜率系数 re_RSS_8week 前 8 周因子周收益率对基金周收益率回归所得残差平方和 re_BETA_12week 前 12 周因子周收益率对基金周收益率回归所得斜率系数 re_RSS_12week 前 12 周因子周收益率对基金周收益率回归所得残差平方和 re_BETA_24week 前 24 周因子周收益率对基金周收益率回归所得斜率系数 re_RSS_24week 前 24 周因子周收益率对基金周收益率回归所得残差平方和
资料来源:招商证券金融工程组整理
以上基金的基金周收益用基金复权净值增长率刻画,这些特征变量的选择是符合理性逻 辑,也是比较直觉。我们试图通过基金净值走势与因子收益走势的相似性来找出基金在 因子上的暴露,选择的这些特征变量都是用来刻画两者之间的异同的。除了上述 13 个特征变量以外,我们还人为产生了一个特征变量,该特征变量在基金的 拼接处取值为 1,非拼接处取值为 0,该变量存在的目的是帮助机器去判断基金是否发 生了改变。因而总共有“13+1”个特征变量。
模型的训练
在机器学习的中,尤其是深度学习中,需要防止“欠拟合”(underfitting)和“过拟合”(overfitting)的出现。
欠拟合是指模型不能在训练集合上获得足够低的误差。而过拟合则指训练误差和测试误 差之间差异太大,训练误差不断降低而测试集上的误差并未下降,甚至反而增大了。欠 拟合与过拟合的衡量依据是模型的泛化能力(generalization ability)。
泛化能力是指机器学习算法对新鲜样本的适应能力。学习的目的是学到隐含在数据对背 后的规律,对具有同一规律的学习集以外的数据,经过训练的网络也能给出合适的输出, 该能力称为泛化能力。
图 6 过拟合与欠拟合的图形示意
\n
资料来源:招商证券金融工程组整理
由于现在的样本量和算力较过去已有了大幅提升,模型主要提防的是过拟合的出现。为 此我们采用了交叉验证(Cross-validation)。交叉验证的做法其实是在原有的测试集和 训练集划分的基础上,将训练集再平均划分成 k 份,而后每次模型学习时使用 k-1 个份 中的数据, 最后剩下的一份数据会用于测试, 这份用于测试的数据称作验证集(validation set)。
图 7 K-折交叉验证方法示意图
\n
资料来源:scikit-learn 官网
图 8 深度学习神经网络结构图
\n
资料来源:招商证券金融工程组
该神经网络由两个隐藏层组成,第一层是 LSTM 层,第二层是全连接层。输入数据的维 度是 4×14,即 14 个特征变量,同时往回看 4 周数据。输出的数据是个标量,指的是 当下时点上,基金在某个因子上的暴露值。其他超参数(hyperparameter,在开始学习过程之前设置值的参数,而不是通过训练得 到的参数数据。如学习速率是一个超参数。通常情况下,需要对超参数进行优化)的设 置如下:
表 4: 神经网络中其他超参数设置表
超参数名称 取值 batch_size 72 学习速度 0.01 优化器 Adam 损失函数 MAE Epoch 200
资料来源:招商证券金融工程组
数据选取和结果展示
我们选择了 Wind 开放式基金分类下的普通股票型基金,截止 2019 年 2 月,能用于模 型训练的股票型基金数量共 267 只。
数据的窗口期是 2007 年 1 月至 2019 年 2 月。
进行插值、剔除缺失值之后,能用于模型训练和测试的样本容量共 35866 条。
将 28438 条(约 80%)作为训练集,进行训练;剩下 7428 条(约 20%)作为测 试集,在验证集上进行评估。
以规模类因子(标准化后的流通市值的自然对数)为例进行模型训练和评估。基金的因子暴露度按照持仓股票的市值加权。 训练结果如下:
图 9 模型在训练集与验证集中训练的误差走势图
资料来源:招商证券、Wind 资讯
最后在测试集合中评估模型的结果。在测试集中,误差 MAE 为 0.109。我们将测试集 中剩下基金剔除存续期小于 1 年的基金,剩下 66 只,并将这 66 只基金的预测结果进 行绘图展示。
\n
图 10 至图 20,纵轴代表基金在规模因子上的归一化暴露度,横轴代表基金的存续周数。 蓝色折线代表基金在规模类因子上的真实的暴露度走势,橙色折线代表 LSTM 算法预测 的走势线。图 10 至图 20 中的 66 个基金均为真实基金,报告中我们将基金名称和代码 隐去。
图 10 至图 20 是按照预测误差从小到大排列。图片显示,已经有不少测试集里的基金 被较好的拟合。拟合的改进处主要有两点。
第一点是基金暴露值的预测值与实际值在绝对值上相近。此处说的相近主要是针对传统 的线性回归法而言的。传统的线性回归方法也时常被应用于反推基金在某个因子上的暴 露:用因子收益序列作为解释变量,基金的收益序列作为被解释变量进行回归,用回归 系数来代指因子暴露。但这种做法其实并没有十分坚实的背后逻辑。回归所得的系数仅 能代表解释变量和被解释变量之间的某种相关关系,而真实的基金因子暴露应该是根据 持仓股票的暴露度和持仓比例来加权计算的。回归所得系数和加权计算的基金暴露度在 绝对值上往往有较大差异。事实上,回归系数和暴露度之间其实还有一层映射关系,这 是线性回归模型没有解决的。我们在训练 LSTM 的时候喂给模型的标签是基金因子的暴 露度数据,因而模型在预测的时候返回的也是暴露度数据,从而免去了探讨回归系数和 暴露度之间那层映射关系的问题。而在数值上来看,目前的训练结果已经在数值的绝对 值上有较好的拟合。
第二点是对于暴露度的变化有较快的反应。图 10 至图 20 大部分子图片显示,当基金 的暴露度发生变化,尤其是较大变化的时候,相比较于传统的根据定期报告数据跟踪基 金因子暴露度变化的方法,LSTM 方法在灵敏度上有较大的提升。
当然仍有些测试集中的基金没有得到较好的拟合。这些失败的案例有些是预测值与真实 之间的趋势能对应上,而在绝对值上有显著差异;另一些则是没有准确预测基金暴露度 的变化趋势。
结论
对于基金在各因子上的暴露度迁移的研究,有利于我们对目标基金进行研究。不管是对 基金进行因子业绩归因还是波动率拆解,都需要我们对基金在各因子暴露度有所了解。
证监会要求基金公司发布的定期报告的时间与报告期期末截点存在较长的时滞,而且定 期报告存在公布频率低、重仓股代表性较弱的问题。因而使用定期报告中的持仓明细来 计算基金因子暴露的方法存在一些局限性。
我们尝试使用 LSTM 算法,根据基金的净值数据和因子的收益数据来反推基金在某个因 子上的暴露。由于 LSTM 是从循环神经网络(RNN)算法发展而来的,在时间序列的 处理上存在优势,同时,又克服了传统 RNN 难以被训练的难题,因而成为我们反算基 金因子暴露的首选算法。
我们根据直观逻辑选择了相关系数、回归系数等特征变量,搭建神经网络模型。根据训 练结果对几个必要的超参数进行调整。在测试集上进行最后评估。
以规模类因子为例,在测试集上的 MAE 为 0.109。预测结果在绝对值对应和暴露度变 化的敏感度上,较之线性回归都有较大的改善。
当然,模型还是存在较大的改进空间。首先,公募基金的季度报告数据没有得到使用。 尽管季报数据只是公布了重仓股的持股明细,但是却公布了全部的持仓股票的行业分布, 通过一些方法可以进行应用成辅助判断条件。第二,神经网络的模型也可以进行进一步的调整。
模拟基金方法的失败及思考
模拟基金法介绍
在我们使用简单线性插值法来补充样本之前,我们曾经试图使用模拟基金法来克服样本 不足的问题。实际做法是让程序随机产生众多“假基金(Fake Fund)”,然后模拟基民 买卖基金的行为和基金经理调仓的行为,记录每期的持仓数据,净值数据,并计算假基 金的因子暴露度数据。
随着算力的提升,人工智能方法又一次成为大家追捧的热点,但它对于样本量的要求也 远大于其他非人工智能算法。用人工产生是样本来弥补样本量不足的做法在人工智能领 域被普遍采用。比如在做图像识别的时候,若样本量不足,可以将原有的图像样本进行 旋转、镜面反射等变换,产生新的样本。而且在实践中也被证明这种方法是奏效的。效 仿这种做法,我们使用了模拟基金法,以下是程序产生假基金的流程。
图 21 模拟基金法产生假基金的流程图
\n
资料来源:招商证券金融工程组整理
通过随机函数,初始化基金及其初始仓位,模拟基民买卖股票导致基金净资产变动,以 随机方法模拟基金经理调仓行为,最终产生 1000 只假基金。以下是 1000 只假基金中随机选取 5 只基金,净值走势线如下所示:
图 22 模拟基金法产生基金的净值走势图
\n
资料来源:招商证券、Wind 资讯
若单纯只看净值走势线的话,几乎难以分辨是模拟出来的假基金还是真实基金。我们用 这 1000 个假基金样本作为训练集来训练模型,将真实基金作为测试集来评估模型。
图 23 模拟基金法训练集预测结果展示(随机截取)
\n
资料来源:招商证券、Wind 资讯
在训练集内,反算出来的规模因子暴露度和假基金在规模因子上的暴露度拟合得很好。 但是将这个模型放到测试集(真实基金样本)中进行评估的时候,效果却十分不理想。 如图 24 至图 27 所示:
\n
图 24 至图 27 中,红色散点代表真实基金规模因子的暴露度,蓝色折线为预测值。显 示模型基本没有预测能力。模拟基金法训练出来的模型在难以应用于实际。
关于模拟基金法失败原因的思考
事实证明无法通过构造模拟基金的方法来弥补样本容量过小的缺陷。尽管在模拟基金本 身的集合内取得了较好的预测效果,但是在真实基金的预测中泛化能力并不理想。
究其缘由,我们觉得主要原因是通过简单的模拟构造出来的基金总体与现实中基金总体 差距较远。我们选用正态分布进行随机调仓,A 股市场上所有的个股被买入的可能性都 是相等的,但是在真实环境下,基金经理买到某只个股的可能性在 A 股市场上必定不是 等概率分布的,基金经理更有可能根据某个依据来买股票,比如更加可能买入基准中的 成分股。
得益于大数据背景和算力的提升,近年来,人工智能在图像识别和语音识别等领域大放异彩,人工智能在金融投资领域也相继被采用,但是由于金融投资领域的特殊性,一些 在其他领域被经常使用的方法却不能直接照搬过来。在与买方客户的交流过程中,大部 分投资者都表示相信人工智能必然会在金融投资领域得到广泛应用,但是其中还有很多 方面需要我们去探索和完善,提出能专门适用于金融投资领域的方法。
作者:招商证券金融工程研究组