Deep Reinforcement Learning for Trading
0 作者相关背景
本文一作是张子豪,二作三作均为其导师。张子豪曾在英国伦敦大学获得经济学和统计学学士学位,在牛津大学牛津大学应用统计学攻读硕士学位,在牛津大学攻读工程科学(机器学习研究组)博士。目前为牛津大学博士后研究员。
所在团队:英国牛津大学量化金融学院。
该研究所主任为:Alvaro Cartea 教授,
导师:Stephen Roberts
导师: Stefan Zohren,同时他担任该研究所的副主任。
1 解决了什么问题?
算法交易(Algorithmic Trading)具有强大的计算基础、更快的执行和分散风险的能力,它的一个关键组成是一个可导致 alpha(超额收益)的预测信号。然而,由于金融数据具有较低的信噪比和市场具有动态性,这些算法的设计是十分复杂的,常见的信号的有效性会随着时间而变化。
大多数 机器学习方法 都集中在回归和分类管道上,在这些管道中,超额回报或市场变动是在某些(固定的)范围内预测的。然而,关于将这些预测信号转化为实际交易头寸的讨论很少。同时,机器学习方法的预测范围较短(如果使用每日数据,可以提前一天或几天),但是大趋势可能会持续数周或数月,并具有一些适度的整合期。
本文提出基于 强化学习 进行交易的方法可以解决以上问题。该方法不是先做出预测,然后再根据预测做出交易决策;而是将模型训练为直接输出交易头寸,绕过显式预测步骤。
2 已有的工作有哪些?
基本面分析 的目的是通过分析经济数据来衡量证券的内在价值。这样投资者就可以根据证券当前价格与估值进行比较,从而判断证券是被低估了还是被高估了。然而,基本面分析的劣势在于无法明确地给出进入和退出市场的时机,这就导致即使市场向着预估价靠拢,如果进入市场的时机不对,也会导致资金大幅缩水。而此类变动往往是投资者无法承受的。另外,技术人员根据 Relative Strength Index(RSI) 和 Bollinger Bands 等指标组合进行交易,但由于缺乏对经济和市场条件的分析,这些信号的预测性不强。
算法交易 是一种更系统的方法,涉及数学建模和自动执行,包括趋势跟踪、均值回归、统计套利和 delta 中性交易策略。常用的、稳健的方法为 time series momentum strategies,该方法简单地将过去一年的收益信号作为一个信号,并通过实验证明其盈利能力。此后,有许多算法通过预测趋势和映射到实际的交易仓位上来加强该策略。然而,这些策略旨在从大规模定向波动中获利,但如果市场横向波动,则可能会蒙受巨大损失,因为这些信号的可预测性会恶化,过度的换手会削弱盈利能力。
强化学习方法 目前主要分为三类:critic-only, actor-only and actor-critic approach。
Critic-only 方法采用了离散的动作空间,并且训练了智能体来完全做多或做空头寸。 然而,在高波动时期,完全投资的头寸是有风险的,当发生相反的走势时,就会面临严重的风险。 理想情况下,人们希望根据当前的市场条件扩大或缩小仓位。 这样做需要有大的动作空间,但是,Critic 方法受到较大的动作空间的影响,因为我们需要为每个可能的动作分配一个分数。
Actor-only 方法,agent 直接优化目标函数,而无需计算状态中每个动作的预期结果。因为策略是直接学习出来的,所以 Actor-only 可以推广到连续的动作空间。为了研究策略的分布,在训练中采用策略梯度定理和蒙特卡洛方法,并更新模型直到每个 episode 结束。我们经常经历缓慢学习并且需要大量样本来获得最佳策略,因为只要总奖励良好,单个不良行为就会被认为是“好”的,需要很长时间来调整这些行为。
Actor-Critic 方法,旨在通过实时更新策略来解决上述学习问题。关键思想是交替更新两个模型,Actor 控制显示 agent 在给定当前状态下的表现,critic 衡量所选动作的好坏。然而,这种方法是研究方法金融应用的最新方法,但工作量有限。
3 解决方法是什么?
3.1 Markov Decision Process Formalisation
本文将交易问题形式化为马可夫决策过程 (MDP),其中 agent 以离散的时间步长与环境交互。在每个时间步长
t
t
t 下,agent 接收到环境的表示记为状态
S
t
S_t
St,agent 根据当前状态给出相应的行为
A
t
A_t
At,在下一个时间点环境给 agent 一个对应的奖励
R
t
+
1
R_{t+1}
Rt+1,同时 agent 到达一个新的状态
S
t
+
1
S_{t+1}
St+1。agent 与环境的交互过程记为一个 trajectory
τ
=
[
S
0
,
A
0
,
R
1
,
S
1
,
A
1
,
R
2
,
S
2
,
A
2
,
R
3
,
⋯
]
\tau=\left[S_{0}, A_{0}, R_{1}, S_{1}, A_{1}, R_{2}, S_{2}, A_{2}, R_{3}, \cdots\right]
τ=[S0,A0,R1,S1,A1,R2,S2,A2,R3,⋯]。Agent 学习的过程中,其目标始终是最大化期望收益:
G
t
=
∑
k
=
t
+
1
T
γ
k
−
t
−
1
R
k
G_{t}=\sum_{k=t+1}^{T} \gamma^{k-t-1} R_{k}
Gt=k=t+1∑Tγk−t−1Rk
其中,
γ
\gamma
γ 是衰减因子,
R
k
R_{k}
Rk 表示交易收益。
3.1.1 State Space
在文献中,许多不同特征被用来表示状态空间。证券的历史价格和相关技术指标(技术面)总是包含在这些特征中。在本文中,我们采用 过去的价格、不同范围的回报 和 技术指标,包括移动平均收敛散度 (MACD)和相对强度指数 (RSI)来表示状态。在给定的时间步长,本文对 每个特征的过去 60 次观察形成单独的状态。特征列表如下:
-
正常化的收盘价格序列;
-
过去 1 个月、2 个月、3 个月和 1 年期间的收益。本文通过调整到合理时间范围内的 每日波动 将它们标准化。例如,本文将年度回报标准化为 r t − 252 , t / ( σ t 252 ) r_{t-252, t} /\left(\sigma_{t} \sqrt{252}\right) rt−252,t/(σt252),其中 σ t \sigma_{t} σt 使用 60 天时间跨度的 r t r_t rt 的 指数加权移动标准差 计算的。
指数移动加权平均,是指各数值的加权系数 随时间呈指数式递减,越靠近当前时刻的数值加权系数就越大。特点在于:一是不需要保存过去所有的数值;二是计算量显著减小。
有一组序列 x 1 , x 2 , … … , x n , x n + 1 , … … x_{1}, x_{2}, \ldots \ldots, x_{n}, x_{n+1}, \ldots \ldots x1,x2,……,xn,xn+1,……,求每 n 个数据的移动均值和移动标准差如下:
E i + 1 = E i + 1 n ( x i + n − x i ) D i + 1 = D i + ( E i + 1 − E i ) n { ( x i + n + x i ) ( n − 1 ) − 2 n E i + 2 x i } \begin{aligned} &E_{i+1}=E_{i}+\frac{1}{n}\left(x_{i+n}-x_{i}\right) \\ &D_{i+1}=D_{i}+\frac{\left(E_{i+1}-E_{i}\right)}{n}\left\{\left(x_{i+n}+x_{i}\right)(n-1)-2 n E_{i}+2 x_{i}\right\} \end{aligned} Ei+1=Ei+n1(xi+n−xi)Di+1=Di+n(Ei+1−Ei){(xi+n+xi)(n−1)−2nEi+2xi} -
MACD 因子:
M A C D t = q t std ( q t − 252 : t ) q t = ( m ( S ) − m ( L ) ) / std ( p t − 63 : t ) \begin{aligned} &\mathrm{MACD}_{t}=\frac{q_{t}}{\operatorname{std}\left(q_{t-252: t}\right)} \\ &q_{t}=(m(S)-m(L)) / \operatorname{std}\left(p_{t-63: t}\right) \end{aligned} MACDt=std(qt−252:t)qtqt=(m(S)−m(L))/std(pt−63:t)
252 指的是一年中大约有 252 个交易日; m ( S ) m(S) m(S) 为时间跨度 S S S 内价格的指数加权移动平均(EWMA); std ( p t − 63 : t ) \operatorname{std}(p_{t-63: t}) std(pt−63:t) 为价格的 63 天移动标准差。 q t q_t qt:使用移动标准差进行标准化,以衡量已实现的 3 个月标准波动率。这里 S , L S,L S,L 的选择并不是回顾天数或者半衰期的天数。事实上,每个数字(我们称之为 n n n)都转化为一个 λ \lambda λ 衰减因子,以插入 EWMA 的标准定义。
H L = log ( 0.5 ) log ( λ ) = log ( 0.5 ) log ( 1 − 1 n ) H L=\frac{\log (0.5)}{\log (\lambda)}=\frac{\log (0.5)}{\log \left(1-\frac{1}{n}\right)} HL=log(λ)log(0.5)=log(1−n1)log(0.5)MACD(Moving Average Convergence and Divergence) 利用收盘价的 短期指数移动平均线 与 长期指数移动平均线 之间的聚合与分离状况,对买进、卖出时机作出研判的技术指标。在持续的涨势中,短期 EMA 在 长期 EMA 之上。其间的正差离值(+DIF)会愈来愈大。反之在跌势中,差离值可能变负(-DIF),此时是绝对值愈来愈大。至于行情开始回转,正或负差离值要缩小到一定的程度,才真正是行情反转的信号。
在2015年,Baz 提出计算方式:
-
RSI 指标:RSI 是一个在 0 和 100 之间移动的振荡指标。它通过衡量近期价格变化的幅度来指示资产的超卖(读数低于 20)或超买(高于 80)情况。本文将此指标与 30 天的回顾窗口包含在状态表示中。
RSI 的原理简单来说是以数字计算的方法求出买卖双方的力量对比,譬如有 100 个人面对一件商品,如果 50 个人以上要买,竞相抬价,商品价格必涨。相反,如果 50 个人以上争着卖出,价格自然下跌。
强弱指标理论认为,任何市价的大涨或大跌,均在0-100之间变动,根据 常态分配,认为 RSI 值多在30-70之间变动,通常 80 甚至 90 时被认为市场已到达超买状态,至此市场价格自然会回落调整。当价格低跌至 30 以下即被认为是超卖状态,市价将出现反弹回升。
3.1.2 Action Space
本文研究离散和连续的动作空间。对于离散动作空间,使用一个简单的动作集 { − 1 , 0 , 1 } \{-1,0,1\} {−1,0,1} ,每个值直接代表头寸,即 1 1 1 对应最大空头头寸, 0 0 0 对应不持有, 1 1 1 对应最大多头头寸。这种动作空间的表示也称为目标订单(target orders),其中 输出的是交易头寸,而不是交易决策。如果当前动作和下一动作相同,则不会产生交易成本,即仓位不会变化。如果我们从完全多头头寸转为空头头寸,交易成本将增加一倍。
连续动作空间的设计与离散情况非常相似,在这种情况下,本文仍然 输出交易头寸,但允许动作保持在 − 1 -1 −1 和 1 1 1 之间的任何值 A t ∈ [ − 1 , 1 ] A_{t} \in[-1,1] At∈[−1,1]。
3.1.3 Reward Function
奖励函数的设计取决于效用函数。本文让效用函数代表 对风险不敏感的交易者获利,并且在时间
t
t
t 的
R
t
R_t
Rt 是:
R
t
=
μ
[
A
t
−
1
σ
t
g
t
σ
t
−
1
r
t
−
bp
p
t
−
1
∣
σ
t
g
t
σ
t
−
1
A
t
−
1
−
σ
t
g
t
σ
t
−
2
A
t
−
2
∣
]
R_{t}=\mu\left[A_{t-1} \frac{\sigma_{t g t}}{\sigma_{t-1}} r_{t}-\operatorname{bp} p_{t-1}\left|\frac{\sigma_{t g t}}{\sigma_{t-1}} A_{t-1}-\frac{\sigma_{t g t}}{\sigma_{t-2}} A_{t-2}\right|\right]
Rt=μ[At−1σt−1σtgtrt−bppt−1∣∣∣∣σt−1σtgtAt−1−σt−2σtgtAt−2∣∣∣∣]
其中,
σ
t
g
t
\sigma_{t g t}
σtgt 是波动率目标,
σ
t
−
1
\sigma_{t-1}
σt−1 是对 60 天的回顾窗口上的
r
t
r_t
rt 使用指数加权移动标准差计算出来的事先波动率估计,这个表达式为波动率缩放。在本文中,交易头寸在市场波动率低时放大(也就是更 稳健),反之亦然。此外,鉴于波动率目标,我们的奖励
R
t
R_t
Rt 主要由动作驱动,而不是受到市场波动的严重影响。
μ
\mu
μ 是每笔交易的固定数量,本文将其设置为 1。值得注意的是,我们的交易成本项包括了价格项
p
t
−
1
p_{t-1}
pt−1,每个合约都有不同的成本。常数
b
p
bp
bp (基点)为成本率,1bp = 0.0001。
举个例子,如果成本率为 1bp,我们需要支付 0.1 美元才能购买一份价格为 1000 美元的合同。
本文定义 r t = p t − p t − 1 r_t = p_t-p_{t-1} rt=pt−pt−1 表示加法利润(Additive profits),Additive profits 通常用于固定数量的股份或合同交易日期。如果我们每次都想交易我们积累的财富的一部分,应该使用乘法利润(multiplicative profits) r t = p t / p t − 1 − 1 r_{t}=p_{t} / p_{t-1}-1 rt=pt/pt−1−1。
对于加法利润的累计资产: a s s e t = r t + C asset = r_t + C asset=rt+C;
对于乘法利润的累计资产: a s s e t = r t ⋅ C asset=r_t \cdot C asset=rt⋅C;
在本文中使用加法利润,因为乘法利润需要对数转换才能获得 RL 设置要求的累积奖励,但对数转换会惩罚大量的财富增长。
3.2 RL Algorithms
Deep Q-learning Networks(DQN), Policy Gradients(PG), Advantage Actor-Critic(A2C).
4 关键实验结果有哪些?
4.1 数据来源
本文使用来自 Pinnacle Data Corp CLC 数据库的 50 份连续期货合约的数据(其中有 25 个商品合约、11 个股票指数合约、5 个固定收益合约和 9 个外汇合约)。数据集范围从 2005 年到 2019 年。本文每 5 年重新训练模型,使用到那时为止可用的所有数据来优化参数,然后在最后的 5 年内固定模型参数以产生样本外结果。总的来说,本文的测试周期是从2011年到2019年。由于本文的数据集由不同的资产类别组成,因此作者为每个资产类别训练一个单独的模型。
4.2 对比方法
-
带有波动比率缩放的 Long Only 方法,即 A t = 1 A_{t} =1 At=1;
-
Sign(Return) 方法: A t = sign ( r t − 252 : t ) A_{t}=\operatorname{sign}\left(r_{t-252: t}\right) At=sign(rt−252:t);
-
基于 MACD 信号方法:
A t = ϕ ( M A C D t ) ϕ ( M A C D ) = MACD exp ( − M A C D 2 / 4 ) 0.89 \begin{aligned} A_{t} &=\phi\left(\mathrm{MACD}_{t}\right) \\ \phi(\mathrm{MACD}) &=\frac{\operatorname{MACD} \exp \left(-\mathrm{MACD}^{2} / 4\right)}{0.89} \end{aligned} Atϕ(MACD)=ϕ(MACDt)=0.89MACDexp(−MACD2/4)
我们还可以采用不同时间尺度的多个信号并将它们平均以给出最终指标:
M A C D t = ∑ k M A C D t ( S k , L k ) \mathrm{MACD}_{t}=\sum_{k} \mathrm{MACD}_{t}\left(S_{k}, L_{k}\right) MACDt=k∑MACDt(Sk,Lk)
本文将上述基线模型与我们的 RL 算法、DQN、PG 和 A2C 进行比较。DQN 和 PG 具有离散动作空间 {-1,0,1},以及 A2C 具有连续动作空间。
4.3 RL 训练方法
本文中,Actor 网络和 Critic 网络均使用 LSTM 实现。本文在所有模型中使用了 64 和 32 个单元的两层 LSTM 网络,并使用 Leaky-ReLU 作为激活函数。下图是本文模型的相关超参数。
4.4 实验结果
本文对 2011 年和 2019 年之间的基线模型和RL方法进行了测试,并按照公式(3)计算每个合同的交易回报净额。然后我们形成简单的投资组合,给每个合约赋予 相等的权重,投资组合的交易回报为:
R
t
port
=
1
N
∑
i
=
1
N
R
t
i
R_{t}^{\text {port }}=\frac{1}{N} \sum_{i=1}^{N} R_{t}^{i}
Rtport =N1i=1∑NRti
其中
N
N
N 代表考虑的合约数量,
R
t
i
R_t^i
Rti 是合约
i
i
i 在时间
t
t
t 的交易回报。
表现评估:
- E ( R ) E(R) E(R) :年化预期贸易回报;
- s t d ( R ) std(R) std(R) :贸易回报的年化标准差;
- Downside Deviation(DD):交Calmar易回报的年化标准偏差为负,也称为下行风险;
- Sharpe;
- Sortino;
- MDD:最大回撤显示从投资组合的任何峰值观察到的最大损失;
- Calmar:卡尔马比率将预期年回报率与最大回撤进行比较。一般来说,比率越高,投资组合的表现越好;
- % +ve Returns \% \text { +ve Returns} % +ve Returns:正贸易回报的百分比;
- Ave. P Ave. L \frac{\text { Ave. P }}{\text { Ave. L }} Ave. L Ave. P :正负贸易回报比。
每个模型都应用了额外的投资组合级别 波动率缩放层。这将不同方法的波动性带到同一目标,因此我们可以直接比较预期和累积交易回报等指标。
可以看到,RL 算法为大多数资产类别提供了更好的性能,除了股票指数使用 long-only 策略更好。这可以通过以下事实来解释:大多数股票指数在测试期间受到大幅上涨趋势的支配。同样,2016 年之前固定收入呈增长趋势,直到现在进入整合期。可以说,在这些情况下,我们应该采取的最合理的策略可能只是在大趋势持续的情况下保持仓位。然而,多头策略在价格波动较大的商品和外汇市场中表现最差。RL 算法在这些市场中表现更好,能够在合理的时间点做多或做空。总体而言,DQN 在所有模型中的表现最好,其次是 A2C 方法。我们调查了这一观察结果的原因,发现 A2C 产生了更大的周转率,导致了较低的平均每周转率回报。
本文还调查了我们方法在不同交易成本下的表现。作者使用不同成本率的所有合约绘制了投资组合的年化夏普比率。可以看到 RL 算法可以容忍更大的基底,尤其是 DQN 和 A2C 在 25bp 的基底上仍然可以产生正利润。
5 Summary
我们采用 RL 算法来学习连续期货合约的交易策略。我们讨论了现代投资组合理论和 RL 奖励假设之间的联系,并表明它们是等效的,并且使用了线性效用函数。我们的分析侧重于三种 RL 算法,即深度 Q 学习网络、策略梯度和优势 Actor-Critic,并研究离散和连续的动作空间。我们利用时间序列动量和技术指标的特征来形成状态表示。此外,还引入了波动率缩放以改进奖励功能。我们测试了 2011 年到 2019 年的 50 份流动性期货合约的方法,我们的结果表明,强化学习算法的表现优于基线模型,并且即使在高交易成本下也能带来利润。