资源技术动态最新的优化深度学习交易机器人技术

最新的优化深度学习交易机器人技术

2019-11-20 | |  124 |   0

原标题:最新的优化深度学习交易机器人技术

来源:AI 研习社         链接:https://www.yanxishe.com/TextTranslation/1785


在上一篇文章中,我们使用深度强化学习来创建不会亏本的比特币交易机器人。 虽然代理商有利可图,但结果并不尽如人意,所以这次我们要提升一个档次并大幅提高我们模型的盈利能力。 首先我们将改进模型并设计一些更好的功能供我们的代理学习,然后我们将使用一种称为贝叶斯优化的技术划分最有利可图的超参数。简而言之,贝叶斯优化是一种有效搜索超空间以找到最大化给定目标函数的参数集的技术。


更简单地说,贝叶斯优化是改进任何黑盒模型的有效方法。 它的工作原理是使用代理函数或代理函数的分布对要优化的目标函数进行建模。 随着算法对超空间的探索,并将产生最大价值的区域进行划分,该分布随着时间的推移不断改善。


该技术如何适用于我们的比特币交易机器人呢? 从本质上讲,我们可以使用这种技术找到一组超参数,使我们的模型利润最大化。 我们正在寻找大海捞针,贝叶斯优化是我们的磁铁。 让我们开始吧!

  

修改

在优化我们的超参数之前,我们要做的第一件事是对我们在上一篇文章中编写的代码进行一些改进。 如果您还没有代码,可以从我的GitHub中获取。

递归网络

我们要做的第一个改变是更新我们的策略,使用递归长期短期记忆(LSTM)网络代替我们之前的多层感知器(MLP)网络。 由于递归网络能够随着时间的推移保持内部状态,我们无需使用滑动的“回顾”窗口来捕获价格行为的动作。 相反,它本质上是由网络的递归性质捕获的。 在每个时间步,来自数据集的输入与最后一个时间步的输出一起被传递到算法中。

1574188270942757.png


来源: https://adventuresinmachinelearning.com/recurrent-neural-networks-lstm-tutorial-tensorflow/

这允许LSTM维持一个内部状态,即当代理“记住”并“忘记”特定数据关系时,该状态在每个时间步都会更新。

02.png

  

from stable_baselines.common.policies import MlpLstmPolicy    
model = PPO2(MlpLstmPolicy, train_env, tensorboard_log="./tensorboard")

在这里,我们使用MlpLstmPolicy更新我们的PPO2模型,以利用它的周期性。


平稳数据

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

差分是从该时间步的值减去每个时间步的导数(收益率)的过程。在本文例子中,可实现消除趋势的预期结果,但是,数据仍然具有明确的季节性。 我们可以尝试通过在差分之前的每个时间步长取对数来移除它,这产生最终的平稳时间序列,如下右图所示。

1574188337680626.jpeg


我们可以通过一个增广的Dickey-Fuller检验来验证产生的时间序列是平稳的。这样做得到p值0.00,允许我们拒绝检验的零假设,并确认时间序列是平稳的。 + 

from statsmodels.tsa.stattools import adfuller    
df['logged_and_diffed'] = np.log(df['Close']) - np.log(df['Close']).shift(1)    
result = adfuller(df['logged_and_diffed'].values[1:], autolag="AIC")    print('p-value: %f' % logged_and_diffed_result[1])


我们对转换后的数据集运行Augmented Dicker-Fuller测试,以确保平稳性。

现在我们完成了上述步骤,将使用一些特性工程进一步更新我们的观测空间。


特性工程

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

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

在我们的例子中,我们将向数据集添加一些常见的,但又有见地的技术指标,以及StatsModelsSarimax预测模型的输出。技术指标应增加一些相关信息,虽然对我们数据集而言是滞后的,但这将很好地补充从我们的预测模型得到的预测数据。这些特性组合可为我们模型提供有用的观察结果,以便进一步学习。

技术分析

为了选择技术指标,我们将比较TA库中所有32个指标(58个特征)的相关性。 我们可以使用pandas来查找相同类型的每个指标(动量,体积,趋势,波动率)之间的相关性,然后仅选择每种类型中最不相关的指标作为特征。 这样,我们可以尽情地利用这些技术指标,又不会给我们的观察空间增加太多噪音。

1574188398561693.jpg

BTC数据集上技术指标相关性的Seaborn热图


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

05.png


在这里,我们初始化我们的环境,将指示器添加到数据帧中,然后使其固定。 


数据分析

接下来将预测模型增添至数据框。我们选择使用季节性自回归综合移动平均(sarima)模型来提供价格预测,因为它可以在每个步骤快速计算,并且在平稳数据集上具有相当高的准确性。还有一个额外的好处就是它的实现非常简单,并可为未来预测创建一个置信区间,这往往比单个值更有洞察力。例如,当置信区间很小时,我们的代理可学会对预测持更谨慎信任的态度;当置信区间较大时,我们会承担更多的风险。

06.png


此处我们将sarimax预测和置信区间添加到观测空间中。

既然我们已更新了策略,使用一个更适用的递归网络,并通过上下文特性工程改进了观察空间,下一步将进行整体优化。


奖励优化

1574188493285674.jpeg

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


正如Sean O 'Gordman在我上一篇文章的评论中提到的,对这一策略的一个简单改进是,不仅在BTC股价上涨时奖励其持有BTC的利润,而且在BTC股价下跌时奖励其不持有BTC的利润。例如,我们可以奖励代理在持有BTC/USD头寸时净资产的任何增量增长,以及在不持有任何头寸时BTC/USD的增量下降。  


虽然这种策略在回报增加的回报方面很好,但它没有考虑到产生这些高回报的风险。长期以来,投资者通过简单的利润指标发现了这一缺陷,并传统上转向风险调整后的回报指标来解释这一缺陷。  


基于波动性的指标

最常见的风险调整回报指标是夏普比率。这是投资组合超额回报与波动率的简单比率,在特定时间段内进行测量。为了保持较高的夏普比率,投资必须具有高回报和低波动性(即风险)。计算方法如下:

1574188545965107.png

  

这个指标经受住了时间的考验,但是它也有缺陷,因为它惩罚了上行波动。对于比特币来说,这可能是一个问题,因为上行波动(疯狂的价格上涨)往往是非常有利可图的一部分。这使我们得到了我们将与我们的代理一起测试的第一个奖励指标。


Sortino比率与Sharpe比率非常相似,只是它只将下行波动率视为风险,而不是整体波动率。因此,这一比率并不影响上行波动。下面是数学:
1574188556372122.png

  

其他指标


我们将在这个数据集上测试的第二个奖励指标是卡尔马尔比率。到目前为止,我们所有的指标都没有考虑到提款。支取是对投资组合从峰值到低谷的具体价值损失的衡量。大幅度的提款可能会对成功的交易策略造成不利影响,因为长期的高回报可能会被突然的大幅度的提款迅速逆转。

1574188575242926.jpeg

  
为了鼓励积极防止大规模提款的策略,我们可以使用一个奖励指标,专门说明资本损失,例如卡尔马尔比率。这个比率与夏普比率是相同的,只是它使用最大的下降来代替投资组合价值的标准差。

1574188590429620.png

  

我们在对冲基金行业大量使用的最终指标是欧米茄比率。从理论上讲,欧米伽比率在衡量风险与回报时应优于索蒂诺和卡尔马尔比率,因为它能够在一个度量中解释风险超额回报分布的整体性。为了找到它,我们需要计算一个投资组合高于或低于特定基准的概率分布,然后取两者的比率。比率越高,上升潜力与下降潜力的概率越高。

1574188605217696.png

  

如果这看起来很复杂,不要担心。它在代码中变得更简单。


代码


虽然为每个奖励指标编写代码听起来都很有趣,但我选择使用 empyrical library 库来计算它们。幸运的是,这个库恰好包含我们在上面定义的三个奖励指标。 获取每个时间步长的比率非常简单,只需向相应的 Empyrical 函数提供一段时间内的回报列表和基准回报列表一样简单。

13.png


这里基于我们预先定义的reward函数,我们在每个时间步长设置reward 

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


工具集


任何伟大的技术人员都需要一个伟大的工具集。而不是重新发明轮子,我们将充分利用之前程序员的工作。对于今天的工作,我们最重要的工具将是 optuna 库,它使用树状结构的 Parzen 估计器 (TPE) 实现贝叶斯优化。TPE 是可并行的,这使我们能够利用 GPU,从而显著缩短总体搜索时间。让我们安装它。

pip install optuna


实施Optuna


利用Optuna优化超参数很简单,首先,我们需要创建一个 optuna sytudy,它是所有超参数试验的父容器。试验包含超参数的特定配置及其从目标函数产生的代价。然后,我们可以调用研究.optimize() 并传递目标函数,Optuna 将使用贝叶斯优化来查找产生最低代价的超参数的配置。

import optuna    def optimize(n_trials = 5000, n_jobs = 4):    
    study = optuna.create_study(study_name='optimize_profit', storage='sqlite:///params.db', load_if_exists=True)    
    study.optimize(objective_fn, n_trials=n_trials, n_jobs=n_jobs)

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

14.png


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


例如:

trial.suggest_loguniform('n_steps', 16, 2048) 

会以对数的形式产生一批介于16和2048之间的新的浮点数。例如: (16, 32, 64, …, 1024, 2048)

更进一步的:

trial.suggest_uniform('cliprange’, 0.1, 0.4)  

这种写法会以递增的形式生成浮点数。尽管我们在这里不使用,Optuna还是提供了一个生成绝对值的方法。

suggest_categorical('categorical', ['option_one', ‘option_two'])   

15.png


    然后,在CPU/GPU的完美配合之下,我们的优化函数已经运行了一整晚。我们可以从sqlite数据库中加载这个研究,因为我们已经让Optuna创建了。这个研究从它的测试中尽可能保持最好的结果。我们可以用它帮忙寻找我们环境下最好的超参数。

16.png


我们已经改造了模型,提升了我们的特征集,优化了全部的超参数。现在,是时候看看我们的agent在新的回报模型下的表现。我已经训练了一个 agent  ,用来优化我们的每一个度量值(四个分别是: simple profit, the Sortino ratio, the Calmar ratio, and the Omega ratio)。让我们在测试环境下分别运行这几个优化过的 agent  。它已经初始化过价格数据。并且看起来有前景的。


基准测试

    在我们查看结果之前,我们需要知道成功的交易策略是什么样的。因此,我们有几个常见的基准测试的方法,他们对比特币交易收益非常有效。可能你难以置信,在过去的几十年里。交易比特币最有效的策略之一就是,买并且一直持有。另外的两个策略,我们会使用非常简单但是高效的技术分析,来创建买和卖的信号,并且对他们进行测试。

1、买并且一直持有

这种方法就是尽可能多的买,且一直持有。尽管这种策略一点都不复杂,但它在过去的成功率非常高。

2、相对强弱指数(RSI)的差异

当收盘价持续的上升,那么RSI对应的会下降,一个负趋势逆转就是一个卖出的信号。当收盘价持续的下跌时,RSI会持续上升,这时一个正趋势转折就是一个买入信号。

3、SMA均线交叉点

当长期的SMA穿过短期的SMA在其上方,就代表着负趋势逆转(即卖出信号)。当短期的SMA穿到长期的SMA上方,就代表着正趋势逆转(即买入的信号)

    进行这些简单的基准测试的目的是证明我们的RL代理的确能在市场中交易。如果我们没有这些简单的基准测试,我们就是仅仅为了做一个所谓的“科学项目”而浪费无数的开发时间以及GPU计算能力。但是我们证明了,事情并非如此。


结果

让我们快速的看一下那些失败的策略,之后再看好的策略。首先是Omega策略,显然它对我们的交易完全无用:

1574188802889882.png

        观察这个代理交易,很明显,这种回报算法产生的策略出现了交易过度现象,导致它不能捕捉到市场机会。

        Calmar策略虽然相较于Omega策略有一点提高,但他们终归还是很相似的。它就好像我们花了时间和精力,结果得到的仅仅是更糟糕的结果。

1574188818518123.png

接下来说一下“简单增量收益”策略,它是我们的老朋友了。尽管这种回报算法在我们之前的文章中已经证明了它不太成功,但我们做的修改和优化已经让我们的代理有大幅的收益提升。相较于初始余额,它在过去四个月测试期的平均收益超过了350%。如果你对市场上的平均回报率不太关心的话,这些结果已经非常棒了。这可以说是我们使用强化学习能得到的最好的结果了,不是吗?

1574188839508093.png


错,Sortino会更好,它的平均回报率将近850%。我第一次看到这个觉果的时候,我第一反应是赶快确认我们代码是没有bug的。经过了一番彻底的检查之后,很明显代码是没有bug的,这种策略很适合做比特币交易。

1574188858572718.png


与前面的交易过度和交易不足,这些代理看起来理解了低买高卖的重要性。并且使风险最小化。如果你还难以置信,请看下面的图。

1574188879283388.png


请注意,这个agent在快速上涨之前买入,然后在价格有部分上涨之后卖出。它好像懂得赚钱要趁早,并且不要持有太长时间。不管代理已经学到了哪些特殊的策略,我们的交易机器人都已经很明显的是学会了炒币。

现在我还不傻,我知道尽管这些测试是成功的,但它还不能推广到真实的交易中。就是说,这些结果离那些我见过真正优秀的交易算法或策略还有很大差距。这些算法还没有得到做交易所需的知识,除了成功的交易,它还有实验数据和错误,很多很多的实验和错误。


结论

    在本篇文章中,我们优化了我们的比特币交易代理,让它能做更好的决策,并赚来更多的钱。尽管不少费事,但我们还是完成了这些成果:

  • 升级了我们现有的模型,在稳定的数据上用到了循环神经网络LSTM。

  • 使用了相关领域的统计数据,为我们的agent提供了超过40个特征。

  • 我们的回报模型不仅能计算简单的收益,还能够计算风险

  • 使用‘贝叶斯优化’调整了我们模型的‘超参数’

  • 针对主要的交易策略进行了基准测试,来确保我们能应对真实的市场环境

    理论上,一个高收益的交易机器人的确很棒。但我收到一些反馈,说这些agent只是简单的拟合曲线罢了,他们在真实的交易数据上不可能取得收益的。是的,我们在离线数据上进行的这些训练或者测试方法的确面临着这个问题,我们的模型的确会出现过拟合,而对新数据的泛化能力不理想。话虽如此,但我感觉这些agent绝不仅仅是学着拟合曲线的,他们也适用与真实的交易环境。

    为了对我们的假说做进一步的实验,下一篇文章中,我们会主要讲讲如何将我们的agent“放到野外”。我们首先准备更新我们的环境来支持多种加密货币,比如说ETH/USD 和 LTC/USD。然后我们会把agent放到真实的Coinbase Pro环境中运行。这一定是让人兴奋不已和引人深思的。无论我们能不能赚到钱,你一定会怀念它的。

    最后顺便提一下,想提升这些代理的表现还可以做很多事情。但我的时间有限,我已经为了写这篇文章花费了太多的时间,不想再拖延时间了。如果你感兴趣的话,看一下我已经完成的工作(https://github.com/notadamking/RLTrader)并且改造它,如果你的成果比我还好,一定别忘了告诉我你的收获,期待你能和我交流。   

----------------------------------------------------------------------------

发起:唐里 校对:鸢尾 审核:唐里

参与翻译(5人):天字一号、软件导刊、david95、Mo落、邺调

英文原文:Optimizing deep learning trading bots using state-of-the-art techniques

THE END

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:如何使用TensorFlow Eager训练你自己的人脸识别模型

下一篇:文献检索的十步策略

用户评价
全部评价

热门资源

  • 应用笔画宽度变换...

    应用背景:是盲人辅助系统,城市环境中的机器导航...

  • GAN之根据文本描述...

    一些比较好玩的任务也就应运而生,比如图像修复、...

  • 端到端语音识别时...

    从上世纪 50 年代诞生到 2012 年引入 DNN 后识别效...

  • 人体姿态估计的过...

    人体姿态估计是计算机视觉中一个很基础的问题。从...

  • 谷歌发布TyDi QA语...

    为了鼓励对多语言问答技术的研究,谷歌发布了 TyDi...