Press "Enter" to skip to content

比特币:使用深度强化学习和贝叶斯优化获得巨额利润(附代码)

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

 

我们使用深度强化学习来创建不会赔钱的比特币交易机器人。虽然agent是盈利的,但结果并没有那幺令人满意,所以这次我们要更进一步,大幅提高模型的盈利能力。我们将首先改进我们的模型并设计一些更好的特征供我们的agent学习,然后我们将使用贝叶斯优化法来定位最有利可图的超参数。简而言之:

 

贝叶斯优化是一种高效搜索超空间的方法,它可以找到使给定目标函数最大化的一组参数。

 

简单地说,贝叶斯优化是一种改进任何黑箱模型的有效方法。它通过使用agent函数或agent函数的分布对对要优化的目标函数进行建模。随着时间的推移,这种分布会得到改善,因为算法会在产生最大价值的区域中探索超空间和区域。

 

上面的算法如何适用于我们的比特币交易机器人?本质上,我们可以使用这种方法来找到一组超参数,使我们的模型最有利可图。

 

好比我们在大海捞针,贝叶斯优化就是我们的磁铁。 让我们开始吧!

 

在优化超参数之前,我们要做的第一件事是对上一篇文章中编写的代码做一些改进。 最新修改代码文末获取。

 

递归网络

 

我们需要做的第一个改变是更新我们的策略, 使用LSTM网络来代替我们之前的多层感知器(MLP)网络 。由于递归网络能够随着时间的推移保持内部状态,我们不再需要一个滑动的“look-back”窗口来捕捉价格的运动。相反,它本质上是由网络的递归特性捕获的。在每个时间步长,数据集的输入和最后一个时间步长的输出都被传递到算法中。

 

 

这允许LSTM维护一个内部状态,当agent“记住”和“忘记”特定的数据关系时,该状态在每次执行步骤时更新。

 

 

图片来自:

 

Recurrent neural networks and LSTM tutorial in Python and TensorFlow

 

数据平稳性

 

上一篇文章也向我指出,我们的数据非平稳的,因此,任何机器学习模型都很难预测未来的值。最重要的是,我们的时间序列包含明显的趋势和季节性,这两个因素都会影响我们算法准确预测时间序列的能力。我们可以通过使用差分和变换方法从现有的时间序列中得到一个更加正态分布来解决这个问题。

 

差分可以消除趋势,但是数据仍然具有明显的季节性。我们可以试着通过在差分前的每个时间步上取对数来去除它,这样操作,我们可以得到平稳的时间序列,如下图所示。

 

 

我们可以通过增广迪基-福勒检验(Augmented Dickey-Fuller test)简称ADF检验,来验证产生的时间序列是否平稳。这样做得到p值0,允许我们拒绝原假设,并确认时间序列是平稳的。

 

 

特征工程

 

为了进一步改进我们的模型,我们将做一些特征工程。

 

特征工程是使用领域特定的知识来创建额外的输入数据,从而改进机器学习模型的过程。

 

在我们的示例中,我们将向数据集以及StatsModels SARIMAX预测模型的输出添加一些常见但有洞察力的技术指标。 这些特征功能组合应该为我们的模型提供有用的观察结果,以便我们学习。

 

https://www.statsmodels.org/dev/generated/statsmodels.tsa.statespace.sarimax.SARIMAX.html

 

技术分析

 

为了选择我们的技术指标集,我们将比较ta中所有32个指标(58个特征)的相关性。我们可以使用pandas来找出同一类型各个指标之间的相关性(动量、成交量、趋势、波动性),然后从每个类型中选择相关性最小的指标作为特征。从而不会给我们的观测空间增加太多的噪音。

 

https://github.com/bukosabino/ta

 

 

 

BTC数据集技术指标相关性图

 

事实证明,波动性指标都是高度相关的,还有一些动量指标。当我们删除所有重复的特征(在它们组中具有绝对平均相关性> 0.5的特征)时,我们只剩下38个技术特征可以添加到我们的观察空间中。这是完美的,因此我们将创建一个名为add_indicators的方法来将这些特征添加到我们的数据框中,并在环境的初始化中调用它,以避免在每个时间步上计算这些值。

 

 

统计分析

 

接下来,我们需要添加预测模型。我们选择使用季节性自回归综合移动平均(SARIMA)模型来提供价格预测,因为它可以在我们的数据集上非常快的计算出每一步。它实现起来很简单,允许我们创建一个置信区间对其未来进行预测,这通常比单个值更具洞察力。例如,我们的agent可以学会在置信区间较小的时候更加谨慎地信任预测,在置信区间较大的时候承担更多的风险。

 

 

现在我们已经更新了我们的策略,使用一个更适用的、递归的网络,并通过上下文特征工程改进了我们的观察空间,是时候优化所有的东西了。

 

奖励优化

 

有人可能认为我们从上一篇文章中得到的奖励功能(即奖励增加的净资产收益)是我们能做的最好的事情,然而,进一步的研究表明这远非事实。虽然我们上次的简单奖励功能能够盈利,但它产生的不稳定策略往往导致资本的严重损失。为了改进这一点,我们将需要考虑其他指标来奖励,而不仅仅是未实现的利润。

 

对这一策略的一个简单改进不仅在BTC股价上涨时奖励其持有BTC的利润,而且在BTC股价下跌时奖励其不持有BTC的利润。例如,我们可以奖励agent在持有BTC/USD头寸时净资产的任何增量增长,以及在不持有任何头寸时BTC/USD的增量下降。

 

虽然这种策略在奖励增加回报方面非常出色,但它没有考虑到产生这些高回报的风险。

 

Volatility-Based指标

 

最常见的风险调整回报率指标是 夏普比率 。要保持较高的夏普比率,投资必须同时具有高回报和低波动性(即风险)。计算方法如下:

 

该指标经受住了时间的考验,但就我们的目的而言,它也有缺陷,因为它惩罚了上行波动。对于比特币来说,这可能是有问题的,因为上行波动(剧烈的价格上行运动)往往是相当有利可图的。这就引出了我们将与我们的agent一起测试的第一个奖励指标。

 

Sortino比率 与夏普比率非常相似,只是它只将下行波动视为风险,而不是整体波动。因此,这一比率不会对上行波动造成不利影响:

 

其他指标

 

我们将在这个数据集上测试的第二个奖励指标是Calmar比率。到目前为止,我们的所有指标都没有考虑到缩减。亏损是衡量一个投资组合从峰值到低谷具体价值损失的指标。大规模减持可能不利于成功的交易策略,因为长期的高回报可能很快被突然的大幅减持逆转。

 

 

为鼓励积极防止大规模资本削减的策略,我们可以使用一个奖励指标,专门解释这些资本损失,比如 Calmar比率 。这个比率与夏普比率相同,不同之处在于它使用了最大的下降量来代替投资组合价值的标准差。

 

最后一个度量标准,在对冲基金行业被大量使用,从理论上讲, Omega比率 在衡量风险与回报之间的关系上应该优于Sortino和Calmar比率,因为它能够在一个单一的指标中反映出整个风险高于回报的分布。要找到它,我们需要计算一个投资组合高于或低于特定基准的概率分布,然后取二者之比。比率越高,上行潜力超过下行潜力的可能性就越大。

 

 

虽然为这些奖励指标编写代码听起来很有趣,但我们选择使用 empyrical 库来计算它们。幸运的是,这个库恰好包含了我们在上面定义的三个奖励指标。

 

https://github.com/quantopian/empyrical

 

 

 

既然我们已经决定了如何衡量一个成功的交易策略,现在是时候找出这些指标中哪一个能产生最吸引人的结果了。 让我们将这些奖励函数中的每一个都插入Optuna中,并使用贝叶斯优化来为我们的数据集找到最佳策略。

 

任何优秀的技术人员都需要优秀的工具集。我们不是重新发明轮子,而是要利用我们前辈们的总结。对于今天的工作,我们最重要的工具将是 O ptuna库 ,它使用树结构Parzen Estimators (TPEs)实现贝叶斯优化。TPEs是并行的,这让我们可以利用我们的GPU,大大减少了我们的整体搜索时间。

 

 

https://papers.nips.cc/paper/4443-algorithms-for-hyper-parameter-optimization.pdf

 

Optuna

 

使用Optuna优化超参数相当简单。首先,我们需要创建一个Optuna study,它是所有超参数试验的父容器。一项试验包含超参数的特定配置及其由目标函数产生的成本。然后我们可以调用 study. optimization() 并传递我们的目标函数,Optuna将使用贝叶斯优化来找到产生最低成本的超参数的配置。

 

 

在这种情况下,我们的目标函数包括在比特币交易环境中训练和测试我们的PPO2模型。我们从函数中返回的成本是测试期间的平均回报,为负数。我们需要否定平均回报,因为Optuna把低回报解释为更好的试验。优化函数为我们的目标函数提供了一个试验对象,然后我们使用该对象指定要优化的每个变量。

 

 

optimize_ppo2() 和optimize_envs()方法方法接受试验对象并返回要测试的参数字典。每个变量的搜索空间由我们在试验中调用的特定 suggest 函数以及传递给该函数的参数定义。

 

https://optuna.readthedocs.io/en/stable/tutorial/configurations.html#defining-parameter-spaces

 

例如, trial.suggest_loguniform(‘n_steps’,16,2048) 将以对数方式建议16 – 2048之间的新浮点数(16,32,64,…,1024,2048)。此外, trial.suggest_uniform(‘cliprange’,0.1,0.4) 将以一种简单的添加方式(0.1,0.2,0.3,0.4) suggest 浮点数。这里我们不使用它,但Optuna还提供了一种 suggest 分类变量的方法: su ggest_categorical(‘categorical’, [‘option_one’, ‘ option_two’)) 。

 

 

 

稍后,在使用合适的CPU/GPU组合在运行优化函数之后,我们可以从告诉Optuna创建的sqlite数据库加载研究。该研究从测试中跟踪最佳试验,我们可以使用这些测试为我们的环境获取最佳的超参数集。

 

 

我们已经修改了我们的模型,改进了我们的特征集,并优化了我们所有的超参数。现在是时候看看我们的agent如何使用他们的新奖励机制了。我们训练了一个agents来优化四个回报指标:简单利润、Sortino比率、Calmar比率和Omega比率。让我们在一个测试环境中运行这些优化的agent程序,这个测试环境使用未经训练的价格数据初始化,并查看它们是否有利可图。

 

在我们看结果之前,我们需要知道一个成功的交易策略是什幺样的。我们将以几个常见但有效的比特币盈利交易策略作为基准。信不信由你, 在过去的十年里,BTC最有效的交易策略之一就是简单的 买入并持有 。我们将测试的另外两种策略使用非常简单但有效的技术分析来创建买进和卖出信号。

 

1、买入并持有策略

 

这样做的目的是尽可能多地买进股票。虽然这一战略并不特别复杂,但它过去的成功率很高。

 

2、RSI策略

 

当RSI继续下跌,连续的收盘价继续上涨时,一个负的趋势反转(卖出)信号就出现了。当RSI连续上涨而收盘价连续下跌时,就发出了正趋势逆转(买入)的信号。

 

3、 简单均线(SMA)策略

 

当长期移动平均线高于短期移动平均线时,一个负的趋势逆转(卖出)信号就出现了。当短期移动平均线高于长期移动平均线时,一个积极的趋势逆转(买入)信号就出现了。

 

测试这些的目的是证明我们的深度强化学习agent实际上正在市场上创建alpha。

 

如果我们不能超越这些简单的基准测试,那幺我们就浪费了无数的开发时间和GPU,只是为了做一个很酷的科学项目。

 

没意思~没意思~

 

让我们来证明不是这样的。

 

首先,我们有了Omega策略,它最终对我们的数据集毫无用处。

 

 

基于omega平均净资产超过3500小时的交易

 

观察这种agent交易,很明显,这种奖励机制产生了过度交易的策略,无法利用市场机会。基于Calmar的策略比基于Omegat的策略有一个小的改进,但最终非常相似。看起来我们已经投入了大量的时间和精力,只是为了让事情变得更糟……

 

 

然后是基于old friend的策略,简单的增量利润。虽然在我们的上一篇文章中没有证明这种奖励机制非常成功,但是我们所做的所有修改和优化似乎都极大地提高了agent的成功。在四个月的测试期内,平均利润仅略高于初始账户余额的350%。如果你不知道平均市场回报率,这种结果绝对是疯狂的。当然,这是我们能做的最好的强化学习?

 

 

Sortino,OG,抢尽风头。基于Sortino比率的 平均利润接近850% 。当我们看到这些策略的成功时,必须快速检查以确保没有错误。经 过彻底的检查,很明显代码是没有bug的,这些agent真的非常擅长交易比特币。

 

 

这些agents似乎明白了低买高卖的重要性,同时将持有比特币的风险降至最低,而不是过度交易和资本不足。如果你们不相信,自己看吧:

 

 

注意agent是如何在价格大幅上涨之前买进(绿色三角形)一堆,然后在价格上涨时卖出(红色三角形)的。agents似乎已经明白,应该尽早获利,不要在交易中陷得太久。不管这些agent学会了什幺具体策略,我们的交易机器人显然已经学会了如何有利可图地交易比特币。

 

这些测试的成功可能并不适用于实时交易。尽管如此, 这些结果远比我们迄今所见的任何算法交易策略都令人印象深刻。考虑到这些agents事先没有获得如何盈利的交易知识,而是学会了通过反复试验获得巨大成功,通过大量的反复试验得来的!这确实令人惊讶。

 

在本文中,我们优化了我们的比特币交易深度强化学习agent,以便做出更好的决策,这花了不少功夫,但我们做到了以下几点:

 

1、升级我们现有的模型,使用具有平稳数据的周期性LSTM策略网络

 

2、为我们的agent设计了40多个新特征,以学习使用领域特定的技术和统计分析。

 

3、为了考虑风险改进agents的奖励制度,而不仅仅是利润。

 

4、利用贝叶斯优化对模型的超参数进行了微调。

 

5、以共同交易策略为基准,以确保我们总是能击败市场。

 

理论上,一个高利润的交易机器人很棒。然而,我收到了相当多的反馈,称这些agent只是在学习适应曲线,因此,在实时数据上进行交易永远不会有利可图。虽然我们对单独数据集的训练/测试方法应该解决这个问题,但是我们的模型确实可能对这个数据集过度拟合,并且可能不能很好地推广到新数据。话虽如此,我们感觉这些agents学到的不仅仅是简单的曲线拟合,因此,他们能够在真实的交易环境中获利。

Be First to Comment

发表评论

邮箱地址不会被公开。 必填项已用*标注