当前位置:   article > 正文

qlearning算法_优化强化学习Qlearning算法进行股市交易(附代码)

基于q学习的股票预测

18a4a55f002ee319401021801c9b8424.png标星★公众号,第一时间获取最新资讯

本期作者: Alexey Burnakov

本期翻译:1+1=6

近期原创文章:

♥ 2018中国量化投资年度盘点【独家】

 利用深度学习最新前沿预测股价走势

 一位数据科学PhD眼中的算法交易

 深度学习是信号处理和时序分析的最后选择?

 人工智能『AI』应用算法交易,7个必踩的坑!

 神经网络在算法交易上的应用系列(一)

 预测股市 | 如何避免p-Hacking,为什么你要看涨?

 如何鉴别那些用深度学习预测股价的花哨模型?

 Quant必备:学什么、哪家面试难、哪家挣大钱?

全部代码,文末下载

首先请阅读这篇文章:

地址:https://storage.googleapis.com/deepmind-media/dqn/DQNNaturePaper.pdf

9250f12261429b84689bf9b41b6e58f0.png

它将向您介绍使用深度Q-Network (DQN)来逼近对解决马尔可夫决策过程至关重要的值函数的思想。

还推荐使用Richard S. Sutton and Andrew G. Barto: 的这本书的预印本深入研究RL数学:

地址:

http://incompleteideas.net/book/bookdraft2017nov5.pdf

745f3d68245c9da44bda6251ef109b7b.png

稍后将介绍原始DQN的一个高级版本,它包含了更多的想法,以帮助它更好更快地收敛,即:

Deep Double Dueling Noisy神经网络与 prioritized sampling的经验回放缓冲区。

是什么使这种方法优于传统的DQN?

  • Double: there are two networks which train and estimate next Q values

  • Dueling: there are neurons that estimate state value and advantages explicitly

  • Noisy: there are noise matrixes applied to intermediate layers, where the noise parameters mean and standard deviations are the learnable weights

  • Prioritized: batches of samples from the replay buffer contain examples that made previous function trainings produce large residuals which can be stored in an auxiliary array

那么,由DQN智能体进行的交易呢?这本身就是一个有趣的话题。

它有趣的原因如下:

1、选择状态表示、操作、奖励和NN架构的绝对自由。人们可以用任何他们认为值得尝试的东西来丰富输入空间,从新闻到其他股票和指数。

2、交易逻辑与强化学习逻辑的拟合为:agent做出离散(或连续)的行为,奖励本质上是稀疏的(交易结束或周期结束后),环境是部分可见的,可能包含下一步的信息,交易是一种情景博弈。

3、我们可以将DQN结果与几个基准(如指数)进行比较。

4、Agent可以不间断地学习新信息,从而适应不断变化的规则

使用Keras后端构建RL智能体的神经网络的代码:(全部代码文末下载,同时有Python)

部分代码展示

state_names_length 12 # just for examplea_CustomLayer           "CustomLayer"          , inherit = KerasLayer          , public = list(                        call = function(x, mask = NULL) {                 x - k_mean(x, axis = 2, keepdims = T)            }                 ))a_normalize_layer function(object) {     create_layer(a_CustomLayer, object, list(name = 'a_normalize_layer'))}v_CustomLayer      "CustomLayer"     , inherit = KerasLayer     , public = list(                    call = function(x, mask = NULL) {               k_concatenate(list(x, x, x), axis = 2)          }                    , compute_output_shape = function(input_shape) {                              output_shape = input_shape               output_shape[[2]] 2]] * 3L                              output_shape          }     ))v_normalize_layer function(object) {     create_layer(v_CustomLayer, object, list(name = 'v_normalize_layer'))}

神经网络是这样的:

b06f93e8f3acfdd332688cece3742966.png

Q = A’ + V, where

A’ = A — avg(A);

Q = state-action value;

V = state value;

A = advantage.

第一阶段

交易成本0.5:

4f3a892c4f926a53df8737217d1a56b6.png

在这种情况下,最高平均奖励应该是1.5。

788bd736b92f365a278aaa39a7e3f686.png

Training of DQN on synthetic data

第二阶段

We train our agent on an arbitrarily chosen stock symbol that showed interesting behaviour: flatty beginning, rapid growth in the middle, and a dreary ending. There are about 4300 days in our training set. Transaction cost set to $0.1 (purposefully low); each reward is a USD profit/loss after buying/selling 1.0 share.

68d57b6afa6c49f93f9579e4c1ed4f0f.png

在调整了一些参数(保持NN架构不变)之后,我们得到了这样的结果:

0caaf577b165df7d01aeaf1348a75b62.png

9cf886752484012164ef77aef51ce1de.png

red = sell, green = buy, grey = hold

that at its apex the average reward per episode has beaten the realistic transaction cost that one may face in real trading.

在第一阶段的图中,正弦函数是第一个交点。这两条曲线模拟的是价差最小的资产的买入价和卖出价。

然而,这一次,我们想通过延长信度分配传播来使这个简单的任务复杂化:

18f84f69b5a35fff8fff44ecc446de24.png

正弦的相位增加了两倍。

这意味着我们使用的sparse rewards需要在更长的轨迹中传播。最重要的是,我们严重地减少了获得正面回报的机会,因为agent必须采取2倍长的正确行动序列来克服交易成本。即使在正弦这样简单的设置中,这两个因素都会使任务变得更加困难。

此外,回忆一下我们使用的神经网络的架构:

9fe1fbb15c1e043e436141f657633ee3.png

添加了什么,为什么添加

LSTM

首先,我们想让一个agent更了解轨迹内变化的动力学。简单地说,agent应该更好地理解自己的行为:它刚刚做了什么,在过去的某个时间做了什么,以及状态行为分布是如何演变的。使用循环层可以解决这个问题。使用新的架构来运行新的训练集:

e2b9e2c292cccdb0a571a04960a85b89.png

请注意,我们稍微改进了描述。与旧NN的区别是第一个隐藏层是LSTM。

注意,在使用LSTM时,我们必须修改经验来回采样进行训练:我们现在需要转换序列,而不是单个示例。这就是它的工作原理。我们以前用过逐点抽样:

372f1f744c337d4b945e627edf9959f5.png

一个虚拟的重放缓冲方案

我们将此方案与LSTM一起使用:

2872afbe8b1111b2a173538dc6f1c0a7.png

无论是以前还是现在,采样都是由一个优先排序算法控制的。

LSTM递归层允许时间序列信息向前传播来捕获隐藏在过去滞后中的额外信号。时间序列是一个多维张量,其大小与状态表示的大小相同。

展示

PBRS,是一种强大的工具,可以提高速度、稳定性,并且不会打破寻找政策解决环境问题的过程的最优性。

论文:https://people.eecs.berkeley.edu/~russell/papers/ml99-shaping.ps

a26d7278c0de1c9ea8bbd17a7be4f269.png

潜能决定了我们所处的状态有多好,它是我们想要进入的目标状态。它是如何工作的一个简单的观点:

e8119cd7395df74e9e278e6b5c98ec05.png

有各种各样的变化和复杂的情况,你可以通过反复试验来理解,但是我们忽略了这些细节。

更糟糕的是,PBRS可以通过使用一种专家形式,在一个环境中学习接近最优行为的表现。有一种方法可以使用优化方案为我们的任务找到这样的表示。

A potential-shaped reward takes the following form (eq. 1):

r’ = r + gamma * F(s’) — F(s)

其中F表示状态的势能,r是初始奖励。

带着这些想法,我们开始编写代码:

使用R语言实现

下面是基于Keras API的神经网络代码:(全部代码文末下载,同时有Python)

部分代码展示

critic_model_v  critic_input %>% common_lstm_layer %>% critic_layer_dense_v_1 %>% critic_layer_dense_v_2 %>% critic_layer_dense_v_3 %>% v_normalize_layercritic_model_a  critic_input %>% common_lstm_layer %>% critic_layer_dense_a_1 %>%#critic_layer_dense_a_2 %>% noise_add_layer(output_dim = 5) %>% critic_layer_dense_a_3 %>% a_normalize_layercritic_output  layer_add(list( critic_model_v , critic_model_a ) , name = ‘critic_output’ )critic_model_1  inputs = critic_input , outputs = critic_output)critic_optimizer = optimizer_adam(lr = learning_rate)keras::compile( critic_model_1 , optimizer = critic_optimizer , loss = ‘mse’ , metrics = ‘mse’)train.x 10 * lstm_seq_length * state_names_length) , dim = c(10, lstm_seq_length, state_names_length) , order = ‘C’)predict(critic_model_1, train.x)layer_name intermediate_layer_model predict(intermediate_layer_model, train.x)[1,]critic_model_2 

结果比较

让我们直接进入最后的结果。

注:所有的结果都是点估计,当使用不同的随机数多次运行时可能会有所不同。

比较包括:

  • 旧版本没有LSTM和presentations

  • 一个简单的2-cell LSTM

  • 一个4-cell LSTM

  • 带有PBRS的4-cell LSTM

d5714036ef2fa0d32fc01d7a73c901ab.png

mean return per episode averaged over 1000 episodes

9f0afe9e2921a76a7bec211db4bfe0e5.png

cumulative return per episode

29998d39027c8b6d82359d0743edb8d3.png

b78c672f758abcdbc88445bba64a4aa8.png

learning progress of the agent

与早期的尝试相比,PBRS目标的收敛如此快速和稳定。没有presentations,速度大约是4-5倍。稳定性非常显着。

在使用LSTM时,4个cell的效果优于2个cell。2cell的LSTM比no-LSTM表现出更好的效果。

最后的话

我们已经看到,重复和基于潜力的奖励形成是有帮助的。

不要相信那些告诉你构建良好强化学习智能体很容易的人,因为这是一个谎言。添加到系统中的每个新组件都可能降低系统的稳定性,需要进行大量的调优和调试。

然而,有明确的证据表明,只要改进所使用的方法(数据保持不变),任务解决方案就可以得到改进。对于任何给定的任务,一个特定的参数范围都比其他的工作得更快。

如何获取代码

后台输入

20190124

后台获取方式介绍

9c9abbde64ee9c0a26482bc214ec067d.png

公众号官方QQ群

量化、技术人士深度交流群

3257c564d061b1152d9c2ea1eaa76a63.png

扫码关注我们

6761926d37e339308664433246e1c879.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/540442
推荐阅读
相关标签
  

闽ICP备14008679号