打造一个投资组合管理的金融强化学习环境
创始人
2024-03-04 02:52:03
0

原创文章第120篇,专注“个人成长与财富自由、世界运作的逻辑, AI量化投资”。

今天继续金融强化学习环境。

网上的金融学习环境不少,但都太过于“业余”,或者离像样的投资还差得太远。我一直觉得投资组合应该是必要的,不做投资组合,要控制回撤实在太难了,加上低相关多资产组合,对于投资而言,低层逻辑就是成立的。再加上一些规则也好,模型也罢,或者强化学习的加持,争取提升收益率。

所以,强化学习我也希望能够做投资组合。在finRL-meta里有投资组合分配的环境,今天结合咱们自己的AI量化平台,打造一个金融“投资组合管理”的学习环境。

from abc import ABCimport gym
import numpy as np
from gym import spacesclass FinanceEnv(gym.Env, ABC):def __init__(self, symbols, df_features, df_returns, initial_amount=1000000):super(FinanceEnv, self).__init__()# 正则化,和=1,长度就是组合里的证券数量self.action_space = spaces.Box(low=0, high=1, shape=(len(symbols),))self.observation_space = spaces.Box(low=-np.inf,high=np.inf,shape=(len(symbols), len(df_features.columns)), dtype=np.float64)#print(self.observation_space)self.dates = list(df_features.index)self.df_features = df_featuresself.df_returns = df_returnsself.initial_amount = initial_amountself.portfolio_value = initial_amountself.index = 0def reset(self):self.index = 0self.portfolio_value = self.initial_amountdf = self.df_features.loc[self.dates[0]]print(df.values.shape)return df.valuesdef step(self, actions):done = Falseif self.index >= len(self.dates) - 1:done = Trueprint(self.reward)return self.state, self.reward, done, {}self.index += 1weights = self.softmax_normalization(actions)df_return = np.array(self.df_returns.loc[self.dates[self.index]]['return'])port_return = sum(df_return * np.array(weights))self.portfolio_value = self.portfolio_value * (1 + port_return)df = self.df_features.loc[self.dates[self.index], :]self.state = df.valuesself.reward = self.portfolio_value * 1.0return self.state, self.reward, done, {}def softmax_normalization(self, actions):numerator = np.exp(actions)denominator = np.sum(np.exp(actions))softmax_output = numerator / denominatorreturn softmax_outputif __name__ == '__main__':from stable_baselines3.common.env_checker import check_envfrom stable_baselines3 import A2Cfrom engine.datafeed.dataloader import Dataloadersymbols = ['399006.SZ', '000300.SH']names = []fields = []features = []fields += ['Slope($close,20)']names += ['mom_slope']features += ['mom_slope']fields += ['KF($mom_slope)']names += ['kf_mom_slope']features += ['kf_mom_slope']fields += ["$close/Ref($close,1) - 1"]names += ['return']loader = Dataloader(symbols, names, fields, load_from_cache=True)data = loader.datadata = data[data.index > '2010-06-02']df_features = data[names]df_return = data[['return']]print(df_features)env = FinanceEnv(symbols, df_features, df_return)# check_env(env)model = A2C("MlpPolicy", env)model.learn(total_timesteps=100000)

1、继承自gym.Env。

2、定义动作与状态空间,都是gym.spaces 对象。

动作空间就是投资组合里的symbol数量,因为我们给出的是证券的仓位占比;而状态空间是symbol行*特征列——也就是所有证券的因子值。

3、重点实现step与reset两个函数

Step就是传入一个动作,并计算reward,返回新的state。

Reset是环境重置初始化。

4、step函数:

传入的参数actions是各标的的权重,按actions归一化为和为1的向量,计算新的投资组合收益率,计算新的组合价值。这里把组合市值作为环境的reward,当然我们还可以计算夏普比,最大回撤等。

代码和数据已经上传至星球,有任何问题请在星球群里讨论。

把backtrader改造成金融强化学习回测引擎

强化学习框架stable-baseline3以及pandas datareader

我的开源项目及知识星球

 

相关内容

热门资讯

美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...