Press "Enter" to skip to content

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

互联网上有很多关于强化学习交易系统零零碎碎的东西,但是没有一个是可靠和完整的。出于这个原因,我们决定创建一个开源的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 agents ought to take actions in an environment so as to maximize some notion of cumulative reward.

 

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

 

 

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

 

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

 

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

 

pip install tensortrade

 

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

 

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

 

TensorTrade组件

 

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

 

 

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

 

交易环境

 

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

 

交易环境是完全可配置的gym环境,具有高度可组合的 InstrumentExchange 、  FeaturePipeline 、  ActionStrategy 、R ewardStrategy 组件。

 

InstrumentExchange: 提供观察并执行代理的交易。

 

FeaturePipeline: 在将exchange输出传递给代理之前,FeaturePipeline可选择将其转换为更有意义的一组特征。

 

ActionStrategy: 将agent的操作转换为可执行的交易。

 

RewardStrategy: 根据agent的表现计算每个时间步骤的奖励。

 

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

 

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

 

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

 

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

 

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

 

 

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

 

Action Strategies

 

Action Strategies定义环境的操作空间,并将agent的操作转换为可执行的交易。例如,如果我们使用一个包含3个Action的离散操作空间(0 =持有,1 = 100%买入,2 = 100%卖出),我们的学习agent不需要知道返回1的动作等同于买一个instrument。相反,我们的agent需要知道在特定情况下返回动作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可以返回一个正数,以奖励更多这样的交易。另一方面,如果这个行为是一个导致损失的卖出行为,那幺这个策略可能会得到一个负的收益,以教会agent在未来不要再做类似的行为。

 

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

 

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

 

学习Agents

 

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

 

 

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

 

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

 

Stable Baselines

 

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

 

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

 

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

 

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

 

 

Tensorforce

 

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

 

 

交易策略

 

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

 

 

把它们放在一起

 

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

 

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

 

创建一个环境


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

 

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

 

 

定义Agent

 

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

 

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

 

 

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

 

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

 

训练策略

 

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

 

 

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

 

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

 

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

 

 

保存和恢复

 

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

 

strategy.save_agent(path="../agents/ppo_btc_1h")

 

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

 

 

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

 

优化策略

 

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

 

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

 

 

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

 

策略评估

 

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

 

 

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

 

 

真实交易

 

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

 

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

 

 

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

 

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

 

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

 

 

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

Be First to Comment

发表评论

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