**《------往期经典推荐------》**
项目名称
1.【基于PyQT+FaceNet卷积神经网络实现的学生人脸识别考勤系统】
2.【卫星图像道路检测DeepLabV3Plus模型】
3.【GAN模型实现二次元头像生成】
4.【CNN模型实现mnist手写数字识别】
5.【fasterRCNN模型实现飞机类目标检测】
6.【CNN-LSTM住宅用电量预测】
7.【VGG16模型实现新冠肺炎图片多分类】
8.【AlexNet模型实现鸟类识别】
9.【DIN模型实现推荐算法】
10.【FiBiNET模型实现推荐算法】
11.【钢板表面缺陷检测基于HRNET模型】
…
1. 项目简介
项目“A064-基于DDPG算法的股票量化交易”旨在利用深度强化学习技术构建智能化股票交易系统,优化投资组合管理和交易策略。该项目基于深度确定性策略梯度(DDPG)算法,它是一种结合了策略梯度和Q学习的深度强化学习方法,适用于连续动作空间的任务。在金融交易领域,股票市场的复杂性和波动性使得传统的交易策略往往难以应对,因此通过机器学习尤其是深度强化学习模型,能够在未知的环境中自主学习并执行复杂的交易策略,提升长期收益和风险管理能力。项目的主要目标是通过对历史数据的学习,训练一个智能体,能够在实际市场中进行自动化交易,决策买卖时机并优化投资回报。DDPG模型通过引入演员-评论家框架,利用深度神经网络来评估状态和选择最佳行动,并通过与环境的交互不断优化交易策略。该模型的应用场景广泛,包括量化交易、投资组合优化以及其他金融决策领域。
2.技术创新点摘要
基于DDPG算法的强化学习环境设计:该项目采用了深度确定性策略梯度(DDPG)算法,专门针对股票市场这一复杂且具有连续动作空间的场景进行优化。DDPG算法结合了策略梯度方法和Q学习,能够处理股票交易中复杂的连续决策问题。特别是在交易过程中,股票的买卖动作是连续的,通过DDPG的连续动作选择能力,能够实现对股票买卖决策的精细化控制。
专为金融市场定制的强化学习环境:项目定义了一个专门用于股票交易的强化学习环境,利用Gym库进行了扩展。这一环境的状态空间包含20个属性变量,反映了股票的多维度特征,涵盖了历史股价、成交量、财务数据等。这些变量经过归一化处理,以确保算法的稳定性。此外,动作空间被定义为连续动作,即智能体可以根据市场状态选择买入、卖出或者观望,每一个动作都对应具体的百分比操作。这种设计充分考虑了股票市场的特点,能够模拟出更加真实的交易场景。
高效的经验回放机制:该项目实现了一个经验回放缓冲池(ReplayBuffer),用于存储智能体与环境交互过程中的经验。这种机制能够让智能体从过往经验中进行多次学习,从而提高学习效率,并避免强化学习中因样本相关性导致的不稳定性。通过对经验的随机抽样,打破了时间上的相关性,使得算法在训练过程中表现得更加稳定。
多策略网络架构:项目采用了演员-评论家架构,分别使用两个神经网络来执行不同的任务。演员网络用于生成股票买卖的策略,而评论家网络则评估当前策略的价值。通过这种双网络的设置,能够有效地分离策略评估和策略生成的过程,从而使得模型在复杂的金融环境中表现得更加灵活和高效。
3. 数据集与预处理
本项目使用的股票数据集来源于第三方金融数据平台baostock,这是一款免费的股票数据API接口,提供了多维度的股票历史数据,包括每日开盘价、收盘价、最高价、最低价、成交量、成交额等关键指标。该数据集覆盖了较长时间跨度的股票市场历史数据,为模型的训练和验证提供了可靠的数据支持。
数据预处理流程
该问题可以被建模为一个强化学习问题。在此场景下,人即为智能体,股票市场为环境,人通过对股票做出决策,即与环境交互后,会获得股票当前的状态。在此项目中,股票状态包含20个属性变量,包含所采用第三方股票数据包baostock
的一些股票属性和基于此计算得到的一些属性变量,分别为:
NOTE
:上述属性值均会经过归一化处理,因此在此项目中,状态为一个长度为20的一维向量,其中每一个值的值域均为 [ 0 , 1 ] [0,1] [0,1]。
- 缺失值处理:在股票数据中,某些财务指标或历史价格可能存在缺失值(例如市盈率、市净率等)。在项目中,首先对这些缺失值进行了处理,通过简单的填充或剔除的方式来确保数据的完整性。比如,当市盈率或市净率等指标为
NaN
时,用0替代。 - 归一化处理:为了使数据在神经网络中能够更好地被处理,所有数值型的特征(如开盘价、收盘价等)都经过了归一化处理。归一化的范围为0到1,通过将原始数据除以预设的最大值(如最大股价、最大成交量等),确保模型在训练过程中数值的稳定性,防止因数值差异过大而导致的梯度爆炸或消失问题。
- 特征选择与构建:项目的输入特征不仅包含了基本的股票价格、成交量等常见的交易数据,还通过财务数据扩展了额外的特征,如市盈率(PE)、市净率(PB)、市销率(PS)等财务指标。这些财务特征为模型提供了更加全面的股票状态描述,帮助智能体在决策时能够更好地判断股票的内在价值和市场趋势。此外,还计算了若干技术指标(如移动平均线、相对强弱指数等)以增强特征工程,提升模型的决策能力。
- 时间序列处理:由于股票交易本质上是一个时间序列决策问题,项目将历史时间点的数据作为当前状态的一部分。通过这种方式,智能体能够基于过去的趋势来预测未来的市场变化,从而做出更加合理的交易决策。
4. 模型架构
1) 模型结构的逻辑
本项目采用了DDPG(深度确定性策略梯度)算法,它是一种基于Actor-Critic架构的强化学习模型,特别适用于连续动作空间的问题。在该架构中,模型由两个主要部分组成:
- Actor(演员)网络:负责生成动作,即在股票交易场景中,它输出买入、卖出或观望的策略。网络输入的是当前股票的状态(如价格、成交量等),输出动作是一个连续值,表示不同的交易行为及其比例。
- Critic(评论家)网络:用于评估Actor所采取的动作的价值,即Q值。它通过评估当前的状态-动作对来计算该策略的长期预期回报。通过Q值的反馈,Actor网络会逐步更新策略,使其更符合最优的交易决策。
此外,项目还设计了两个目标网络(Target Networks)用于稳定训练:分别为目标Actor网络和目标Critic网络,用于软更新,以避免策略的剧烈变化影响模型的稳定性。
2) 模型的整体训练流程
DDPG应用于股票交易项目流程包含如下6个步骤:
- 环境构建:继承
gym.env
,构建股票交易环境StockEnv
; - 容器构建:设计带有存储数据和随机采样的容器
buffer
; - 模型构建:设计
model
,定义具体的算法,其中包括设计前向网络,指定损失函数及优化器; - 训练配置:定义超参数,加载实验环境,实例化模型;
- 模型训练:执行多轮训练,不断调整参数,以达到较好的效果;
- 模型评估:对训练好的模型进行评估测试,观察reward;
- 模型保存:将模型保存到指定位置,以便后续推理或继续训练使用;
- 模型测试:在测试集数据中测试模型的表现。
5. 核心代码详细讲解
1. Actor网络(动作网络)
class Actor(nn.Layer):def init(self, state_dim, action_dim, max_action):super(Actor, self).
__init__
()
self.l1 = nn.Linear(state_dim, 400)
self.l2 = nn.Linear(400, 300)
self.l3 = nn.Linear(300, action_dim)
self.max_action = max_action
def forward(self, state):
a = F.relu(self.l1(state)) # 第一层线性变换,使用ReLU激活函数
a = F.relu(self.l2(a)) # 第二层线性变换,使用ReLU激活函数
a = self.max_action * F.tanh(self.l3(a)) # 输出层使用Tanh激活函数,将输出动作归一化至[-1, 1]之间
a = (a + 1.) / 2. # 将输出映射至[0, 1]区间,符合股票交易场景return a
-
作用:Actor网络负责根据输入的状态生成交易策略(即买入、卖出或观望的动作)。
-
解释:
- 通过两层全连接网络,将状态特征转换为隐藏层。
- 最后一层使用Tanh函数对输出进行压缩,再将值归一化至[0,1]范围,用于表示交易比例。
2. Critic网络(值函数网络)
class Critic(nn.Layer):def init(self, state_dim, action_dim):super(Critic, self).
__init__
()
self.l1 = nn.Linear(state_dim + action_dim, 400)
self.l2 = nn.Linear(400, 300)
self.l3 = nn.Linear(300, 1)
def forward(self, state, action):
q = F.relu(self.l1(paddle.concat([state, action], 1))) # 将状态和动作拼接在一起后,输入到Critic网络
q = F.relu(self.l2(q)) # 第二层线性变换,ReLU激活函数return self.l3(q) # 输出一个标量值Q值,用于评估状态-动作对的价值
-
作用:Critic网络用于评估Actor网络生成的动作的价值(即Q值),帮助Actor网络优化策略。
-
解释:
- 将状态和动作作为输入,评估当前动作的价值,输出单一的Q值。
3. DDPG模型的训练与评估
def train(self, replay_buffer, batch_size=100):
state, action, next_state, reward, done = replay_buffer.sample(batch_size)
# Critic网络优化
target_Q = self.critic_target(next_state, self.actor_target(next_state))
target_Q = reward + (1 - done) * self.gamma * target_Q
current_Q = self.critic(state, action)
critic_loss = F.mse_loss(current_Q, target_Q)
self.critic_optimizer.clear_grad()
critic_loss.backward() # 反向传播计算梯度
self.critic_optimizer.step() # 更新Critic网络参数# Actor网络优化
actor_loss = -self.critic(state, self.actor(state)).mean() # 策略梯度反向优化
self.actor_optimizer.clear_grad()
actor_loss.backward() # 反向传播更新Actor网络
self.actor_optimizer.step()
# 软更新目标网络参数for param, target_param in zip(self.critic.parameters(), self.critic_target.parameters()):
target_param.set_value(target_param * (1.0 - self.tau) + param * self.tau)for param, target_param in zip(self.actor.parameters(), self.actor_target.parameters()):
target_param.set_value(target_param * (1.0 - self.tau) + param * self.tau)
-
作用:
- 训练流程分为两个部分:更新Critic网络和更新Actor网络。
- Critic网络:通过最小化当前Q值和目标Q值之间的均方误差,更新评估网络参数。
- Actor网络:通过反向传播Actor损失,优化策略网络,使得生成的动作能够最大化未来奖励。
-
软更新:使用参数
tau
对Actor和Critic的目标网络进行软更新,逐步靠近主网络,从而提高训练的稳定性。
4. 经验回放机制
class SimpleReplayBuffer(object):def init(self, state_dim, action_dim, max_size=int(1e5)):
self.max_size = max_size
self.cur = 0
self.size = 0
self.states = np.zeros((max_size, state_dim))
self.actions = np.zeros((max_size, action_dim))
self.next_states = np.zeros((max_size, state_dim))
self.rewards = np.zeros((max_size, 1))
self.dones = np.zeros((max_size, 1))
def add(self, state, action, next_state, reward, done):
self.states[self.cur] = state
self.actions[self.cur] = action
self.next_states[self.cur] = next_state
self.rewards[self.cur] = reward
self.dones[self.cur] = done
self.cur = (self.cur + 1) % self.max_size
self.size = min(self.size + 1, self.max_size)
def sample(self, batch):
ids = np.random.randint(0, self.size, size=batch)return (
paddle.to_tensor(self.states[ids], dtype='float32'),
paddle.to_tensor(self.actions[ids], dtype='float32'),
paddle.to_tensor(self.next_states[ids], dtype='float32'),
paddle.to_tensor(self.rewards[ids], dtype='float32'),
paddle.to_tensor(self.dones[ids], dtype='float32')
)
-
作用:经验回放缓冲区用于存储智能体与环境交互的经验(状态、动作、奖励、下一状态、是否结束)。
-
解释:
- 存储经验后,模型从缓冲区中随机采样一批数据,用于训练Critic和Actor网络。这样做可以打破时间相关性,提高模型泛化能力。
6. 模型优缺点评价
模型优点:
- 适应连续动作空间:DDPG算法结合了策略梯度和Q学习,能够有效处理股票交易中的连续动作决策问题,如不同买入卖出的比例。
- Actor-Critic架构:该架构通过分离策略生成(Actor)和策略评估(Critic),提高了模型的稳定性和效率,特别适用于动态和复杂的金融环境。
- 经验回放机制:通过经验回放缓冲区存储和随机采样,打破了样本间的时间相关性,提升了训练的效率和泛化能力。
- 软更新机制:目标网络的软更新避免了策略的剧烈变化,增强了训练过程的稳定性,减少了由于网络参数变化导致的振荡问题。
模型缺点:
- 探索性不足:DDPG使用确定性策略,容易陷入局部最优,导致在复杂的市场环境中策略的探索能力不足。缺乏足够的随机性来探索更多潜在的交易策略。
- 数据依赖强:模型对于数据的依赖较强,历史数据中的非平稳性和噪声会对模型性能产生较大影响,特别是数据分布与实际市场存在差异时,模型表现可能下降。
- 超参数敏感:模型的性能对超参数(如学习率、探索噪声等)较为敏感,参数选择不当可能导致训练过程不稳定或者收敛速度较慢。
改进方向:
- 改进探索机制:可以引入如熵正则化或随机噪声策略等方法,增加策略的随机性,提升模型的探索能力,避免陷入局部最优。
- 超参数优化:采用自动化超参数调优方法,如网格搜索、贝叶斯优化,来找到更合适的超参数组合,提高模型的训练效率和稳定性。
- 数据增强:通过对历史数据进行数据增强,如随机时间扰动、模拟不同市场条件等,提升模型的泛化能力,使其能够更好地应对实际市场波动。