DQN个股择时策略研究
由ypyu创建,最终由qxiao 被浏览 495 用户
旧版声明
本文为旧版实现,仅供学习参考。
https://bigquant.com/wiki/doc/demos-ecdRvuM1TU
\
导语
本文主要分享一个基于Deep Q Network的对于个股的择时策略
算法简介
DQN与Q-Learning
本文主要使用的是Deep Q Network。DQN是强化学习的一种方法,结合了Q-learning和深度学习神经网络。
Q-learning是用一张表来记录各个状态下的各个行为的q值,它能记录的状态的个数是有限的。而在金融市场上,价格、交易量等数据都是连续的,因此可以组合成无数种状态,如果用一张表来记录,那么这张表将大到无法想象。
而DQN不用表来记录Q值,而是用一个深度学习神经网络来预测Q值,并通过不断更新神经网络从而学习到最优的行动路径。结构如下所示:
仿真环境输出state,reward, 神经网络根据状态选择action,形成一条(state, reward, action, next_state)的记录记录到memory中,当memory中的记录达到一定数量后,用一种采样策略从memory中进行采样,然后对模型进行训练和参数更新,以更好的选择action。
算法更新
强化学习中,agent的目标是最大化期望累积奖励。 我们用Q(s, a)来表示Q-table中 s 状态下选择 a 行为的Q值, s' 表示 s 的下一个状态, 则 max Q(s', a') 表示下一个状态下各个行为中最大的Q值,则我们的目标Q值是 $reward+\gamma*\max_{a'}Q(s',a')$而我们实际预测的Q值为Q(s,a),则预测误差为他们的差值。因此我们用以下式子来对表中的Q值进行更新: $Q(s,a)=Q(s,a)+\alpha*[reward+\gamma *max_{a'} (s',a')-Q(s,a)]$
DQN中网络参数的更新逻辑和Q-table中是一致的。我们用目标Q值作为输入来训练模型。 由于模型中输出的是s状态下所有行为的Q值 [ q1, q2, q3, ...],其中q1, q2, q3 分别对应行为 1, 2, 3的预测Q值。假设我们已知s状态下2行为的reward,则我们需要先得到模型预测的Q-value=[q1, q2, q3, ...], s'状态下最大Q值 max Q(s',a'), 则(s,2)的Q-target为 reward+gamma*max Q(s',a'), 用这个Q-target替代原Q-value中的 q2, 得到 [ q1, q2-target, q3, ...], 并用这条数据去训练模型来更新参数。也就是说虽然网络输出s状态下所有行为的q值,但我们每次只能更新其中一个行为的参数,所以需要做这样一个替代再进行训练。以上这些逻辑可以用以下几行代码进行实现:
q_value=self.model.predict(state) #得到预测q值
target=reward+self.gamma*np.amax(self.model.predict(new_state)[0]) #计算q-target
q_value[0][action]=target #用q-target替换对应行为的q值
self.model.fit(state,q_value,epochs=1,verbose=0) #fit 模型
数据选取
本文示例中选择了000001.SZA,用2012-01-01到2016-01-01的日线数据做训练,2016-01-01到2017-01-01的数据做测试。
策略思路
DQN的原理与个股的择时逻辑相一致,每当有新的一天的行情数据出现时,我们在原始数据的基础上计算得到一个state, 神经网络根据这个state选择买进或是卖出,选择之后环境会给我们一个反馈,我们根据这个反馈反思这次行为选择的好坏,从而更新网络的参数,使得下一次能够选择更好的行为。 模型训练结束后,输入测试集数据,根据输出q值选择行为,并根据这些行为在平台交易引擎上进行回测,根据回测结果对模型进行评价。
策略研究流程
策略代码一共分为四个部分:构建环境,定义agent,训练以及测试。
使用DQN时,首先我们需要构建一个环境,定义state, action, reward以及手续费等,这里我们选择当天的OHLCV和7个常用因子数据作为一条state, 定义sell和buy两种action,把总资产价值的变化作为行为的reward。
然后我们需要定义一个agent,agent里主要定义replay, model, choose_act三个函数。model定义神经网络结构,这里我们选择构建一个3层的全连接神经网络,每层分别定义64/32/8个神经节点。replay用于模型训练,choose_act用于根据模型输出结果选择行为。
训练时依次获取state,根据模型结果选择action,形成一条记录写到memory中,当memory中的记录数量超过我们设置的batch_size时,从memory中采样对模型进行训练。
测试时根据测试集数据依次获取state并输入模型获得q值预测,从而选择行为,根据选择的行为在平台交易引擎上进行回测,作为模型的评估依据。
回测结果
未来扩展研究
这个策略只是DQN的一个非常简单的实现,还有很多的改进和调整的空间,比如:
- 目前这个策略基于日线数据进行操作的,也可以改为对分钟数据进行操作,众多的相关研究报告都表明强化学习在日内高频数据上优于日频数据,本文只是一个强化学习算法在量化交易中的demo实现,后续会推出DQN在高频数据上的研究成果。
- 可以在模型中定义两个神经网络,一个及时更新参数,用来输出当前Q值,另一个不及时更新参数,用来输出目标Q值, 这样在一段时间里目标Q值是保持不变的,一定程度降低了当前Q值和目标Q值的相关性,提高了算法稳定性。
- 可以定义sell/buy/hold三种action,这样就不一定要每天进行买卖操作,和真实情况更加接近,也能降低频繁操作带来的成本,如手续费等。
- 可以用不同的方法来定义state。
- 可以对神经网络的深度和参数做进一步的调整。
- 目前这是一个针对个股的择时策略,可以在这个基础上做一定的修改,把它变成一个选股策略。
欢迎大家进行尝试和讨论。
策略案例
https://bigquant.com/experimentshare/a325305d49a648e292ed3ec34d49930d
强化版请点击:DQN个股择时策略研究与改进