分类
外汇交易基础知识

利用强化学习创建自动交易机器人

Nothing worth having comes easy

ElegantRL: 基于PyTorch的轻量-高效-稳定的深度强化学习框架 利用强化学习创建自动交易机器人

深度强化学习(DRL)在解决对人类有挑战性的多个现实问题中展示了巨大的潜力,例如自动驾驶,游戏竞技,自然语言处理(NLP)以及金融交易等。各种各样的深度强化学习算法及应用正在不断涌现。ElegantRL能够帮助研究人员和从业者更便捷地“设计、开发和部署”深度强化学习技术。ElegantRL的elegant体现在以下几个方面:

  • 轻量:tutorial版将一直维持在1000行以内,并保持与正式版拥有相同的API。
  • 高效:性能向Ray RLlib靠拢,支持多GPU训练。
  • 稳定:比Stable Baseline 3更加稳定。

总述:文件结构和函数

ElegantRL的“小”最直观的体现就是:整个库只有3个文件,net.py, agent.py, run.py。再加上一个env.py 利用强化学习创建自动交易机器人 用于存放与训练环境有关的代码。我们很开心能在Tutorial版用少于1000行的代码实现了一个完整的DRL库。请注意,Tutorial版的ElegantRL只是用来学习的,它可以快速地让人了解一个DRL库最为核心的结构。如果想要进一步把ElegantRL当做生产工具,则需要使用正式版的ElegantRL,它的文件结构和函数保持了与 Tutorial版的统一,降低了学习成本。

  • 包括PreprocessEnv类,可用于对gym的环境进行改动。
  • 包括自主开发的股票交易环境作为用户自定义环境的例子。
  • Q网络
  • Actor网络
  • Critic网络

我们从一个较高的层面描述这些文件之间的关系。首先,初始化env.py文件中的环境和agent.py文件中的Agent类。Agent类既包含了net.py文件中的网络,又与env.py文件中的环境进行互动。在run.py中进行的每一步训练中,Agent都会与环境进行互动,产生transitions并将其存入回放缓存(Replay Buffer)。之后,Agent从Replay Buffer中获取数据来更新它的网络。每隔一段时间,都会有一个评测器(Evaluator)来评测策略的得分,并保存表现好的策略。我们也提供了“demo.py”文件作为示例,可以帮助用户更好地理解这个过程。

网络类的集合 net.py

1.把图片作为state输入神经网络时,只需要在 net.py 将全连接层修改为卷积层即可,我们提供了这个例子,当网络检测到输入的张量是图片时,会自动启用卷积网络。

DRL算法的构建 agent.py

DQN系列中的Agent类:

  • AgentDQN:标准的DQN Agent。
  • AgentDoubleDQN:为了减少过高估计而包含两个Q网络的Double-DQN Agent,继承自AgentDQN。
  • AgentDuelingDQN:采用不同的Q值计算方式的DQN Agent,继承自AgentDQN。
  • AgentD3QN:AgentDoubleDQN和AgentDuelingDQN的结合,继承自 AgentDoubleDQN。

DDPG系列中的Agent类:

  • AgentBase:所有A-C框架下Agent的基类,包括所有Agent共有的参数。
  • AgentDDPG:DDPG Agent,继承自AgentBase。
  • AgentTD3:采用新的更新方式的TD3 Agent,继承自AgentDDPG
  • 探索环境(explore_env):Agent利用它的网络与环境互动,在此过程中产生用于训练网络的数据。
  • 更新网络(update_net):Agent从Replay Buffer中获取一批transitions,并利用这些数据通过反向传播来更新网络

经验回放缓存将极大地影响的DRL库的训练速度。我们专门根据同策略算法(on-policy)和异策略算法(off-policy)的特点,分别对 ReplayBuffer 进行了优化:https://zhuanlan.zhihu.com/p/103605702

回放缓存 Replay Buffer:

训练流程 run.py:

效果展示:BipedalWalker-v3

步骤1:安装ElegantRL

步骤2:导入相关的库

  • ElegantRL
  • OpenAI Gym:用于开发和比较不同强化学习算法的工具
  • PyBullet Gym: OpenAI Gym的MuJoCo环境的开源实现

步骤3:指定Agent和环境

  • args.agent:首先选定DRL算法,用户可以选择agent.py中的Agent
  • args.env: 创建并修饰环境,用户在env.py中既可以创建自定义的环境,也可以修饰OpenAI Gym和PyBullet Gym的环境

步骤4:训练并评测Agent

一旦满足某个条件,训练过程将会自动终止。然后画出 learning curve 等数据帮助使用者调整超参数、算法以及环境。

步骤5:测试结果

我们提供了Colab: https://github.com/AI4Finance-Foundation/ElegantRL/blob/master/eRL\_demo\_BipedalWalker.ipynb
的代码,帮助你运行双足机器人 BipedalWalker-v3 的demo,也许你能解锁出这个机器人的其他步态。如果你认为这个例子难度太低,该任务的进阶版BipedalWalkerHardCore-v3 是一个困难任务,环境中将会随机出现阻挡前进的台阶、沟壑以及大小箱子。由于它要求智能体在随机因素大的环境下训练(Dynamically Varying Environments 或者叫 非平稳环境 Non-Stationary Environments),(在Gym的Leaderboard(https://github.com/openai/gym/wiki/Leaderboard) 搜索这个环境的名字,可以看到有很多没有标注通关步数的算法 。)

ElegantRL 就能通关这个很难的环境,选对了算法,用对了超参数的情况下,单GPU训练超过半天就能通关,有兴趣的可以挑战一下(用SAC、ModSAC 可以通关,而PPO比较难)。
除了以上这些应用展示外,令人激动的是,ElegantRL已经可以支持Nvidia推出的用于强化学习的物理模拟环境Isaac Gym。可以帮助用户更方便地在Isaac Gym中高效地训练自己的Agent。我们将会在近期展示使用ElegantRL在Isaac Gym环境中训练可以胜任任务的Agent的应用案例,届时也会将代码上传至github仓库,敬请期待。

Reinforcement Learning Toolbox

借助该工具箱,您可以使用深度神经网络或查找表来表示策略和价值函数,并使用 MATLAB ® 或 Simulink 创建环境模型,通过与环境交互来训练策略和函数。您可以评估该工具箱中提供的单智能体或多智能体强化学习算法,也可以开发自己的算法。您可以使用超参数设置进行试验,监控训练进度,并通过 App 以交互方式或编程方式仿真经过训练的智能体。为了提高训练性能,可以在多个 CPU、GPU、计算机集群和云上并行运行仿真(需要 Parallel 利用强化学习创建自动交易机器人 Computing Toolbox™ 和 MATLAB Parallel 利用强化学习创建自动交易机器人 Server™)。

通过 ONNX™ 模型格式,可以从 TensorFlow™ Keras 和 PyTorch 等深度学习框架导入已有策略(需要 Deep Learning Toolbox™)。您可以生成优化的 C、C++ 和 CUDA ® 代码,以便将经过训练的策略部署到微控制器和 GPU。该工具箱包括参考示例,可帮助您快速入门。

强化学习智能体

在 MATLAB 和 Simulink 中创建和配置强化学习智能体来训练策略。可以使用内置的强化学习算法,也可以开发自定义算法。

强化学习算法

使用深度 Q 网络 (DQN)、深度确定性策略梯度 (DDPG)、近端策略优化 (PPO) 和其他内置算法创建智能体。使用模板开发自定义智能体,以用于训练策略。

创建不亏钱的BTC交易机器人-基于深度强化学习

quantLearner 于 2019-07-23 11:40:03 发布 利用强化学习创建自动交易机器人 3590 收藏 25

在这篇文章中,我们会创建一个深度强化学习代理(称其为经纪人),使其学习通过交易BTC赚钱。本教程使用OpenAI的 gym 【OpenAI Gym简介及初级实例】以及 stable-baselines 库(OpenAI baselines 包的一个分叉)的PPO代理。

Nothing worth having comes 利用强化学习创建自动交易机器人 easy

在这里插入图片描述

  1. 为我们的智体创建一个gym环境
  2. 为环境提出一个简单同时细致的可视化
  3. 训练我们的智体学出一个正收益的训练策略

首先, 利用强化学习创建自动交易机器人 import 必要的包,确保安装 pip install 你本地缺少的那些。

然后,为环境创建类。需要传入一个 pandas 的 dataframe 数据类型、可选参数 initial_balance 、以及 lookback_window_size (表示每步中 agent 观察的时间步长)。手续费默认0.075%,这是Bitmex现行费率,默认 serial 参数为 False ,意味着默认情况下以随即切片遍历 dataframe 数据。

我们在 dataframe 上调用 dropna() 以及 reset_index() ,首先删除含有 NaN 的行,然后重置数据的 index 。

我们的action_space以一组3元(买、卖、持有)离散数据集和一组10元(1/10,2/10,3/10,…)离散集表示。当选择buy action,我们会买入 amount * self.balance 价值的 BTC ,如果选择sell action,会卖出 amount * self.btc_held 价值的 BTC 。

以一组 (0-1) 之间的连续 float 集定义我们的 observation_space ,形状为 (10, 利用强化学习创建自动交易机器人 lookback_window_size + 1) .其中 +1 表示当前时间步。对于窗口内的每个时间步,我们会观察 OHCLV 值、净值、买入或卖出的 BTC 数量、以及买卖 BTC 造成的 USD 损益。

然后,我们需要写出 利用强化学习创建自动交易机器人 reset 方法来初始化环境。

这里,我们同时使用 self._reset_session 和 self._next_observation ,这两个还未定义。下面给出定义。

在这里插入图片描述

我们环境的一个重要部分是 trading session 的概念。如果我们将此 agent 部署在原始环境,我们基本不会一次就跑几个月。基于此,限制 agent 在某行可见的 self.df 中的连续数据的数量。

在我们的 _reset_session 方法中,我们首先重置 current_step 为0,然后设置 steps_left 为 (1,MAX_TRADING_SESSION) 之间的随机数。 利用强化学习创建自动交易机器人 MAX_TRADING_SESSION 是在文件头部位置定义的。

然后,如果我们串行遍历数据集,就将数据集设置为可遍历的,不然设置 frame_start 为 self.df 中的一个随机点。并创建一个称为 active_df 的新数据集,这个 active_df 就是 self.df 中从 frame_start 到 frame_start + steps_left 的切片。

以随机切片方式遍历dataframe的一个重要副作用是在长期训练后我们的agent会有很多独特数据。例如,如果我们仅以串行方式遍历数据集(例如,按序从 0 到 len(df) ),然后我们会有很多独特数据点。我们的观察空间每个时间步指挥采取一个离散数。

现在考虑随即切片的环境,在10时间步,我们的 agent 会是数据集中的任意 len(df) 时间步。每个时间步给出相同的各类选项,这意味着agent会经历 利用强化学习创建自动交易机器人 len(df) ³⁰中的任意一种状态。

Agent眼看世界

图片中的每一行表示 observation_space 中的一行。像频谱的前面四行表示 OHCL 数据,虚的橙色和黄色点直接代表成交量。下面的波动蓝柱表示 agent 的净值,下面的亮点表示 agent 的交易。

如果你眯起眼睛,你会发现蜡烛图:下面是成交量,再下面有点像莫尔斯电码。看起来像是我们的agent可以从observation_space的数据中充分学习,让我们继续。我们在此定义 _next_observation 方法,对观察数据进行归一化。

现在我们已经建立了观测空间,是时候写出我们的 step 函数,然后反过来执行 agent 的预设行动。对于当前交易周期,无论何时 self.steps_left == 0 ,我们会卖出持有的所有BTC并调用 _reset_session() 。另一方面,我们为当前净值设置 reward ,如果钱亏光了就只设置 done 为 True 。

采取行动就跟获取 current_price 利用强化学习创建自动交易机器人 一样简单,决定一个特定的行动,或买或卖特定数量的BTC。让我们快速写出 _take_action 以便测试我们的环境。

最后,用相同方法,将交易添加到 self.trades 并更新净值和账户历史。

观察我们的机器人交易

我们采用上篇文章中 StockTradingGraph.py 的代码,并为呈现我们的BTC环境做出适当改变。

第一个改变是将所有 self.df['Date'] 更新为 self.df['Timestamp'] ,并删除所有 date2num 调用,因为我们的日期已经成为 unix 时间戳格式。下一步,在我们的 render 方法中,我们更新数字式的日期标签为输出人可识别的日期。

首先导入datetime包,然后使用 utcfromtimestamp 利用强化学习创建自动交易机器人 方法从时间戳中获取 UTC 字符串,用 strftime 将此字符转格式化为 Y-m-d H:M 形式。

最后,我们将 self.df['Volume'] 改为 self.df['Volume_(BTC)'] 以匹配数据集。返回 BitcoinTradingEnv ,现在我们可以写出 render 方法来呈现图形。

例如,交叉验证的一种常见形式时k折验证,这种方式将数据集分成k等份,把每一子集逐一作为测试集剩余k-1项作为训练集。然而时间序列时时间高度相关的,意味着后续时间与前面的时间有关联。因此k折交叉验证不起作用,因为我们的 agent 会从未来数据中学习,这是一种不公平的优势。

现在,训练模型简单的就像用环境创建一个 agent ,并调用 model.learn 。

这里我们用 Tensorboard 以便于可视化 tensorflow 图表,并查看一些 agent 的量化指标。例如下面是许多 agents 在超过200,000时间步内的折扣奖励。

在这里插入图片描述

在这里插入图片描述

如你所见,部分 agent 表现良好,其他的把自己搞破产了。然而,做的好的agents可以翻10倍甚至60倍。我必须指出,所有这些正收益agents都是在无佣金环境下训练和测试的,因此目前依然不能实盘。但是我们已经有进展了。

让我们在测试环境(他们不曾见过的新数据)测试 agents ,看看他们交易 BTC 的水平学的怎么样了。

在这里插入图片描述

明显,还有更多工作要做。舍弃先用的PPO2 agent ,改用 stable-baseline 的 A2C 模型,可以大大提升表现性能。最后微调 reward 函数,以获取净值增长奖励而不是仅仅获得高收益并保持在那。

利用强化学习创建自动交易机器人

image1_v2-f4e6890059f34c12e1222fbed69c8595

机器人和工业自动化

image2-646dd57cfdd862da8bb3a948439f9bc0

  • 你正在使用模拟器,因为系统或过程对于通过试错来训练机器来说太复杂(或者物理上过于危险);
  • 你正在处理大状态空间;
  • 你正寻求通过优化运营效率和提供决策支持来增强人类分析师和领域专家的能力。

数据科学和机器学习

教育和培训

保健和医学

文字,语音和对话系统

传媒和广告

与任何新科技一样,运用强化学习的关键在于了解其优缺点,然后找到简单的应用场景来尝试。我们应该抵制AI的炒作。相反,我们应该地把强化学习看成是有用的机器学习技术的一种,即便它是一种最适合于特定类别的问题的技术。 我们刚刚开始在企业应用中看到强化学习的身影。伴随着对算法的不断研究,许多软件工具(库、模拟器、分布式计算框架,如Ray、SaaS)开始出现。 不过可以肯定的是,这些工具很少是针对行业应用所感兴趣的用户的。但是,已经有几家初创公司将强化学习纳入其产品。所以,在你知道之它们的存在之前,你可能很快就会从强化学习和相关技术的发展中受益。