沪深300指数增强
github(https://github.com/AlphaSmartDog/DeepLearningNotes/tree/master/Note-6%20A3CNet/Note-6.4%20HS300%E6%8C%87%E6%95%B0%E5%A2%9E%E5%BC%BA)
注:由于HS300使用的1min数据进行学习,使用数据量较大,相关数据库没有上传到github。
上证50指数增强
github(https://github.com/AlphaSmartDog/DeepLearningNotes/tree/master/Note-6%20A3CNet/Note-6.3%20%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0%E9%80%89%E8%82%A1-SH50%E6%8C%87%E6%95%B0%E5%A2%9E%E5%BC%BA)
这里简单的构建了一个使用深度强化学习算法实现多因子选股的框架。
首先构建一个交互环境Account,在每时间步(交易日)接受调仓指令向量,根据调仓指令使用当日开盘价调仓,并在交易日结束之后使用交易日收盘价估计当日持仓的估值,返回reward。
例如:
在周一沪市开盘前,Account接受到一个长度为50的向量对应SH50指数成份股的调仓指令,交易员Agent在开盘时分,挂卖单卖出部分股票之后挂买单买入新股票。
调仓指令向量可以简单的分为两种:
1 、调仓向量为定量指令
指令直接制定账户内个股持仓量/持仓权重,在交易日开盘时分,Agent发出指令,Account根据指令将账户股票持仓调整的与指令相同。这种设计对应强化学习里面的连续问题,Agent输出局限在一个范围内连续值。
2 、调仓指令为定性指令
指令指示个股的预期涨跌方向,Agent发出看多/看空/平稳信号,由Account根据信号等权重的调整持仓。
这种设计对应强化学习里面的离散问题,输出操作或策略判定为有限选项概率。
注:在本文对应的代码的中简化这种方法,Account根据指令卖出,然后调整剩余现金量买入,没有设定约束等权重操作步骤。
理论上使用定量指令可以实现选股和持仓优化的多重目标(如小方差或低换手率等特定目标)。
不过,目前DRL无论policy还是value都是使用神经网络作近似函数,深度强化学习算法近似函数的核心是使用深度学习模型(神经网络),就目前来看神经网络并不能很好的解决交易市场时间序列预测的问题,也就很难比较准确的给强化学习框架一个精确的估值。
Agent 使用LSTM网络进行策略和估值的拟合,每个交易日Agent获取该交易日之前的多因子数据[Time, Batch, N]使用LSTM估计指数成份股预期价值方向做出调仓指令。这里Agent发出的action是一个向量[Batch] 。
例如:
在交易日t,交易员Agent接受前n阶段因子数据,发出一个对50只成份股的列向量,数值为[0 , 1, 2]分别代表Agent对于各只股票未来情况的预判。
训练1000次净值走势图
2017-11-17更新
定量指令由Agent直接进行仓位管理、资金管理。也就是Agent的功能包括选股、仓位控制和资金管理。
例如做HS300指数增强的时候,向指令向量对应位添加现金、债券、货币基金等选项,直接指定各位置选项的百分比。
定性指令Agent只进行走势方向预测,不进行仓位管理。资金管理和持仓管理通过设置中间层处理。也就是Account - Interlayer-Agent-Interlayer-Account的方式进行操作。
具体在每个交易日,Agent发出定性的方向指令
通过调整摩擦成本-手续费、印花税、滑点等使Agent学会做出不操作指令-中性行为
由Interlayer做出调仓的详细指令。Interlayer人工指定,如强制设置等权重、总仓位控制等。
Account根据Interlayer做出调整之后的当日持仓量
当日持仓权重
总的来说定性指令就像一个半自动武器,需要人工设定程序对指令进行再处理,一些投资组合的限制在外部通过设定Interlayer处理。
定量指令则是将所有的操作都交由Agent进行处理,也就是把投资组合的前置要求,如仓位控制资金控制等通过公式等手段直接嵌入Agent中进行处理。
两种指令分别对应强化学习的离散和连续处理两种问题。