为什么要翻译这篇文章
本人利用DNN和RNN做了深度强化学习的策略,本质上是一个基于策略梯度的强化学习,翻看这个作者的论文发现,核心思路是一模一样的,差别在于细节的处理,先说说和作者的相似之处:
- 用神经网络来表示一个确定性策略;状态空间是一个连续的,从神经网络的角度来讲,就是所谓的特征。这样做必须要解决的问题就是把状态到动作的映射变成一个连续可导的函数,由于在交易中,我们有最小交易单位,比如一手,你总不能交易1.5手把,所以,我们的动作往往是离散的,需要用技术手段,将其连续化,这就是与作者第二个相同点,即:
- 由于我也用1表示持有多头,0表示无持仓,-1表示持有空仓,所以,我选择了tanh来表示持仓状态,也就是Agent的action,这样动作即使一个连续可导的了,作者也是这么做的。在实际中,我发现由于tanh会在非中心区域梯度衰减为0,导致梯度下降法迭代不下去了,这里可以选择做一次标准化操作,而我借鉴了小波分析的方法,引入了尺度因子和平移因子,用一系列的tanh组合来表示信号,使得梯度在较大区域内不为0,这样就解决了梯度消失问题,其实这个部分可以抽象出来,就是怎么用一组性质较好的基函数来表示我们的策略,想过用傅里叶变换,傅里叶变换的好处是由一系列cos,sin的组合来表示动作,求导时,不用担心导数到急速衰减为0.
- 目标函数有相似之处,但是又不一样,作者用的是一条路径的Shape比率作为训练目标,我当初也考虑过Shape,但是考虑到夏普是有分母的,如果没有信号,意味着波动率为0,这个时候分母就为0了,为此,我还考虑过将夏普转换为减法的形式,后来为了快速验证,就只有了一条路径的累计收益和做优化目标,相当于只取了Shape的分子。
- 作者采用了dropout防止过拟合,我采用了L1正则化作为约束条件,希望减少过拟合发生的概率。
不同之处在于:
- 作者用的是LSTM,我用的是RNN和DNN,主要为了简单快速验证结果。
- 状态空间(特征)不同,作者用的是过去N期的每日涨跌值作为特征,我的特征更多,我对行情数据提取了一部分统计特征。
- 状态到动作的映射方式不同,虽然我们都是采用的神经网络,作者直接简单暴力将特征映射为交易行为,这是我和作者最大区别的地方,我在这里考虑的传统量化交易策略的抽象形式,在这里做了更细致的处理,使得整个策略表达不仅仅是一个黑箱,而且还具有一定的可解释性,这个部分就是策略的核心。
- 交易成本方面,作者只给了一个参数c,也没明确说c是多少,我这边就很透明,我的c表示交易手续费和滑点成本,滑点设置的是进出各一跳。
- 信号过滤的方式不同,作者直接在tanh中引入一个偏置和上一期的持仓量,来达到过滤交易信号,防止频发交易的目的,这一块我花的精力比较大,目前我用技术手段实现了前一刻有持仓,这一刻如果有同向信号则忽略这种想法,这种处理一定要小心,一不小心就把梯度变成0了。
- 作者验证了两种目标函数,一种是夏普,另一种是用半方差计算的夏普,原因很简单,就是风险的定义到底是什么这个最根本的问题,有人说波动大就是风险,有人说朝我不利的方向波动才是风险,前者用方差,后者用半方差,这里不再累述。
总结一下我认为我们这种做法存在的致命性的问题就是:
用一个连续函数来表示动作,输出的动作是在[-1,1]之间的一个数,这么做的问题就是优化出来的持仓是一个带小数的值,如果我们取整或者给一个阈值来调整,发现和原来的收益差异很大,这个部分我目前正在用随机策略来解决,即保持动作是离散的不变,引入期望,解决网络可导问题。
论文简读
一、目标函数:夏普比率
给出一条资金曲线(假设时长为),由于是时间序列,预测可以计算每一期的盈利率,盈利率的均值除以其波动率就是夏普:
二、信号的表示
信号用表示,,-1表示持有空单1单位,0表示空仓,1表示持有多单1单位。为了后面的优化方便,将转换为一个连续空间,即,由于函数的值域与此匹配,于是就选择来表示策略:
其中可以理解为是神经网络的抽象,就是神经网络的输入特征,在强化学习中,就是表示状态空间。
三、信号过滤
为了防止频繁交易,在当期信号函数中引入一个偏置变量,和上一期的持仓量,得到修正后的策略函数:
四、当期回报函数(reward):
由于在交易中,我们是以一手为单位,一手代表的证券数量用小表示,在给定边际交易成本c的情况下,于是就得到了当期的回报函数:
梯度那一块就不说了,太复杂,用不上你自己推导,只要理解就行了。总结一下:
其中就是LSTM的参数,根据样本训练得到。由于网络结构我的设计和作者的一样,这里就把我的网络结构贴出来:
后面的内容就不翻译了,除了用半方差更改了下Shape的计算公式外,其他内容都是调参炼丹之术,这里贴一下我在IF上的结果,注意,非圣杯再现,而是样本内: