本篇文章所使用的数据,来源于JQData本地量化金融数据库。下面我将粗略的介绍一个强化学习在证券市场中应用的简单实例。
关于强化学习的算法理论及发展历史,我们不做过多的解释。我们可以很容易在互联网上找到强化学习的理论知识,虽然可能都是一些只言片语,但对于初学者来说基本也就够用了。到目前为止,还没有出现广受业内好评的中文教材,更多的参考资料还是英文版的。例如,Richard S.Sutton和Andrew G.Barto所著的《Reinforcement Learning: An Introduction》。这是比较好的强化学习教材,想要系统的、深入的学习强化学习,这本书值得一看。虽然国内学术界有很多关于强化学习的文章,但它们都看起来比较专业,我不建议初学者一上来就开始啃理论。最好的学习方式是你先入门,弄懂强化学习可以干什么?然后应用一些简单的算法搭建一个你当前正想解决的问题,再不断的去改进你的算法,并在这个过程中深入地学习。对于这篇文章而言,我们假设你已经有了一些强化学习的基础知识了,这里只是给出了一个十分简单的关于量化分析的应用demo而已。
作为量化分析领域的专业人员,我们可能对用强化学习解决玩游戏、找宝藏的Demo不感兴趣。我们更希望能够有一个简单的强化学习demo:当输入K线数据,就可以告诉我什么时候该买,什么时候该卖,即使给出的买卖点并不准确,但我们总算可以看看强化学习模型是怎么给出这个买卖点的。这篇文章就做了这样一个demo,主要是想介绍怎样在构建证券市场构建一个简单的强化学习模型。
强化学习相比于神经网络等常见的机器学习算法而言,强化学习更灵活多变。深度神经网络、卷积神经网络已经算是比较难的算法了,但对于应用人员来说,你只需要搞懂输入输出基本就能用了。但强化学习完全不行,必须要对特征的问题抽象建模,这往往是最难的。怎样从一堆证券数据中抽象各种各样的状态,以及这些状态是怎么转换的,怎么定义动作、回报等等。这些问题直接决定你的模型的质量。
在这篇文章中,我们需要解决的问题是:怎么利用一天内的48根5分钟的K线数据探索在每个5分钟结束的时候,我们是该买入(B),还是该卖出(S),或者是继续观望(W),并用一段时间内所有的5分钟数据训练这个模型,看哪个时间点最适合买入,哪个时间点最适合卖出。我们以时间点作为一个状态标识,则状态(S)转移就比较好定义了:935(早上9点35,这个时间点产生了第一根K线)->940->945->…->1455->1500,状态s->s’可以采取的动作(A)包含B、S、W。我们使用Q-learning算法来解决这个问题。因此,Q表应该是这样的:
关于Reward,我们是这样定义的:未来一段时间的收益率,比如未来3根K的涨跌幅。有了这些之后,我们基本就可以开始着手编写程序了。
首先创建一个环境类:
然后创建Q-learning算法类(或者称这个类为一个Agent):
最后就是创建一个文件来协调上面两个类开始工作: