什么是强化学习?用一句话概括,就是自己和自己玩,然后不断积累经验。典型的例子就是阿尔法狗,通过不断的自己和自己下棋,来达到人类无法达到的高度。
在量化领域,强化学习同样可以适用,下边我大概讲解一下思路(下文中使用期货量化进行说明)。
在github上边,有很多的强化学习例子,大家可以去找找,下载,看一下代码,然后就可以发现,这些例子都是在玩游戏,简单或稍微复杂的电脑游戏。量化中使用强化学习同样也是这个思路,将量化当作一个游戏看待。
如何当作游戏呢,实现gym包的接口即可(Gym 是 OpenAI 发布的用于开发和比较强化学习算法的工具包,里边包含了很多可交互的游戏)。
pip安装gym,然后打开core.py源码(位置如下)
就可以看到游戏接口了
具体看一下里边有那些要实现的方法:
1,根据指令执行一步
def step(self, action):
入参action就是指令,例如:持仓,清仓,观望等等。
在方法内实现一个根据指令和行情数据进行买卖的模拟交易(模拟交易就不细展开了,保存好开仓价,开仓方向,开仓时间等信息,设置好滑点,费用,计算好平仓金额,记录好交易各项信息就可以)。
返回的是
return 下一步状态, 得分奖励, 是否终止游戏, {}
- 下一步状态:返回下一步使用的数据([feature1,feature2,feature3,feature4......])
- 得分奖励:如动作是清仓,返回盈亏金额即可,其他非清仓操作返回0
- 是否终止游戏:判断是否到达模拟最后一天(或分钟),以及判断是否把所有钱亏完了
- {}:无意义说明,这里不用添任何东西
2,初始化
def reset(self):
由于会跑很多轮,这里设置每轮开始进行初始化的数据,例如初始资金,初始持仓状态,初始各种统计,等等等等
3,图像引擎(不用,pass即可):
def render(self, mode='human'):
这个是真正电脑游戏展现游戏画面用的图像初始化,由于量化没啥可展示的,这个方法实现的时候里边pass即可,当然,要是有高大上的想法也可以在此实现。
4,关闭方法:
def close(self):
这里放置游戏结束后需要销毁,关闭的资源等,也可在此进行各种统计输出保存等操作。
5,随机数生成器(不用,pass即可):
def seed(self, seed=None):
某些游戏环境需要随机数生成,以确保多个生成器之间没有偶然的相关性。在量化游戏中不使用,pass即可。
OK,到这里所有需要实现的方法都有了,实现完成后就有了一个自己的量化游戏。
多说几句:
强化学习输出分为:离散动作 和 连续动作
- 离散动作:输出0,1,2等数值,每个代表一种操作类型。量化所需即离散动作,例如0代表观望,1代表开仓,2代表平仓等
- 连续动作:输出的是 连续的,高维的 数据。比如自动驾驶,肯定不能直接给出一个左转,右转,然后汽车直接猛打轮...... 要有不同转向角度,刹车油门轻重等等问题。
不同的输出,要选择的强化学习模型算法也不一样,这里推荐一个强化学习包:TF2RL,github地址:
https://github.com/keiohta/tf2rl
这是一个高度封装的强化学习包,使用tensorflow2来实现,调用起来异常简便,有了他,再也不用自己写一大堆实现代码了。不同动作选择强化学习模型可参见下表(tf2rl实现):
算法 | 离散动作 | 连续动作 |
---|---|---|
VPG,PPO | ✓ | ✓ |
DQN(includingDDQN,Prior. DQN,Duel. DQN,Distrib. DQN,Noisy DQN) | ✓ | - |
DDPG(includingTD3,BiResDDPG) | - | ✓ |
SAC | ✓ | ✓ |
GAIL,GAIfO,VAIL(includingSpectral Normalization) | ✓ | ✓ |
注:最后一行的算法是“模仿学习”,通过模仿其他的强化学习操作来进行新的学习,很有意思的思路。
写好自己的交易游戏,几行代码调用配置好相应的算法模型,就可以跑起量化强化模型了。