将强化学习应用到量化投资中实战篇(学习模块开发)
强化学习的学习模块(learners.py)包含实现各种强化学习方法的类。DQNLearner、PolicyGradientLearner、ActorCriticLearner、A2CLearner 和 A3CLearner 分别是基于深度 Q -learning、策略梯度、Actor-critic、A2C 和 A3C 强化学习技术的类实现。根据股票投资的特点,每种技术在理论上可能略有不同。
1.学习模块的主要属性和功能
学习模块具有基于 ReinforcementLearner 类实现各种强化学习方法的类。 ReinforcementLearner 类的主要属性有:
- stock_code:强化学习的股票代码
- chart_data:库存商品的图表数据
- environment:强化学习环境对象
- agent:强化学习代理对象
- training_data:训练数据
- value_network:价值神经网络
- policy_network:策略神经网络
ReinforcementLearner 类的主要功能有:
- init_value_network():创建价值神经网络的函
- init_policy_network():创建策略神经网络的函数
- build_sample():从环境对象中获取样本的函数
- get_batch():批量训练数据生成函数
- update_networks():价值神经网络和策略神经网络训练函数
- fit():价值神经网络和策略神经网络训练请求函数
- Visualize():时代信息可视化函数
- run():强化学习执行函数
- save_models():保存价值神经网络和策略神经网络的函数
2 导入学习模块的依赖
import os
import logging
import abc
import collections
import threading
import time
import numpy as np
from utils import sigmoid
from environment import Environment
from agent import Agent
from networks import Network, DNN, LSTMNetwork, CNN
from visualizer import Visualizer
导入 Python 基本模块 os、logging、abc、collection、threading、time。os 用于创建文件夹或准备文件路径。logging 用于在学习过程中记录信息。abc 用于定义抽象类。time 用于衡量学习时间。
Python 提示:abc 代表抽象基类,帮助你定义抽象类。@abstractmethod您可以使用装饰器声明抽象方法。有关 abc 的更详细说明,请参阅 https://docs.python.org/en/3/library/abc.html。
导入 NumPy,一个用于操作数组数据结构的 Python 库。然后导入 RLTrader 的模块。导入上一章介绍的所有环境、代理、网络和可视化模块。导入 utils 中定义的 sigmoid 函数来创建策略神经网络训练标签。
Python 提示:用于导入的关键字是 import、from 和 as。import 是用于导入包、模块、类和函数的关键字。from是关键字,指定要导入的模块的父包,要导入的类的父模块,或者要导入的函数的父模块。as 关键字用于使用不同名称的导入包、模块、类或函数。
3. 学习模块类的构造函数
下面显示了 ReinforcementLearner 类的构造函数的开头。ReinforcemetLearner 类是 DQNLearner、PolicyGradientLearn-er、ActorCriticLearner 和 A2CLearner 类继承的超类。ReinforcementLearner 类构造函数具有强化学习所需的环境、代理、神经网络实例和训练数据作为属性
3.1 ReinforcementLearner 类:构造函数(1)
class ReinforcementLearner:
__metaclass__ = abc.ABCMeta
lock = threading.Lock()
def __init__(self, rl_method='rl', stock_code=None,
chart_data=None, training_data=None,
min_trading_unit=1, max_trading_unit=2,
delayed_reward_threshold=.05,
net='dnn', num_steps=1, lr=0.001,
value_network=None, policy_network=None,
output_path='', reuse_models=True):
assert min_trading_unit > 0
assert max_trading_unit > 0
assert max_trading_unit >= min_trading_unit
assert num_steps > 0
assert lr > 0
self.rl_method = rl_method
self.stock_code = stock_code
self.chart_data = chart_data
self.environment = Environment(chart_data)
self.agent = Agent(self.environment,
min_trading_unit=min_trading_unit,
max_trading_unit=max_trading_unit,
delayed_reward_threshold=delayed_reward_threshold)
rl_method 代表强化学习方法。该值取决于子类。DQNLearner 设置为“dqn”,PolictGradientLearner 设置为“pg”,ActorCriticLearner 设置为“ac”,A2CLearner 设置为“a2c”,A3CLearner 设置为“a3c”。stock_code 是用于学习的股票代码。rl_method 和 stock_code 对于学习过程不是必需的,它们主要用于日志记录。
chart_data 是强化学习环境对应的股票日线图数据。training_data 是用于训练的预处理训练数据。min_trading_unit 和 max_trading_unit 分别是投资的最小和最大单位。设置合适的投资单位很重要,因为每只股票都有不同的股价规模,因此投资的股票数量也不同。
delay_reward_threshold 是延迟补偿阈值。如果回报率或损失率大于此阈值,则会发生延迟奖励并继续学习先前的操作。
mini_batch_size 是小批量训练的大小。当没有延迟补偿时立即执行训练,因为即使数据累积到 mini_batch_size 那么多,投资组合值也不会发生显着变化。
神经网络类型作为网络参数接收。net 参数可以是一个值,例如“dnn”、“lstm”、“cnn”等。这个值决定了使用哪个神经网络类作为价值神经网络和策略神经网络。
n_steps 是 LSTM 和 CNN 神经网络使用的样本集的大小。lr 是学习率,如果这个值太大,训练不会很好,如果太小,训练时间太长。
如果 value_network 和 policy_network 作为参数提供,这些模型将用作价值神经网络和策略神经网络。训练过程中产生的日志、可视化结果以及训练结束后保存的神经网络模型文件都保存在 output_path 中指定的路径中。
要创建强化学习环境,请使用图表数据 chart_data 作为参数创建 Environment 类的实例。环境按顺序读取图表数据,提供股价、成交量等数据。并以这种强化学习环境作为参数创建 Agent 类的实例。股票投资单位和延迟补偿阈值也包括在代理创建因素中。
Python 提示:assert 是一个断言语句。将条件放在断言之后,如下所示。
assert <condition>
condition如果不满足,AssertionError则会引发异常。
3.2. ReinforcementLearner 类:构造函数(2)
self.training_data = training_data
self.sample = None
self.training_data_idx = -1
self.num_features = self.agent.STATE_DIM
if self.training_data is not None:
self.num_features += self.training_data.shape[1]
self.net = net
self.num_steps = num_steps
self.lr = lr
self.value_network = value_network
self.policy_network = policy_network
self.reuse_models = reuse_models
self.visualizer = Visualizer()
训练数据包括用于训练的特征。用于训练的最终特征数量是 28 个,加上训练数据中的 26 个特征加上 2 个作为代理状态的特征。ReinforcementLearner 类有一个用于学习这些特征的神经网络类对象。神经网络类对象由 ReinforcementLearner 类的子类创建。如果reuse_models 为True 并且模型已经存在,则回收。
Python 提示:NumPy 数组有一个形状变量,表示数组的形状。如果是N维数组,那么shape变量就是N维元组。例如,一维数组的形状是一维元组,二维数组的形状是二维元组。[ [1, 2, 3], [4, 5, 6] ] 具有形状 (2, 3)。
创建一个 Visualizer 类对象来可视化学习过程。该对象可视化每个时期的投资结果。
3.3. ReinforcementLearner 类:构造函数(3)
self.memory_sample = []
self.memory_action = []
self.memory_reward = []
self.memory_value = []
self.memory_policy = []
self.memory_pv = []
self.memory_num_stocks = []
self.memory_exp_idx = []
self.memory_learning_idx = []
self.loss = 0.
self.itr_cnt = 0
self.exploration_cnt = 0
self.batch_size = 0
self.learning_cnt = 0
self.output_path = output_path
momory_*它有一个名为 ’ 的变量来积累强化学习过程中产生的各种数据。它存储训练数据样本、执行的操作、获得的奖励、预测的操作值、预测的操作概率、投资组合值、持有的股票数量、探索的位置、学习的位置等等。用这种方式存储的样本和奖励等数据训练神经网络。
随着强化学习的进展,与时代相关的信息也被积累起来。在 epoch 期间,它记录并记录训练中发生的损失、产生的收入数量、探险次数、训练次数等。日志、可视化、训练模型等存储在 output_path 指定的路径下。
4. 价值神经网络创建函数
init_value_network()该函数net为中指定的神经网络类型创建一个值神经网络。以下代码段init_value_network()显示了该函数的源代码
def init_value_network(self, shared_network=None,
activation='linear', loss='mse'):
if self.net == 'dnn':
self.value_network = DNN(
input_dim=self.num_features,
output_dim=self.agent.NUM_ACTIONS,
lr=self.lr, shared_network=shared_network,
activation=activation, loss=loss)
elif self.net == 'lstm':
self.value_network = LSTMNetwork(
input_dim=self.num_features,
output_dim=self.agent.NUM_ACTIONS,
lr=self.lr, num_steps=self.num_steps,
shared_network=shared_network,
activation=activation, loss=loss)
elif self.net == 'cnn':
self.value_network = CNN(
input_dim=self.num_features,
output_dim=self.agent.NUM_ACTIONS,
lr=self.lr, num_steps=self.num_steps,
shared_network=shared_network,
activation=activation, loss=loss)
if self.reuse_models and \
os.path.exists(self.value_network_path):
self.value_network.load_model(
model_path=self.value_network_path)
如果 net 是“dnn”,则使用 DNN 类创建价值神经网络,使用 LSTMNetwork 类创建“lstm”,而“cnn”使用 CNN 类创建价值神经网络。因为这些类继承自 Network 类,所以它们具有 Network 类的所有功能。价值神经网络可以看作是损益回归分析的模型。所以我们将激活设置为线性函数,将损失函数设置为 MSE。
如果reuse_models 为True,并且value_network_path 指定的路径中存在神经网络模型文件,则加载神经网络模型文件
5. 策略神经网络创建函数
以下是根据神经网络类型创建策略神经网络的源代码。
def init_policy_network(self, shared_network=None,
activation='sigmoid', loss='mse'):
if self.net == 'dnn':
self.policy_network = DNN(
input_dim=self.num_features,
output_dim=self.agent.NUM_ACTIONS,
lr=self.lr, shared_network=shared_network,
activation=activation, loss=loss)
elif self.net == 'lstm':
self.policy_network = LSTMNetwork(
input_dim=self.num_features,
output_dim=self.agent.NUM_ACTIONS,
lr=self.lr, num_steps=self.num_steps,
shared_network=shared_network,
activation=activation, loss=loss)
elif self.net == 'cnn':
self.policy_network = CNN(
input_dim=self.num_features,
output_dim=self.agent.NUM_ACTIONS,
lr=self.lr, num_steps=self.num_steps,
shared_network=shared_network,
activation=activation, loss=loss)
if self.reuse_models and \
os.path.exists(self.policy_network_path):
self.policy_network.load_model(
model_path=self.policy_network_path)
与创建价值神经网络的init_value_network()函数非常相似的函数。不同的是,价值神经网络使用’linear’作为激活函数的激活因子,而策略神经网络使用’sigmoid’。策略神经网络可以被视为一个分类模型,用于增加样本的 PV。我们使用 sigmoid 作为激活函数,因此结果在 0 和 1 之间,因此我们可以将其用作概率。
|