机器学习是未能完全解决的一个领域是股票预测,因为它可能是最有利可图的研究领域之一所以在这方面的研究仍然在继续。投资者希望能够放心地把钱投在表现优异的公司,随着投资的增加,公司的发展也将会突飞猛进,投资的收益也会增长。
在过去的研究中,出现了而很多的方式,但这些方式和方法并不是很成功,所以本文将这个领域的研究扩展到GANs。看看GANs这个领域是否能够进行预测。
虽然kaggle中的预测JPX市场预测是一个非常好的数据集,但是他的数据集需要在kaggle上进行预测和提交,所以这里使用使用他的子集并且指定针对于本文测试的指标进行测试,这样可以显示出我们这次研究的真正表现。
在真正开始之前首先将为所有模型实现相同的预处理方法和评分指标。然后从一个预期性能较差的线性回归基线模型开始并将此作为最小基线。然后尝试着优化XGBoost模型和CAT boost模型,将这两个模型叠加在一起(复现比赛中排名较高的模型),目标是实现比最佳模型更高的模型。在此之后,将探索GANs解决方案,看看GANs能达到什么样的结果。
数据集将被拆分为过去的训练数据和最近的测试数据。其中所有提取和工程特征保持这个拆分,这将确保不会出现数据泄露的问题。我们将使用夏普比率(Sharpe Ratio),这几乎是在人力资源管理和人力投资策略评分中普遍使用的评分指标。夏普比率是由诺贝尔奖得主威廉·f·夏普(William F. Sharpe)提出的,用于帮助投资者了解投资回报与风险的比例。该比率是每单位波动率或总风险的无风险率以外的平均收益。波动性是对资产或投资组合价格波动的衡量。夏普比率根据投资者承担的超额风险,调整投资组合的过去表现或未来预期表现。与回报率较低的类似投资组合或基金相比,较高的夏普比率是好事。但是夏普比率有几个弱点,包括投资回报是正态分布的假设,这里就不进行详细解释了。
数据预处理与特征工程
在金融技术分析领域,技术指标是指基于历史价格、交易量或证券或合同未平仓量的数学计算或模式信号,通过和谐指标可以预测金融市场方向。对于数据科学家来说这被称为特征工程,本项目采用某领域专家提出的顶级技术指标作为我们的特征:7天和21天的移动平均线、指数移动平均线、对数动量、Bollinger bands 和MACD等等。傅里叶变换是一种时间序列数据的处理常用方法,它可以抑制数据中的统计异常,并已被证明允许gru(在我们的GANs模型中使用)学习更健壮的模式。
我们的目标预测是股票的收盘价,上面的图中我们很难能够理解过去的数据能够很好的预测未来的数据,但当我们用自相关进行统计分析时(自相关是指同一变量在两个连续时间间隔之间的相关程度。它衡量一个变量值的滞后版本与它在时间序列中的原始版本之间的关系),我们使用滞后参数100,得到以下强正相关,这意味着我们的预测模型有望取得良好的结果:
在所有这些预处理之后,我们就可以训练不同的模型并得到我们的结果了。
线性回归
线性回归我们的验证Sharpe为0.44,它接近Numerai文章能够实现的目标0.49。对于所有这些模型,我们将数据分为训练和测试集,并在特定日使用股票市场的技术指标,以确定第二天股票市场的收盘价。
超参数调整算法
我们选择使用一种定制的二进制搜索算法,它可以快速搜索可能的超参数值空间。结合手工模型调优的知识,我们觉得比使用暴力搜索所有超参数组合(比如典型的网格搜索)获得更好的结果。这让我们能够对设计进行改进,并在测试中快速转向。
XGBoost
对于XGBoost,我们发现向模型添加超参数可以获得最佳性能。XGBoost的sharp得分只有0.71,但优化超参数后XGBoost模型的sharp得分为0.78。
CAT Boost
对于CAT Boost模型,我们看到CAT Boost的性能比参数化CAT Boost模型更好,并且sharpe得分最高为0.90,而Numerai文章中的数值为0.87。
堆叠模型
将超参数化的XGBoost模型和普通的CAT boost叠加在一起可以获得最佳结果,我们得到了一个分数为0.946,接近文章中的0.934。这个模型的工作原理是取两个模型之间的两个预测的平均值。
GANs
1、什么是GAN
生成对抗网络,简称GANs,是一种使用深度学习方法进行生成建模的方法,这是一种将生成新数据的非监督问题转化为监督问题的方法,在监督问题中,模型根据其结果的可信度评分。gan系统由鉴别器和生成器两个子模块组成。鉴别器在其学习过程中被输入两类图像,真实的和虚假的。它的工作是学习区分两者,然后为生成器提供相关信息,生成更现实的输出。
我们希望鉴别器能够很好地完成它的工作但又不能太好,因为如果太好生成器无论学习什么都不能欺骗它,为了实现这一点,我们必须设计一个具有良好架构的健壮网络。
2、WGAN-GP的改进
Wasserstein Gan +梯度惩罚或WGAN-GP是一种生成的对抗网络,使用Wasserstein损失以及梯度惩罚来实现Lipschitz的连续性[https://arxiv.org/abs/1904.01184]。这两个结合试图解决较以前模型的弱点。
Wasserstein距离(Earth Mover的距离)是给定度量空间上两个概率分布之间的距离度量,它可以看作是将一个分布转换为另一个分布所需的最低工作。它到处都是可微的这可以将训练模型到最佳的性能,并且足够稳定以避免训练崩溃(如果鉴别器饱和并变得太好了,梯度将消失至零这样将不会再进行收敛,WGAN在稳定的GAN训练方面取得了进展,但有时仍然可以仅产生低质量的样本或无法收敛),所以增加了梯度惩罚,这种损失函数就会将梯度限制在一定范围内,避免可能导致的梯度消失或爆炸梯度。
GP的引入是对这种剪切方法的替代,这种方法惩罚了关于输入的梯度并且可以与所有架构融合,只要进行很少超参数调优就能让训练的结果变得更稳定。
添加GRU
为了进一步改善的模型,我们希望使用类似LSTM的方式学习以某种方式捕捉学习中的时间特征。GRU作为正常卷积的替代可以更简单的设计和实现LSTM的大部分收益。GRU由一个重置门和更新门组成,可以理解为是LSTM的简化版本。
WGAN-GP如何应用在股票预测
我们使用WGAN-GP在上面预处理的数据上进行了训练获得了以下的结果:
1000.00usd =(End Portfolio:5327.83USD,Sharpe:0.819)
1000迭代后看起来还不错。但是当我们尝试验证将来的一组完全看不见的数据时,获得以下结果:
这是否意味着这个模型不可行呢?不完全是,原因可能如下。在对通常使用回归或lstm的其他类似工作的综述中,有几篇论文将COVID期作为数据中的异常因为这是史无前例的,并且使用了一个简单解决方案,即排除认为只是在掩盖问题的异常周期。但是这是一个过于简单的解释,因此我不会采用这种方法。
其实这里发生的事情是,未来数据对于当前模型来说是无法预测的,因为它超过了以前见过的任何事物的界限。如果你观察到训练的数据价格从未超过40USD。也就是说,其实我们没有对预测的价格进行归一化,所以我们将数据从USD转换为[-1,1]之间的缩放。
看看该假设和校正是否产生了更好的结果:
这显然是一个很差的结果,这里将其作为测试失败的报告。
使用window
我重新检查了核心假设,并意识到训练的方式与测试模型的方式不同。训练下的输入具有一定的窗口,而进行测试时并没有使用这个历史的window。所以我修改测试代码添加了这个window,最终得到以下结果:
可以看到现在的预测趋势时完全正确的,但预测的粒度明显较低。这是因为在确定有效策略时训练不足的结果。从500到5000次迭代在测试集中产生以下结果:
可以看到在相当长的一段时间内,我们的模型在完全看不见的数据上执行得几乎完美。模型能够在2017-07-12至2018-02-08(146天)期间将1000.00美元转换为1181.15美元,市盈率为1.52。模型随着时间的推移会在不同的地方出现分歧,但由于模型可以每个月左右根据新出现的数据和新趋势进行持续的再训练,甚至时每天晚上都可以收集数据,第二天开业前就可以做好预测。
总结
GANs网络不仅在图像处理领域,甚至在金融和股票预测领域也显示出前景。通过更多的调优和适当格式化预测的工作,这些GANs的结果可以与性能良好的回归器进行叠加,从而实现更好、更有弹性的预测。也可以提取整个网络的学习潜在空间,并将其用作回归模型的特征输入。总的来说,这些实验的结果是非常有希望的,并保证了该应用程序的更复杂的改进。
本文没有提供源代码,需要代码的可以问问作者,原文地址:
https://avoid.overfit.cn/post/d746ef7060ce41fb9a822f9768ea42a3
作者:AlphaFitness