深度强化学习的量化投资框架

发布于: 雪球转发:0回复:0喜欢:1

昨天快速搭建好一个传统的量化投资框架,今天把它进化成支持深度强化学习。

这里多说一句,深度强化学习就是alphago背后的技术。强化学习适用的场景就是“贯序决策”。传统机器学习与深度学习,需要标签数据,而股市很难预测一个标签。

自定义一个强化学习的环境要定义四个东西:状态空间,动作空间,reward函数以及状态obseravtion。

一、状态空间

状态空间比较简单,我们希望模型输出一个长度为组合里证券个数的向量,值就是组合里各证券的仓位,所以都是[0-1]之间的数。

self.action_space = spaces.Box(low=0, high=1, shape=(len(self.config.universe),))

二、状态空间

我们有N支证券,M的特征,那么状态空间应该是二维矩阵(N,M)。到底是NM还是MN,目前看,对于神经网络而言,应该无所谓,就是一个矩阵。值的大小从负无穷到正无穷。state_space就是我们特征的个数。

self.observation_space = spaces.Box(low=-np.inf, high=np.inf,
                                    shape=(len(self.config.universe), self.config.state_space))

三、回报函数

reward也比较简单,就是组合净值的增量,当然这个还可以进一步设计。

reward = new_portfolio - self.last_portfolio

四、环境状态

从跑通模型的角度,我们先取OHLCV这些数据,大部分的技术指标都是从这些数据里衍生出来的。当然,我们把经验做一些“特征工程”有助于模型收敛。

observation = self.env_data.get_data(self.calendar[self.i],self.config.universe,cols=['open','high','low','close','vol'])
print(observation)

            open   high    low  close          vol

510300.SH  2.158  2.162   2.15  2.158  3.21844e+06

510500.SH  1.075   1.08  1.072   1.08       237570

某一天的数据如上,就是一个Nx5的矩阵

一个数据查询服务需要优化的点,涉及到多个市场,取指数的日期到某一支证券上查询的时候,可能会存在数据缺失,这时候需要用前一期的数据来填充这个数据点。

dataframe的reindex正好派好用场。

先把两个index取并集作为新索引,然后用这个并集的index来reindex,method=ffill,就是用前面的值来填充。

#根据benchmark填充数据
def fill_data(self,codes,index):
    for code in codes:
        df = self.get_df_by_code(code)
        if df is not None:
            new_index = list(set(df.index).union(set(index)))
            new_index.sort()
            df = df.reindex(new_index,method='ffill')
            self.dfs_dict[code] = df

这里仍有一个todo,就是把rate也填充成了前1期的数,填充的字段rate应该等于0。

完成了这些接口之后,可以使用baseline框架提供的环境验证工具可以看下环境是否正常。

env_data = EnvQuery(all_codes, start=None)
env = MarketEnv(env_data, config)

from stable_baselines3.common.env_checker import check_env
# It will check your custom environment and output additional warnings if needed
check_env(env)

后面走通就简单了:选择一个模型,配置参数直接走1万轮。

from stable_baselines3 import A2Cmodel = A2C('MlpPolicy', env, verbose=1)
model.learn(total_timesteps=10000)

(公众号:七年实现财富自由(ailabx),用数字说基金,用基金做投资组合,践行财富自由之路)