城中IT教育资源网

城中IT教育资源网

阴户口交-TensorTrade:基于深度强化学习的Python交易框架

作者:Adam King

编译:1+1=6

前言

必看!

互联网上有很多关于强化学习阴户口交系统零零碎碎的东西,但是没有一个是可靠和完整的。出于这个原因,我们决定创建一个开源的Python框架,使用深度强化学习,有效地将任何阴户口交策略从想法转化为实际应用。

Tensortrade

Tensortrade 是一个开源的 Python 框架,用于使用深度强化学习进行训练、评估和部署稳健的阴户口交策略。该框架的重点是高度可组合性和可扩展性,允许系统在单个 CPU 上从简单的阴户口交策略扩展到在 HPC 机器上运行的复杂投资策略。

https://www.tensortrade.org/en/latest/index.html

在底层,该框架使用现有机器学习库中的许多API来维护高质量的数据通道和学习模型。TensorTrade的主要目标之一是利用Numpy、Pandas、Gym、Keras和Tensorflow提供现有的工具,实现算法阴户口交策略的快速实验。

框架的每个部分都被分割成可重用的组件,允许你利用社区构建的通用组件,同时保持私有私密性。其目的是使用深度强化学习来简化测试和部署稳健的阴户口交代理过程,使我们能够专注于创建有利可图的策略。

强化学习回顾

Reinforcement learning (RL) is an area of machine learning concerned with how software **ents ought to take actions in an environment so as to maximize some notion of cumulative reward.

每一个强化学习问题开始于一个环境和一个或多个可以与环境交互的**ent。

**ent将首先观察环境,然后构建当前状态和该环境中操作的预期值模型。基于该模型,**ent将采取它认为具有最高期望值的行动。

根据环境中所选择的操作的效果,**ent将获得与该操作的实际值相对应的奖励。然后,通过反复试验(即通过强化学习)的过程,强化学习**ent可以改进其底层模型,并学会随着时间的推移采取更有价值的行动。

安装

TensorTrade需要Python 3.5或更高版本,所以请确保在安装该框架之前使用的是有效版本。

pip install tensortrade

你还需要安装一些额外的依赖库:tensorflow、tensorforce、stable-baselines、ccxt、TA-lib、stochastic等。

pip install tensortrade[tf,tensorforce,baselines,ccxt,talib,fbm]

TensorTrade组件

TensorTrade是围绕组成阴户口交策略的模块组件构建的。阴户口交策略将强化学习**ent与可组合的阴户口交逻辑以gym环境的形式结合起来。阴户口交环境由一组模块化组件组成,这些组件可以混合和匹配以创建高度多样化的阴户口交和投资策略。稍后我们将更详细地解释这一点。

就像电子元件一样,TensorTrade元件的目的是能够根据需要进行匹配。

阴户口交环境

阴户口交环境是遵循OpenAI的gym.Env规范的强化学习环境。这允许我们在我们的阴户口交代理中利用许多现有的强化学习模型。

阴户口交环境是完全可配置的gym环境,具有高度可组合的InstrumentExchange、 FeaturePipeline、 ActionStrategy、RewardStrategy组件。

InstrumentExchange:提供观察并执行代理的阴户口交。 FeaturePipeline:在将exchange输出传递给代理之前,FeaturePipeline可选择将其转换为更有意义的一组特征。 ActionStrategy:将**ent的操作转换为可执行的阴户口交。 RewardStrategy:根据**ent的表现计算每个时间步骤的奖励。

如果现在看起来有点复杂,其实不然。这就是它的全部内容,现在只需将这些组件组合成一个完整的环境。

当调用TradingEnvironment的reset方法时,所有子组件也将被重置。每个instrument exchang,FeaturePipeline,transformer,action strategy,和reward strategy都会被设置回默认值,为下一面做好准备。

让我们从一个示例环境开始。如前所述,初始化阴户口交环境需要一个exchang、一个action strategy和一个reward strategy,FeaturePipeline是可选的。

虽然推荐用例是将阴户口交环境插入到阴户口交策略中,但显然你可以单独使用阴户口交环境,以任何方式使用gym环境。

Instrument Exchanges

Instrument Exchanges决定阴户口交环境中可阴户口交工具的范围,在每个时间步上向环境返回观测值,并执行在环境中进行的阴户口交。有两种类型的Instrument Exchanges:现场和模拟。

实时阴户口交所是由实时定价数据和实时阴户口交执行引擎支持的 InstrumentExchange 实现。例如,CCXTExchange是一个实时阴户口交所,它能够返回定价数据并在数百个实时加密货币阴户口交所(如Binance和Coinbase)上执行阴户口交。

也有股票和ETF阴户口交的阴户口交所,如RobinhoodExchange和InteractiveBrokersExchange。

另一方面,模拟阴户口交所是由模拟定价数据和阴户口交执行支持的 InstrumentExchange 实现。

例如,FBMExchange是一个模拟阴户口交所,它使用分数布朗运动(FBM)生成定价和成交量数据。由于它的价格是模拟的,所以它执行的阴户口交也必须模拟。该阴户口交所使用一个简单的滑动模型来模拟阴户口交中的价格和阴户口交量的滑动,尽管和TensorTrade中的东西几乎一样,这个滑动模型可以很容易地替换为更复杂的东西。

虽然FBMExchange使用随机模型生成虚假的价格和阴户口交量数据,但它只是模拟交换的实现。实际上,SimulatedExchange只需要一个data_frame的价格历史记录来生成它的模拟。这个data_frame可以由编码的实现(如FBMExchange)提供,也可以在运行时提供:

Feature Pipelines

Feature Pipelines用于将环境中的观察结果转换为有意义的特征,供**ent学习。如果将Pipelines添加到特定的交换中,则在将观察结果输出到环境之前将通过FeaturePipeline传递。例如,在将观察结果返回给**ent之前,Feature Pipelines可以将所有的价格值归一化、使时间序列固定、添加移动平均列和删除不必要的列。

Feature Pipelines可以用任意数量的逗号分隔变压器进行初始化。每个FeatureTransformer都需要使用要转换的列集初始化,或者如果没有传递任何内容,则转换所有输入列。

每个Feature Pipelines都有一个transform方法,该方法将把单个观察结果)一个pandas.DataFrame)从更大的数据集中转换出来,在内存中保留转换下一frame所需的任何状态。由于这个原因,经常需要定期重置FeatureTransformer。每次FeaturePipeline或InstrumentExchange时,都会自动执行此操作。

让我们创建一个示例pipeline并将其添加到现有的交换器中。

这个Feature Pipelines将0到1之间的价格值归一化,然后添加一些移动平均列,并通过对连续的值进行差分使整个时间序列保持平稳。

Action Strategies

Action Strategies定义环境的操作空间,并将**ent的操作转换为可执行的阴户口交。例如,如果我们使用一个包含3个Action的离散操作空间(0 =持有,1 = 100%买入,2 = 100%卖出),我们的学习**ent不需要知道返回1的动作等同于买一个instrument。相反,我们的**ent需要知道在特定情况下返回动作1的收益,并且可以将Action转换为阴户口交的实现细节留给ActionStrategy。

每个Action Strategy都有一个get_trade方法,该方法将代理指定的操作转换为一个可执行的 Trade。通常需要在策略中存储额外的状态,例如跟踪当前的阴户口交头寸。每次调用操作策略的reset方法时都应该重置此状态,当TradingEnvironment阴户口交环境重置时将自动执行此操作。

这种离散Action Strategy使用20个离散操作,相当于5种阴户口交类型(市价买入/卖出,限价买入/卖出,持有)。例如:[0,5,10,15]=持有,1=市场买入25%,2=市价卖出25%,3=限价买入25%,4=限价卖出25%,6=市价买入50%,7=市价卖出50%,等等。

Reward Strategies

Reward Strategies接收每一步进行的阴户口交,并返回一个浮动值,与特定操作的收益相对应。例如,如果采取这一步的行动是卖出,导致正的利润,我们的Reward Strategies可以返回一个正数,以奖励更多这样的阴户口交。另一方面,如果这个行为是一个导致损失的卖出行为,那么这个策略可能会得到一个负的收益,以教会**ent在未来不要再做类似的行为。

此示例算法的一个版本是在SimpleProfitStrategy中实现的,但是可以使用更复杂的策略。

每个Reward Strategies都有一个get_reward方法,该方法在每个时间步骤执行阴户口交,并返回与该行为的值相对应的浮动值。与Action Strategy一样,每次调用Reward Strategies的 reset 方法时,这个状态都应该被重置,这是在父TradingEnvironment被重置时自动完成的。

学习Agents

到目前为止,我们还没有看到深度强化学习框架的“深度”部分。这就是学习**ent的用武之地。

在每个时间步骤中,**ent将来自环境的观察作为输入,通过其底层模型(大多数情况下是一个神经网络)运行它,并输出要执行的操作。例如,观察到的可能是阴户口交所之前的开盘价、高点、低点和收盘价。学习模型将这些值作为输入,并输出与要采取的操作(如购买入、卖出或持有)相对应的值。

重要的是要记住,学习模型对这些价值所代表的价格或阴户口交没有直觉。相反,该模型只是简单地学习对于特定的输入值或输入值序列输出哪些值,以获得最高的收益。

Stable Baselines

在本例中,我们将使用Stable Baselines库来为我们的阴户口交策略提供学习**ent,然而,TensorTrade框架与许多强化学习库兼容,如Tensorforce、Ray's RLLib、OpenAI's Baselines、Intel's Coach或TensorFlow中的任何东西,如TF Agents。

https://stable-baselines.readthedocs.io/en/master/

在未来,自定义TensorTrade学习**ent可能会被添加到这个框架中,尽管这个框架的目标是尽可能多地与现有的增强学习库进行互操作,因为在这个领域中有如此多的并行增长。

但就目前而言,稳定的Baselines简单而强大,足以满足我们的需求。

Tensorforce

快速介绍一下Tensorforce库,以展示在增强学习框架之间切换是多么简单。

阴户口交策略

一个阴户口交策略(TradingStrategy)由一个学习**ent和一个或多个阴户口交环境组成,以调整、训练和评估。如果只提供一个环境,它将用于调优、训练和评估。否则,可能在每个步骤中提供一个单独的环境。

把它们放在一起

现在我们已经了解了构成阴户口交策略的每个组件,让我们构建并评估一个组件。

简单回顾一下,阴户口交策略由阴户口交环境和学习**ent组成。阴户口交环境是一个gym环境,它接InstrumentExchange,ActionStrategy,RewardStrategy和一个可选的FeaturePipeline,并返回学习**ent可以训练和评估的观察和奖励。

创建一个环境

第一步是使用上面列出的组件创建一个TradingEnvironment。

很简单,现在环境是一个gym的环境,可以被任何兼容的阴户口交策略或学习代理使用。

定义Agent

现在环境已经设置好了,是时候创建我们的学习**ent了。同样的,我们将会使用Stable Baselines,但是你可以随意加入任何其他的强化学习代理。

因为我们使用的是StableBaselinesTradingStrategy,所以我们需要做的就是为要训练的底层神经网络提供一个模型类型和一个策略类型。对于本例,我们将使用一个简单的近似策略优化(proximal policy optimization, PPO)模型和一个分层规范化的LSTM策略网络。

有关模型和策略规范的更多示例,请参见Stable Baselines文档:

https://stable-baselines.readthedocs.io/en/master/

训练策略

创建我们的阴户口交策略就像插入我们的代理和环境一样简单。

然后,为了训练策略(即在当前环境中训练**ent),我们所需要做的就是调用strategy.run,其中包含你希望运行的步骤等。

三小时后,成千上万的声明打印,你会看到你的**ent做的结果!

如果这个反馈循环对你来说有点慢,那么你可以传递一个回调函数来运行,它将在每一集结束时被调用。回调函数将传入一个 data frame,其中包含该事件中**ent的性能,并期望返回一个bool。如果是,**ent将继续训练,否则,**ent将停止并返回其整体性能。

保存和恢复

所有的阴户口交策略都能够将它们的代理保存到一个文件中,以便以后恢复。环境没有被保存,因为它没有我们关心的状态。要将我们的TensorflowTradingStrategy保存到一个文件中,我们只需要提供文件到我们的策略的路径。

strategy.save_**ent(path="../**ents/ppo_btc_1h")

要从文件中恢复**ent,首先需要实例化我们的策略,然后调用restore_**ent。

我们的策略现在恢复到以前的状态,准备再次使用。

优化策略

有时,阴户口交策略需要调整一组超参数或特征,以达到最大的性能。在这种情况下,每个TradingStrategy都提供一个可选的可实现调优方法。

调整模型类似于训练模型,但是除了调整和保存最佳执行模型的权重和偏差外,该策略还调整和保持生成该模型的超参数。

在这种情况下,**ent将接受10集的训练,每一集都有不同的超参数。最好的集合将保存在策略中,并在任何时间策略中使用。

策略评估

现在我们已经调整和训练了我们的**ent,是时候看看它表现如何了。为了评估我们的策略在样本外数据上的性能,我们需要在有这些数据支持的新环境上运行它。

当完成时,strategy.run返回一个代理性能的pandas数据框架,包括代理在每个时间步的净值和余额。

真实阴户口交

一旦你建立了一个有利可图的阴户口交策略,训练了一个**ent来正确地阴户口交,并确保它对新数据集的泛化能力,剩下要做的就是赚钱。

你可能喜欢开始一个策略,并让它无限制地运行,但风险厌恶程度越高,你可以使用trade_callback,它将在每次策略进行阴户口交时被调用。这个回调函数类似于episode回调,它将传入一个包含**ent的整体性能的dataframe,并返回一个bool。如果为True,**ent将继续阴户口交,否则,**ent将在会话期间停止并返回其性能。

传递steps=0指示策略运行,否则停止。

正如你所看到的,使用简单的组件和深度强化学习来构建复杂的阴户口交策略是非常简单的。你还在等什么?

未来

目前,该框架正处于早期阶段。到目前为止,重点是得到一个工作的原型,与所有必要的积累,以创建高利润的策略。下一步是为未来构建一个路线图,并决定哪些即将到来的构建块对社区来说是重要的。

TensorTrade是一个强大的框架,能够构建高度模块化、高性能的阴户口交系统。尝试新的阴户口交和投资策略是相当简单和容易的,同时允许你将一种策略的组件利用到另一种策略中。

获取代码

在后台输入(严格大小写)

TensorTrade_强化_学习

量化投资与机器学习微信公众号,是业内垂直于Quant、MFE、CST、AI等专业的主流量化自媒体。公众号拥有来自公募、私募、券商、银行、海外等众多圈内18W+关注者。每日发布行业前沿研究成果和最新量化资讯。

分享