趣文网 > 作文大全

能用强化学习买卖比特币赚钱吗?能能能 当然能!

2020-11-23 13:00:01
相关推荐

雷锋网 AI 科技评论按:人工智能热潮还没过去,电子货币和区块链的热潮又滚滚而来。以 BTC(比特币)为代表的电子货币近半年来吸引了全世界的注意力,每个人都想在这个热潮中分一杯羹 —— 只不过,不是每个人都赚到钱了,尤其是经验不足的投资者们。

那么问题来了,现在人工智能技术也有了长足进步,连 AlphaGo 在打败柯洁之后都还能继续进化,可以对围棋无师自通,所以我们有没有机会同样用 AlphaGo 所用的强化学习(Reinforcement Learning)方法学习一个百战百胜的电子货币人工智能呢?

斯坦福大学计算机系毕业生、曾在谷歌大脑团队研究机器翻译、对话建模和总结的深度学习研究员 Denny Britz 近日就在一篇博客中发表了自己的观点并介绍了相关入门知识。他认为训练基于强化学习的交易人工智能不仅可行,而且还是一个非常有价值的研究课题。雷锋网 AI 科技评论把这篇博客全文翻译如下。

深度学习的学术研究人员们一直以来都和金融投资市场保持了相当的距离。这可能是由于金融界的名声不好,或者是这个问题从研究的角度来看不够有趣,也可能是因为获得数据太贵太困难。

我会在这篇文章中论证这个观点:训练一个强化学习智能体在金融(以及加密货币)市场中交易也可以是一个非常有意思的研究课题。我觉得学术研究界并没有给这个问题给予足够的重视,但其实这个问题有潜力推动许多相关领域的技术发展。这个问题和训练 DotA 之类的多玩家游戏智能体很像,其它类似的问题也还有很多。不过由于之前对投资交易没有任何理解,我自己做这个项目花了好几个月的时间。

请注意,我要研究的问题并不是「用深度学习预测价格」。所以如果你想看这方面的示例代码和模型的话恐怕要失望了。我想从更高的层次仔细聊聊为什么用机器学习的方法学习交易很困难,以及我觉得强化学习可以完美替代哪一部分。如果大家对这个问题的兴趣足够浓厚,我可能未来会再发一篇文章介绍一些实证例子。

我估计这篇文章的大多数读者都没有什么投资交易经验,就像我当时也是从头学起一样,所以我会首先介绍一些基本情况。这篇文章中我会以加密货币交易作为例子来分析,不过这一套想法同样适用于大多数的其它金融市场。我选择加密货币的理由是因为数据是免费的、公开的、便于获得,而且每个人都可以参与交易。在其它金融市场进行交易的门槛要高一些,获取数据也要贵一些。

加密货币交易市场的基本微观结构

加密货币市场(以及大多数金融市场)的交易都是以我们称作「带有开放式挂单列表的连续双重拍卖」的方式在交易平台上内进行的。这种说法有点生硬,其实就是说这里有买家和卖家,经过交易平台撮合之后他们就可以相互交易了。加密货币的交易平台已经有好几十个,每个交易平台支持的币种都有所不同。不过从界面和提供的数据角度来看,都是大同小异。

我们来看看 GDAX,这是美国开设的交易平台里最热门的之一。假设你要交易的是「BTC-美元」交易对(用美元换比特币),那么进入交易界面以后,你看到的大概是这样的画面。

页面上提供了很多信息,我们从基础的开始一项项看。

价格走势图(中央)

图中给出的当前价格是来自于最近完成的交易的。根据最近发生的交易是买入还是卖出,这个价格会不断变化。价格走势图通常会以 K 线图的方式来显示,其中的每一条红色或者绿色的竖线就表示了那个时间段的开盘价、最高价、最低价、以及收盘价。在上面这张图中,每一条竖线的时间段是 1 个小时,不过这个长短也可以自由选择。价格线下方的柱状线表示成交量,表示的是对应时间段内发生的所有交易的总量为多少。成交量也是一个重要指标,因为它可以体现出市场的流动性。比如假设你想买十万美元的比特币,但是没有人愿意卖,那市场的流动性就非常差;也就是说你买不到。高成交量表示很多人都愿意参与交易,同时也就代表着你可以在愿意的时候随时进行买卖。总体来讲,当你越想投资很多钱的时候,你就越希望看到很高的成交量。成交量同时也体现了价格趋势的「质量」。高成交量下的价格趋势变化要比低成交量下的价格趋势变化更可靠。大多数时候,高成交量表示市场内的相当多参与者之间达成了共识(也有例外的情况,比如当存在市场操控行为的时候)。

交易历史(右侧)

右侧的列表显示了所有近期完成的交易。每个交易都有成交量、价格、时间戳以及方向(买入还是卖出)。交易是挂单者和吃单者之间匹配完成的。下面还会详细解释。

挂单列表(左侧)

页面左侧的这个就是挂单列表了,里面的信息就是谁想要在什么价格买入或者卖出多少。挂单列表分为了两个部分,买单(bids)以及卖单(asks)。根据交易规则,卖一价(best ask)是所有当前交易者里愿意卖出的最低价,它需要高于所有当前交易者里愿意买入的最高价,即买一价(best bid)。如果新增加的买单价格高于卖一价,那么这笔交易就会立即成交;如果新增加的卖单价格低于买一价,同样会立即成交。

每一笔挂单都有自己的价格和数量,比如图中卖一是数量为 0.012、价格为 7886.98 的卖单,意味着你可以从这位交易者手上以 $7886.98 的价格买到 0.012 个 BTC。而如果你想要买的数量超过 0.012 个 BTC,你就还需要从列表中更高一位、报价更高的卖家手里再买入一部分。成交之后的卖单就会从挂单列表里消失,直到新增的卖单或者新增的买单补充了被刚才的交易清空的价位。换句话说,当你买入或者卖出的时候,你实际上就改变了挂单列表里的买卖单分布。如果你买入或者卖出的量足够大,你可能就会大幅改变挂单列表的状况,并且影响到当前价格。

另外值得注意的是,你实际付出的钱要多于「数量 x 价格」,GDAX 对每笔交易收取 0.3% 的手续费,在整个金融市场中都算是比较高的,其它多数加密货币交易平台通常是在 0.1% 到 0% 之间。

更多细节信息以及操作指导可以搜索或者在交易平台体验一下,这里就不介绍更多了。

数据

我这篇文章选择研究加密货币的主要原因就是因为数据是公开、免费、便于获取的。多数交易平台都支持流传输 API,可以实时获取交易平台的数据更新。在这里继续用 GDAX 作为例子获取数据,不过其实其它交易平台的数据也差不多。我们从头开始做一下构建机器学习模型需要的各个基本步骤。

交易 - Trade

假定一笔交易刚刚发生了。每笔交易的信息里都包含时间戳、交易平台给定的唯一交易 ID、价格、成交量以及方向。如果想要根据交易信息做出 K 线图的话,设定一个时间窗口,然后统计每个时间窗口内的开盘价、最高价、最低价、以及收盘价,再把它们画出来就好了。

{ "time": "2014-11-07T22:19:28.578544Z", "trade_id": 74, "price": "10.00000000", "size": "0.01000000", "side": "buy"}

挂单列表更新 - BookUpdate

假定挂单列表里的挂单更新了。每个挂单的信息都包含方向、价格以及这个价格的数量。注意这样获取到的数据只是挂单列表发生了变化的那一部分,要获取整个挂单列表的话还需要自己进行合并。

{ "type": "l2update", "product_id": "BTC-USD", "changes": [ ["buy", "10000.00", "3"], ["sell", "10000.03", "1"], ["sell", "10000.04", "2"], ["sell", "10000.07", "0"] ]}

挂单列表快照 - BookSnapshot

这和挂单列表更新类似,不过这是整个挂单列表。由于完成的挂单列表会很大,获取一次完成列表之后都使用挂单列表更新会更快、更有效率。不过偶尔用一下整个挂单列表也还是很有用的。

{ "type": "snapshot", "product_id": "BTC-EUR", "bids": [["10000.00", "2"]], "asks": [["10000.02", "3"]]}

关于市场数据,差不多知道这么多就够了。以上这几个事件获取到的数据流也就是 GDAX 的网页用户界面上的所有信息。

几个交易指标

在开发交易算法的时候,要以什么作为优化目标呢?一个很明显的答案自然是「盈利」,但其实故事并没有这么简单。你不仅需要把你的交易策略和基准线对比,而且你还需要评估它相比其它投资方式的风险和稳定性。下面我会简单列举几个交易者们最常用的基本指标。

净利润/净损失 Net PnL

一段时间内算法赚到多少钱(正值)或者赔了多少钱(负值)的直接计算,另外还要记得扣除手续费。

Alpha & Beta

Alpha 形容的是,相比另一种风险相对更小的投资方式,比如国债,这项投资的收益率能高出高多少。比如,相比国债的 Alpha 是 1%,就意味着在同一段时间内的收益率高出国债 1%。Beta 也与此相关,它形容的是你的投资策略相比整个市场的不稳定性有多大。比如 Beta 为 0.5 就代表,当整个市场的价格增加 $2 时,你的投资收益为 $1。

夏普比率 Sharpe Ratio

夏普比率代表着每一份增加的风险所能带来的收益的多少,比如每增加 1% 的风险,增加的收益是 2% 还是 3%,显然越大越好。它的计算过程不仅考虑到了策略的不稳定性,而且也考虑到了转向其它风险更低的投资方式的可能性。

最大跌幅 Maximum Drawdown

最大跌幅形容的是一个局部极大值和紧接着的局部极小值之间的差距,是另一个针对风险的指标。比如,最大跌幅为 50% 的策略意味着某个时候你有可能会损失 50% 的资金。那么接下来你的资金要翻一倍才能补回原来的数目。显然,最大跌幅同样是越小越好。

风险价值 Value at Risk

风险价值也是一个偏向于风险的指标,假定市场运行正常的话,它在尝试量化在给定的时间窗口内损失一定资金的概率如何。比如,「1天 - 5% - 10% 的 VaR」代表一天之内有 5% 的可能性在投资中损失超过 10%。

监督学习

在从强化学习的角度研究这个问题之前,我们先看看用监督学习的方式创建一个能盈利的交易算法会是什么样的。我们也就会看到这样做有什么问题,以及为什么我们会需要强化学习的方法。

最明显的一种解决方案就是预测价格。如果我们能预测市场价格会涨还是会跌,那么只要低买高卖就好了。然而,这种思路有几个问题。

首先,我们到底要预测什么价格?正如前文对挂单列表的分析所说,买卖的时候其实并不是针对单个价格的。最终付出的价格要看挂单列表里的挂单量,以及所付的手续费。简单直接的做法自然是预测价格中点,即买一和卖一价格的平均数。这也是多数研究者的做法。然而,这个价格只是一个理论价格,并不是一个可以真的进行交易的价格,而且很可能和真实交易时的实际价格相去甚远。

下一个问题是时间间隔。我们要预测的价格是下一笔交易的、下一秒的、下一分钟的、下一小时的还是下一天的?仅凭直觉来看,要预测价格的时间点距离当前越远,预测结果的不确定性就越高,预测问题的难度也就越高。

下面举个例子。假设当前比特币价格是 $10,000,然后我们准确地预测了一分钟之后价格会上涨到 $10,050。那么这代表着我们可以从这次低买高卖中赚到 $50 吗?我们分析看看。

当我们买入的时候,卖一价是 $10,000。大多数情况下我们可能没法以 $10,000 的价格买到全部的 1.0 BTC,因为挂单列表里一般不会有足够的量。很可能我们不得不在 $10,000 买到 0.5BTC,在 $10,010 买到另外 0.5BTC,平均价格为 $10,005。在 GDAX 上我们还要支付 0.3% 的手续费,这差不多是 $30。一分钟过去了,价格涨到了 $10,050 了。现在我们要卖出,然而市场变化速度很快,很可能当我们下单的时候价格又变了。假设现在是 $10,045 吧,然后和买入的时候类似,我们很可能没办法在这个价格卖出全部的 1.0BTC,不得不在 $10,045 卖出 0.5BTC,然后在 $10,040 卖出另外 0.5BTC,平均价格 $10,042.5。然后还有 0.3% 的手续费,差不多也是 $30。

那么,这一笔交易赚了多少钱呢?-10005 - 30 - 30 + 10,042.5 = -$22.5。结果是并没有赚到钱,虽然我们成功预测了价格上涨,但我们反而赔了 $22.5。上面的这个例子就显示出了实际操作中会遇到的三个问题:卖一价/买一价的流动性不够,网络延迟,以及手续费,这三件事都不是监督学习模型可以处理得了的。

从这里我们能学到什么呢?要凭借一个简单的价格预测策略就挣钱,我们就需要在更长的时间内预测相对大幅度的价格变化,或者非常精细地处理手续费和挂单。时间一旦变长,预测就变成了一个很难的问题;处理手续费和挂单也还需要单独构建一个复杂的系统来处理。

监督学习的方法还有一个大问题,就是没法从它里面推导出一个策略。在上面的例子里,我们买入是因为预测到价格会上涨,而且也确实上涨了,一切都基本按照计划进行。可是如果价格是下降的怎么办,那就卖出吗?还是继续持有等待?假如价格又小幅上涨了一点点然后继续下降了怎么办?以及如果我们对预测的结果不那么确定,认为 65% 的可能性涨、35% 的可能性跌,那么还要买入吗?如何设定是否下单的阈值?

所以,如果要以监督学习的方式解决,仅仅一个预测模型是完全不够的(除非你的模型非常准确、非常鲁棒)。我们还需要一个基于规则的策略模型,把价格预测的结果作为数据,决定具体要怎么做。那么这个策略又要从何而来呢?如何优化策略的参数和做决定的阈值?这几个问题都不那么好解决,很多人会用简单的启发式方法,又或者直接凭人的直觉设定。

典型的策略设计工作流程

幸运的是,以上的许多问题都有解决方案。然而坏消息也有,就是这些方案并不怎么高效。我们来看看交易策略开发的典型工作流程,大概长下面这样:

数据分析:对数据进行探索性的分析,尝试找到交易机会。你可能要看许多不同的图表、计算统计数据等等。这一步的输出是一个交易策略的「理念」,而且等待验证。监督学习模型训练:如果有必要的话,你可能要训练一个到多个监督学习模型用来预测能支撑你的交易策略发挥作用的数据点位。比如价格预测、交易量预测等等。策略开发:你需要尝试写一个基于规则的策略,根据市场的当前状况和监督学习模型的预测决定采取什么动作。请注意,这个策略也会包含一些参数,比如决定阈值,这也需要通过优化学习,只不过可以稍后再做。策略内部测试:在模拟器中根据历史数据测试交易策略的初始版本。模拟器中可以包含挂单列表流动性、网络延迟、手续费等等因素。如果策略在模拟器中的表现还不错,那么你就可以进行下一步的参数优化。参数优化:你可以用网格搜索这样的搜索方法,尝试策略中的参数的不同的值,比如阈值、相关系数等等,同样在模拟器和历史数据上进行测试。注意,如果对历史数据拟合了会造成很大的风险,准备验证数据集和测试数据集的时候一定要小心。模拟运行以及纸面交易:在真的让交易策略上线运行之前,在本地根据实时获取的新市场数据进行新一轮模拟。这叫做纸面交易,可以帮助防止过拟合。直到交易策略在纸面交易中的表现很好之前,都不要急于让它上线进行真正的交易。上线交易:确认没有问题后,用 API 把交易平台和策略连接起来,开始真实的买入卖出。

这是一个非常复杂的过程。根据不同的机构或者研究人员,这个流程可能会稍有不同,但是交易策略开发基本上就是按照这个顺序做下来的。那么,为什么我认为这个过程效率很低呢?原因有下面几个:

迭代周期很长。第一步到第三步很大程度依靠的是做事的人自己的直觉,直到做到第四步、第五步你才会知道自己想的策略效果如何,然后很有可能会导致你推倒重来。实际上,这里每一步都有失败的风险,逼得你不得不从头开始。模拟测试的步骤太靠后了。直到第四步模拟的时候你才开始显式地考虑延迟、交易费用、流动性之类的环境因素。可是难道这些因素不应该在一开始设计策略的时候就考虑在内,或者直接作为模型参数的一部分么?交易策略和监督学习模型是分别独立设计的,然而实际上它们之间是需要紧密协作的。既然监督学习模型的输出需要作为策略的输入,那么联合优化它们两者不是更好么?交易策略很可能会太简单。人类所能想到、能明确描述的东西太有限了。参数优化过程效率太低。比如说,我们假设你优化的目标是收益和风险的综合值,然后你希望优化找到一组能带来最高的夏普比率的参数。相比于高效的基于梯度的方法,你这里只能用低效的网格搜索,然后希望运气好可以试到好的参数(同时还不要过拟合)。

那么,下面我们就看看强化学习能如何应对上面的大多数问题。

用于交易的强化学习模型

我们首先回忆一下,传统的强化学习问题可以用马尔可夫决策过程(MDP)描述。首先我们有一个在环境中做出行动的智能体,在第 t 步时智能体把环境的目前状态 St 作为自己的输入,然后做出行为 At;接着在 t+1 步中接收到反馈 Rt+1 以及更新的环境状态 St+1。智能体根据某个策略 π:At = π(St) 选择自己的行为。那么我们的目标就是找到一个能够在某个有限或者无限长的时间内最大化累积反馈 ∑Rt 的策略。

下面我们看看这些符号在交易环境下都分别对应什么。

智能体

从最简单的开始。这个智能体就是我们的交易智能体。你可以把智能体看作是一个仿人类的交易者,它会打开交易所,看着交易平台的用户界面,然后根据交易平台的目前状态和自己账户里的资金做出交易决定。

环境

这里开始有一点麻烦。显然我们会认为交易平台就是我们的环境。不过有一点值得注意的是,同一个交易平台上还有很多别的智能体,有人类,也有一些基于算法的自动交易程序。假设某个时刻我们以分钟为级别做出行动,那么就是做出一个行动,等待一分钟,获得一个新的环境状态,再做出一个行动,周而复始。当我们观察到了一个新的状态之后,就会把它看作是市场环境的响应,其中当然也包含了其它参与者的响应。那么从我们的智能体的角度出发的话,别的这些参与者也同样是环境的一部分,而且还不受我们的控制。

然而,如果把其它的市场参与者(智能体)看作是整个大的、复杂的环境的一部分的话,我们就失去了显式地对它们建模的机会。比如,想象我们学习到了如何对其它市场上运行的算法和交易策略做反向工程,然后尝试利用它们,这将是一件多么美妙的事情啊。假如这样做的话,我们就来到了一个多智能体强化学习问题的环境下,这正是一个热门的研究领域;我稍后还会多说一点。不过目前,简单起见,就先假设不考虑这部分,就认为我们就是在单个的、包含了所有其它智能体的行为的复杂环境里面。

状态

对于在交易平台做交易来说,我们观测到的并不是环境的完整状态。比如,我们并没有办法识别环境中的其它的智能体、它们的数量如何、每个人各自有多少账户余额、各自有多少挂单之类的。这也意味着,我们要处理的是一个部分可观察的马尔可夫决策过程(POMDP)。智能体观察到的并不是环境的真实状态St,而是这个状态的一部分衍生值。我们就把它称作观测值 Xt,它由全状态的某个函数 Xt ~ O(St) 计算得到。

在我们这个问题中,每一个时间步骤 t 中的观测值仅仅是截至到 t 的所有交易平台发生的事件的历史(参见前文「数据」小节)。这个事件历史可以用来构建当前的交易状态。不过,为了让智能体能够做出决策,还有一些其它的数据也应当包括在观测值之内,比如当前的账户余额、当前的挂单列表,等等。

时间尺度

我们也需要决定智能体的行动应该在怎么样的时间尺度上做出。每天、每小时、每分钟、每秒、每毫秒,甚至可变时间尺度?这些不同的选择就各自需要不同的方法。如果买入一种资产,持有它数天、数周甚至数月,基本上就可以认为这是长期投资,基于的分析是类似「比特币未来会成功吗」这样的问题的。通常情况下,这类投资决定都是根据外部事件、新闻,以及对这种资产的价值和潜力的基本认识做出的。那么这类分析基本上也就需要对整个世界的运转规律有相当的认识,很难自动化地使用机器学习方法。在另一个极端上,我们也知道有高频交易(HFT)这样的技术,所有交易决定几乎全部依赖于市场本身的微观结构信号。这些决定需要在纳秒尺度上做出,运行在 FPGA 硬件上的算法简单但是极为快速,挂单交易信息通过专门设立的线路连接并发送到交易平台。

从另一个角度上,可以把时间尺度看作是「人性」的体现,长期投资和高频交易就分别在坐标的两端。前者需要总体视角、需要对世界的运行规律有了解、需要人类的直觉和高层次分析,后者的全部奥妙则在于简单但是极为高速的模式识别。

神经网络流行的原因之一就是因为,提供了许多数据之后可以学到比线性回归或者朴素贝叶斯复杂得多的数据表征。然而神经网络的速度要相对慢一些,没法在纳秒级的速度上做出预测,从而也就没法和高频交易算法的速度竞争。所以我认为神经网络发挥作用的甜点应当就在这两个极端当中的某处。我们希望选择这样一个时间尺度:在这个时间尺度上它分析判断数据可以比人类更快,但同时也足够聪明,可以胜过那些「快但是简单」的算法。我的猜测,仅仅是个人猜测,就是神经网络做出行动的理想时间尺度应当是在几毫秒到几分钟之间。人类交易者也可以在这些时间尺度上做出行动,但是不见得会比算法块。而且综合分析这同一段时间内的信息的速度也显然是人类不如算法。那这就是算法的优势。

另一个基于相对短的时间尺度做行动的原因是因为可能会让数据中的模式显得更明显。比如,多数人类交易者观察的都是完全一样的(提供了有限信息的)图形化用户界面,有些人也会看预定义的行情分析信号(比如 MACD),那么他们的行动就会受限于这些信号中体现的信息,最终表现为某些规律性的行为模式。类似地,交易平台中的自动化交易算法也是基于某些模式运行的。我们就希望强化学习算法可以发现这些模式、利用这些模式。

值得注意的是,我们也可以根据不同的信号触发,在多个不同的时间尺度上做出行动。比如我们可以选择一旦市场上出现了大额交易就做出动作。这样的事件触发的智能体也可以根据触发事件的频率总体对应某些时间尺度。

行为空间

在强化学习中,我们会针对离散(有限)和连续(无限)行为空间做出区分。根据我们希望智能体达到的复杂程度,可以有多种不同的选择。最简单的方法就是设定三种行为:买入,持有,卖出。这样也不是不行,但是这会限制模型在每一步中决定资金金额的能力。如果把复杂程度升级,下一步需要做的就是让智能体学会要投资多少钱,比如根据模型预估的不确定性决定不同的投资金额。这样就会让我们来到连续行为空间,因为我们需要同时决定行为(离散的)和数量(连续的)。更复杂的状况是,让我们的智能体学会下限价单。在这种情况下智能体要同时决定挂单价格和挂单数量,两者都是连续数值。它也还需要有撤销没有成交的限价单的能力。

反馈函数

这又是一项很复杂的东西。可选的反馈函数有很多种。很容易想到的是已实现盈亏。每当智能体结束一个仓位的操作(比如卖出了之前买入的资产,或者买入了之前借出的资产)之后就会获得一次反馈。这轮交易的净收益可以是正值,也可以是负值,就把它作为我们要的反馈信号。随着智能体学习最大化累积反馈值,它就逐渐学习了如何在交易中盈利。技术上说这个反馈函数是正确的,而且在这个限定范围之内可以学出最优策略。然而,和什么都不做相比(这将是大多数时候的智能体行为),买入和卖出的行动数量都很少,反馈会很稀疏。所以,理想的智能体应当不需要频繁地接收到反馈信号也能学习。

相比频繁接收反馈信号的一种替代方案是未实现盈亏,就是指,虽然智能体当前还没有结束所有仓位的操作,但是如果立即就结束的话会获得多少利润。比如,当智能体买入之后价格就开始下跌的话,即便还没卖出(实现负利润),智能体也会获得负的反馈值。由于每个时间步骤上未实现盈亏都会发生变化,它就可以作为频繁的反馈信号。然而,这种直接的反馈和延迟衰减函数结合使用的时候也可能会让智能体偏向于短期的操作。

这两种反馈函数都是针对利润的朴素直接的优化。而实际交易中,交易者可能还希望最小化风险。假设策略 A 有稍低的回报和显著更低的波动性,而策略 B 的回报提升不多,波动性却很高的话,一般人们都会倾向于选择策略 A。针对夏普比率做优化是一种简单的在训练中考量到风险的做法,但也还有许多其它的指标。我们也可以选择最大跌幅这样的指标。可以想象,根据利润和风险之间的平衡,有许许多多复杂的反馈函数可以选择。

强化学习模型的设计工作流程

现在我们对如何在交易中使用强化学习有大概的了解了,下面我们来看看为什么我们更愿意用强化学习而不是监督学习。开发强化学习的交易策略大概是下面这样的步骤,要比前面监督学习的简单得多,也要更加体系化。

对我们关心的指标做端到端优化

在上面讲过的传统策略开发过程中,我们要先经过流水线中的好几步才能得到我们想要的指标数值。比如,如果我们想要找到一个最大跌幅不超过 25% 的策略,我们就要先训练监督学习模型、想出一个基于规则的策略并且用到模型的数据、做内部测试并优化超参数,然后才能经过测试得出模型在这个指标上的表现。

强化学习就允许我们做端到端的优化,而且可以最大化反馈(也可以是延迟反馈)。只要在反馈函数中增加一项,我们就可以直接对最大跌幅做优化,而不需要分成好几个互相独立而且不确定互相影响的步骤。比如你可以在反馈函数中设定,当跌幅超过 25% 的时候会有一个很大的负反馈,这就会逼得智能体补课不考虑更换别的策略。当然了,我们也可以把最大跌幅和其它各种我们关心的指标结合在一起。所以强化学习的方法不仅更简单,也可以得到厉害得多的模型。

学到的策略

相比于需要一行行手工设计的基于规则的策略,强化学习可以直接学到一个策略。我们不再需要指定规则、不再需要设定阈值(比如「预测价格上涨的确定性大于 75% 时买入」)。强化学习策略中会隐式地形成交易规则,而且会向着我们需要的指标进行优化。我们也就在策略开发过程上迈出了一大步!并且,由于这个策略是由神经网络之类的非常复杂的模型参数化的,它能够学到的策略要比任何人类可以想到、可以描述的策略都要复杂和强力得多。以及正如我们刚才说到的,只要我们在意并设定反馈函数,学到的策略可以隐式地把风险之类的指标考虑进去。

直接在模拟环境中训练

当使用监督学习方法时,我们需要分别做内部测试和参数优化这两步,因为在策略中直接考虑进去挂单列表流动性、手续费结构、延时等等因素的话太难做了。想到了一个策略,然后花了很多时间做测试之后才发现它不好使的事情并不少见,延迟太高、市场行情变化太快等等原因都有可能。

而强化学习智能体是直接在模拟环境中训练的,而且这个模拟环境可以尽可能复杂(把延迟、流动性和手续费都考虑在其中),那么我们就不需要考虑刚才那些问题了。实际上,适应环境本身的限制也就应当是优化过程的一部分。比如我们在强化学习环境中模拟交易平台的延迟,导致智能体犯错的话,智能体就会接收到负值的反馈,使得它之后学会更好地应对延迟。

我们可以进一步拓展这种做法,模拟同一个环境中的其它智能体,从而建模我们的智能体做出行动会对环境造成何种影响。在模拟环境的历史数据中智能体的下单可能会带来价格的变化,而我们其实不确定真实的市场对此会有什么样的响应。一般来说,模拟器都会忽略这些,假定智能体的下单没有给市场带来任何影响。不过,通过学习一个环境的模型,然后执行蒙特卡罗树搜索之类的推演方法,我们就可以把市场(以及其它智能体)可能的反应考虑在内。这样巧妙地处理了环境中的实时数据之后,我们就可以持续地改善模型。同时这里也有一个探索和利用之间的有趣的平衡:我们应当优化模型,让它在实时变化的环境中获得更多的利润,还是做次优的优化、更多地收集信息,以便我们可以优化环境和其它智能体的模型呢?

这会是一个非常强有力的想法。通过建设越来越复杂的模拟环境来拟合真实市场,我们也就可以训练出非常复杂的模型,复杂到以至于可以把环境本身的限制考虑在内。

学习适应不同的市场环境

直觉上来说,同样的策略可能在有些市场环境中表现比较好、有些环境中表现不好。一定程度上这是策略较为简单的本质属性造成的,有可能策略的参数化程度确实还没有强到可以让模型学习适应不同的市场环境。

不过,通过神经网络进行参数化的强化学习智能体学到的都是很强有力的交易策略,它们其实也有机会学会适应各种不同的市场环境,只要首先经过足够长时间的训练、有足够的存储容量,也许多学习一份历史交易数据就可以学会适应一个新的交易平台。这也让这些模型对市场状况的变化更鲁棒。实际上,通过在反馈函数里加入适当的惩罚项,我们可以直接地把模型优化得对市场变化更鲁棒。

对其它智能体建模的能力

强化学习有一项独特的技能,就是我们可以显式地把其它智能体的影响考虑进来。目前为止我们讨论的都是「市场会如何反应」,而其实市场也就是一群智能体和自动交易算法而已,就像我们想要做的一样。不过,如果我们可以显示地在环境中对其它智能体建模,我们的智能体就可以学会利用它们的策略牟利。简单来说,我们把「预测市场」的问题重新定义为了「利用其它智能体」。这也就和我们在 DotA 之类的多玩家游戏中做的事情要类似得多了。

重新聊聊交易智能体这个问题

我这篇文章的目标不仅仅是想要对用于交易的强化学习智能体做一个入门介绍,也是希望引起更多研究人员的兴趣、参与研究这个问题。交易其实可以是一个有趣的研究问题,原因有下面这些。

实时测试以及快速的迭代循环

以往训练强化学习智能体的时候,把它们部署到真实世界并获得反馈是一件很难或者很昂贵的事情。假设你训练了一个玩星际 2 的智能体,你要如何让它和一群高水平的人类玩家对抗呢?象棋、扑克以及其它强化学习研究者关注的热门游戏都有这个问题。可能你要想办法进入某个世界级赛事,让智能体完成许多场比赛之后再分析结果。

交易智能体的特点和其它那些多玩家游戏的特点非常类似,但是在线测试它们就简单太多了!你可以随时通过交易平台的 API 部署自己的智能体,随时获得真实世界市场的反馈。如果你的智能体泛化能力不好、输了钱,你就知道你可能对训练数据过拟合了。换句话说,迭代更新的周期可以变得非常短。

足够大的多玩家环境

交易环境本质上就是一个有数以千计的智能体参与的多玩家游戏。这也是一个热门研究领域。扑克、Dota2 等等游戏上我们都已经在做出成果,同样的技术也可以用在这里。实际上,交易问题还是一个更困难的问题,因为任何时刻都会有可观数量的玩家加入或者离开游戏。学习如何为其它智能体建模也只是研究这类问题的其中一个方向。前面也提到过,智能体在实时环境中采取行动,目的完全可以是最大化自己收集到的关于其它智能体执行的交易策略的信息。

学习利用其它智能体以及操控市场

和上一个问题紧密相连的,就是我们能否利用环境中的其它智能体。比如,如果我们确切知道交易平台上的其它自动交易算法的内容,我们就可以诱使它们执行本来不该执行的行为,然后从它们的错误中获利。这同样适用于人类交易者,他们中的相当一部分人都是基于某几组广为人知的市场信号进行交易的,比如指数移动平均、挂单列表压力、MACD。

(作者注:请不要让你的智能体做任何违法的事情!请务必遵守你当地的法律法规。并且,算法的以往表现只对未来表现有有限的参考作用。)

稀疏回报以及探索

交易者一般只能从市场上获得稀疏的反馈,大多数时候交易者都是在等待。不过买入和卖出动作毕竟只是采取的所有动作中的一小部分。简单直接地使用一个「心里只有反馈」的强化学习算法是肯定会失败的。这就为新算法、新技术的使用提供了机会,尤其是可以高效地处理稀疏反馈的基于模型的算法。

行为空间的探索也有类似的状况。当下的许多标准算法,比如 DQN 和 A3C 都使用的是非常朴素的方法做探索,基本上就是在策略中增加噪声。然而在交易环境中,环境中的多数状况都是不好的状况,只有少数是好的。用简单直接的随机方法做探索基本没什么机会让好的状况和好的模型行为配对起来。这里很需要一种新的方法。

多智能体自我对抗

正如和围棋、象棋智能体可以做自我对弈,多智能体环境中可以做自我对抗。比如设想我们同时训练了一大群互相竞争的智能体,然后观察它们之间形成的市场变化模式是否和真实世界的市场行情有类似之处。我们也可以把不同类型的智能体放在一起比拼,有的是各种标准强化学习算法的、有的是基于演化算法的、有的是确定性的。我们也可以把真实世界的市场数据作为监督反馈信号,「迫使」模拟环境中的智能体共同形成和真实世界类似的行为。

时间上的连续性

由于市场的变化速度实际上在微秒到毫秒级,交易领域的问题实际上就成为了很好的连续时间领域的问题。在上面的例子中我们假定了固定的时间间隔并把它指定给了智能体。不过,其实我们还可以让智能体学习控制间隔时间。这样,智能体不仅可以自己决定采取哪些行动,还可以决定何时采取行动。这又是一个热门研究问题,机器人之类的其它领域也可以由此受益。

非平稳、终身学习,以及灾难性的遗忘

始终在更新变化是交易环境的固有属性。市场状况会变化,总有一些交易者在加入和离场,他们的策略也在时时更新。我们能否训练出这样的智能体,它们既可以学会自动调节,可以适应不断变化的市场环境,同时还不「忘记」它们曾经学到过的东西呢?比如,智能体能否成功从熊市的交易策略转向牛市的交易策略,然后再回到熊市的策略,同时这一整个过程还都不需要重新训练呢?智能体能否自动适应新加入环境的智能体,并且自动学会利用它们呢?

迁移学习以及辅助任务

对于复杂问题,从零开始训练强化学习算法可能要花费很长时间,因为它们不仅要学习如何做出好的决定,还要学习「游戏的基本规则」。加速强化学习智能体训练的方法有很多,包括迁移学习以及使用辅助任务。比如,我们可以用专家给出的策略做强化学习智能体的预训练,或者增加价格预测之类的辅助任务作为智能体的训练目标,这都可以提升训练速度。

结论

这篇文章的目的是对基于强化学习方法的交易智能体做一个入门介绍,讨论为什么这种方法优于现有的交易策略开发方法,以及提出什么我相信更多研究人员都应该研究这个问题。我希望我这篇文章达到了部分效果。

感谢阅读!

via WildML,雷锋网 AI 科技评论编译

阅读剩余内容
网友评论
相关内容
延伸阅读
小编推荐

大家都在看

作文 校园一角 关于母爱作文 疫情在家作文 日记作文怎么写 快乐一天的作文 作文300字以上 鹅的作文 风中作文 植物300字作文 晒的作文 爱自己作文 牡丹的作文 写人篇作文 小学作文搞笑 描写公园的作文 作文三书 秋天的作文三年级 夸夸的作文 八篇作文 趣事作文400字 作文我的生日 写桃花作文 妈妈的作文600字 重拾作文 英语作文演讲稿 作文研究报告 妇女节作文 了不起的作文 英语作文标题 学会作文600字