深度强化学习+金融投资的应用入门
原创文章第114篇,专注“个人成长与财富自由、世界运作的逻辑, AI量化投资”。
今天的核心工作是把强化学习环境整合进我们的AI量化平台中。
网上很多代码都把数据获取和预处理,都整合到强化学习的环境里,对于总体量化平台而言,这不利于代码的复用。我们之前已经实现好了dataloader。所以我们单独实现强化学习的gym即可。
01 金融强化学习的环境
一个强化学习的环境要定义四个东西:状态空间,动作空间,reward函数以及状态obseravtion。
状态空间与动作空间。
状态空间就是智能体可以观察到的环境的维度,对于金融强化学习环境而言,就是因子的维度(特征的维度)。
# 状态空间 class observation_space:def __init__(self, n):self.shape = (n,)# 动作空间 class action_space:def __init__(self, n):self.n = ndef seed(self, seed):passdef sample(self):return random.randint(0, self.n - 1)
动作空间是智能体针对观察到的状态,可以采用的动作的维度,比如“买入”和“平仓”就是两个动作。
环境初始化:
class FinanceEnv:def __init__(self, symbols, features, df_features):self.symbols = symbolsself.features = featuresself.df_features = df_featuresself.observation_space = observation_space(4)self.rows = self.observation_space.shape[0] # 一次取多少行self.action_space = action_space(2) # 动作维度self.min_accuracy = 0.475 # 最低准确率
Reset是对环境进行重置:
def _get_state(self):state = self.df_features[self.features].iloc[self.index - self.rows:self.index]return state.valuesdef reset(self):self.treward = 0self.accuracy = 0self.index = self.rows# 返回状态空间的行数,features列数的初始状态state = self._get_state()return state.values
两个主要的工作方法:reset和step。
其中step是环境最重要的功能。智能体通过观察环境状态,选择相应的动作,执行动作后,从环境得到反馈。同时会检查总体的收益,任务是否失败等。
def step(self, action):# 根据传入的动作,计算奖励rewardcorrect = action == self.df_features['label'].iloc[self.index]reward = 1 if correct else 0# 计算奖励值,准确率self.treward += rewardself.index += 1self.accuracy = self.treward / (self.index - self.rows)# index>=总长度,则退出if self.index >= len(self.df_features):done = Trueelif reward == 1:done = Falseelif (self.accuracy < self.min_accuracy andself.index > self.rows + 10):done = Trueelse:done = Falsestate = self._get_state()info = {}return state, reward, done, info
02 深度强化网络DQLAgent
from collections import deque import randomimport numpy as np from keras import Sequential from keras.layers import Dense from keras.optimizers import Adamclass DQLAgent:def __init__(self, env, gamma=0.95, hu=24, opt=Adam,lr=0.001, finish=False):self.env = envself.finish = finishself.epsilon = 1.0self.epsilon_min = 0.01self.epsilon_decay = 0.995self.gamma = gammaself.batch_size = 32self.max_treward = 0self.averages = list()self.memory = deque(maxlen=2000)self.osn = env.observation_space.shape[0]self.model = self._build_model(hu, opt, lr)def _build_model(self, hu, opt, lr):model = Sequential()model.add(Dense(hu, input_dim=self.osn,activation='relu'))model.add(Dense(hu, activation='relu'))model.add(Dense(self.env.action_space.n, activation='linear'))model.compile(loss='mse', optimizer=opt(lr=lr))return modeldef act(self, state):if random.random() <= self.epsilon:return self.env.action_space.sample()action = self.model.predict(state)[0]return np.argmax(action)def replay(self):batch = random.sample(self.memory, self.batch_size)for state, action, reward, next_state, done in batch:if not done:reward += self.gamma * np.amax(self.model.predict(next_state)[0])target = self.model.predict(state)target[0, action] = rewardself.model.fit(state, target, epochs=1,verbose=False)if self.epsilon > self.epsilon_min:self.epsilon *= self.epsilon_decaydef learn(self, episodes):trewards = []for e in range(1, episodes + 1):state = self.env.reset()state = np.reshape(state, [1, self.osn])for _ in range(5000):action = self.act(state)next_state, reward, done, info = self.env.step(action)next_state = np.reshape(next_state,[1, self.osn])self.memory.append([state, action, reward,next_state, done])state = next_stateif done:treward = _ + 1trewards.append(treward)av = sum(trewards[-25:]) / 25self.averages.append(av)self.max_treward = max(self.max_treward, treward)templ = 'episode: {:4d}/{} | treward: {:4d} | 'templ += 'av: {:6.1f} | max: {:4d}'print(templ.format(e, episodes, treward, av,self.max_treward), end='\r')breakif av > 195 and self.finish:print()breakif len(self.memory) > self.batch_size:self.replay()def test(self, episodes):trewards = []for e in range(1, episodes + 1):state = self.env.reset()for _ in range(5001):state = np.reshape(state, [1, self.osn])action = np.argmax(self.model.predict(state)[0])next_state, reward, done, info = self.env.step(action)state = next_stateif done:treward = _ + 1trewards.append(treward)print('episode: {:4d}/{} | treward: {:4d}'.format(e, episodes, treward), end='\r')breakreturn trewards
小结:
今天是走通了深度强化学习在金融上的应用,搭建了金融交易环境。
后续还需要针对性的优化。
代码就上传至星球。
ETF轮动+RSRS择时,加上卡曼滤波:年化48.41%,夏普比1.89
我的开源项目及知识星球
深度强化学习+金融投资的应用入门相关推荐
- 深度强化学习入门到精通--资料综述
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 人工智能是21世纪最激动人心的技术之一.人工智能,就是像人一样的智能,而人的智能包 ...
- 【强化学习】深度强化学习入门介绍
深度强化学习是一种机器学习,其中智能体(Agent,也翻译作代理)通过执行操作(Action)和查看结果(Reward)来学习如何在环境中采取最佳的动作或策略. 自 2013 年Deep Q-Lear ...
- 深度强化学习入门介绍
深度强化学习是一种机器学习,其中智能体(Agent,也翻译作代理)通过执行操作(Action)和查看结果(Reward)来学习如何在环境中采取最佳的动作或策略. 自 2013 年Deep Q-Lear ...
- 用深度强化学习玩atari游戏_(一)深度强化学习·入门从游戏开始
1.在开始正式进入学习之前,有几个概念需要澄清,这样有利于我们对后续的学习有一个大致的框架感 监督型学习与无监督型学习 深度强化学习的范畴 监督型学习是基于已有的带有分类标签的数据集合,来拟合神经网络 ...
- 手把手教你入门深度强化学习(附链接代码)
来源:机器之心 本文约2600字,建议阅读10分钟. GitHub 开源了一份深度强化学习的教程,总结了从 DQN 到彩虹模型的理论和代码实现. 深度强化学习在机器学习领域的热度一直很高.最近,Git ...
- 【入门教程】TensorFlow 2 模型:深度强化学习
文 / 李锡涵,Google Developers Expert 本文节选自<简单粗暴 TensorFlow 2> 本文将介绍在 OpenAI 的 gym 环境下,使用 TensorFl ...
- 【大全】深度强化学习入门到精通
聚焦AI干货,关注:决策智能与机器学习 人工智能是21世纪最激动人心的技术之一.人工智能,就是像人一样的智能,而人的智能包括感知.决策和认知(从直觉到推理.规划.意识等).其中,感知解决what,深度 ...
- 【2022·深度强化学习课程】深度强化学习极简入门与Pytorch实战
课程名称:深度强化学习极简入门与Pytorch实战 课程内容:强化学习基础理论,Python和深度学习编程基础.深度强化学习理论与编程实战 课程地址:https://edu.csdn.net/cour ...
- 深度强化学习之迷宫DQN(NIPS 2015版)实践笔记——入门提升篇
1. 背景 在「强化学习」(RL)领域,早期大部分成功的算法都依赖于人工提取特征,并结合线性的值函数或策略表示,算法的表现很大程度上取决于特征提取的质量,隐匿于机器学习中.近年来,「深度学习」(DL) ...
最新文章
- 彻底炸锅了!华为新天才少年出炉:武大94年博士生入选!任正非最新发声:江山代有才人出,不拘一格降人才!...
- telnet检查接收邮件命令
- node 之 ... 扩展运算符报错
- mysql字段获取当前日期格式_mysql数据库,获取当前日期及格式化
- 强化学习(六)---基于无模型强化学习方法
- 利用putty的pscp命令执行Linux服务器命令
- 计算机应用等级考试1,计算机等级考试一级试题
- Oracle EBS数据定义移植工具:FNDLOAD
- Linux epoll 笔记(高并发事件处理机制)
- 【其他】文件头注释、函数头注释、全局变量注释规范
- Friday the Thirteenth
- Win10错误代码0x80070541是怎么回事
- ajax以base64上传图片到django
- CocosBuilder学习之一:认识CocosBuilder
- 使用WinRAR 进行解压war文件。
- 【CAS】CAS原理
- EXCEL常见函数之逻辑函数
- 剑指Offer读书笔记(持续更新中)
- 这是用原声js编写的地址选择器,使用select编写的三联选择器
- Mencoder 介绍