基于DDPG算法的股票量化交易

项目源码获取方式见文章末尾! 回复暗号:13,免费获取600多个深度学习项目资料,快来加入社群一起学习吧。

        **《------往期经典推荐------》**

项目名称
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的一些股票属性和基于此计算得到的一些属性变量,分别为:

属性名 含义
open 当天开盘价格
high 最高价格
low 最低价格
close 收盘价格
volume 成交量
amount 成交额
adjustflag 赋权状态(1:后复权,2:前复权,3:不复权)
tradestatus 交易状态(1:正常交易,0:停牌)
pctChg 涨跌幅(百分比)
peTTM 滚动市盈率
pbMRQ 市净率
psTTM 滚动市销率
balance 当前拥有的金钱
max_net_worth 最大资产净值
net_worth 当前资产净值
shares_held 持有的手数
cost_basis 即时买入价格
total_shares_sold 总共抛出的手数
total_sales_value 总共抛出的价值

NOTE:上述属性值均会经过归一化处理,因此在此项目中,状态为一个长度为20的一维向量,其中每一个值的值域均为 [ 0 , 1 ] [0,1] [0,1]

  1. 缺失值处理:在股票数据中,某些财务指标或历史价格可能存在缺失值(例如市盈率、市净率等)。在项目中,首先对这些缺失值进行了处理,通过简单的填充或剔除的方式来确保数据的完整性。比如,当市盈率或市净率等指标为NaN时,用0替代。
  2. 归一化处理:为了使数据在神经网络中能够更好地被处理,所有数值型的特征(如开盘价、收盘价等)都经过了归一化处理。归一化的范围为0到1,通过将原始数据除以预设的最大值(如最大股价、最大成交量等),确保模型在训练过程中数值的稳定性,防止因数值差异过大而导致的梯度爆炸或消失问题。
  3. 特征选择与构建:项目的输入特征不仅包含了基本的股票价格、成交量等常见的交易数据,还通过财务数据扩展了额外的特征,如市盈率(PE)、市净率(PB)、市销率(PS)等财务指标。这些财务特征为模型提供了更加全面的股票状态描述,帮助智能体在决策时能够更好地判断股票的内在价值和市场趋势。此外,还计算了若干技术指标(如移动平均线、相对强弱指数等)以增强特征工程,提升模型的决策能力。
  4. 时间序列处理:由于股票交易本质上是一个时间序列决策问题,项目将历史时间点的数据作为当前状态的一部分。通过这种方式,智能体能够基于过去的趋势来预测未来的市场变化,从而做出更加合理的交易决策。

4. 模型架构

1) 模型结构的逻辑

在这里插入图片描述

本项目采用了DDPG(深度确定性策略梯度)算法,它是一种基于Actor-Critic架构的强化学习模型,特别适用于连续动作空间的问题。在该架构中,模型由两个主要部分组成:

  • Actor(演员)网络:负责生成动作,即在股票交易场景中,它输出买入、卖出或观望的策略。网络输入的是当前股票的状态(如价格、成交量等),输出动作是一个连续值,表示不同的交易行为及其比例。
  • Critic(评论家)网络:用于评估Actor所采取的动作的价值,即Q值。它通过评估当前的状态-动作对来计算该策略的长期预期回报。通过Q值的反馈,Actor网络会逐步更新策略,使其更符合最优的交易决策。

此外,项目还设计了两个目标网络(Target Networks)用于稳定训练:分别为目标Actor网络和目标Critic网络,用于软更新,以避免策略的剧烈变化影响模型的稳定性。

2) 模型的整体训练流程

DDPG应用于股票交易项目流程包含如下6个步骤:

  1. 环境构建:继承gym.env,构建股票交易环境StockEnv
  2. 容器构建:设计带有存储数据和随机采样的容器buffer
  3. 模型构建:设计model,定义具体的算法,其中包括设计前向网络,指定损失函数及优化器;
  4. 训练配置:定义超参数,加载实验环境,实例化模型;
  5. 模型训练:执行多轮训练,不断调整参数,以达到较好的效果;
  6. 模型评估:对训练好的模型进行评估测试,观察reward;
  7. 模型保存:将模型保存到指定位置,以便后续推理或继续训练使用;
  8. 模型测试:在测试集数据中测试模型的表现。

在这里插入图片描述

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. 模型优缺点评价

模型优点:

  1. 适应连续动作空间:DDPG算法结合了策略梯度和Q学习,能够有效处理股票交易中的连续动作决策问题,如不同买入卖出的比例。
  2. Actor-Critic架构:该架构通过分离策略生成(Actor)和策略评估(Critic),提高了模型的稳定性和效率,特别适用于动态和复杂的金融环境。
  3. 经验回放机制:通过经验回放缓冲区存储和随机采样,打破了样本间的时间相关性,提升了训练的效率和泛化能力。
  4. 软更新机制:目标网络的软更新避免了策略的剧烈变化,增强了训练过程的稳定性,减少了由于网络参数变化导致的振荡问题。

模型缺点:

  1. 探索性不足:DDPG使用确定性策略,容易陷入局部最优,导致在复杂的市场环境中策略的探索能力不足。缺乏足够的随机性来探索更多潜在的交易策略。
  2. 数据依赖强:模型对于数据的依赖较强,历史数据中的非平稳性和噪声会对模型性能产生较大影响,特别是数据分布与实际市场存在差异时,模型表现可能下降。
  3. 超参数敏感:模型的性能对超参数(如学习率、探索噪声等)较为敏感,参数选择不当可能导致训练过程不稳定或者收敛速度较慢。

改进方向:

  1. 改进探索机制:可以引入如熵正则化随机噪声策略等方法,增加策略的随机性,提升模型的探索能力,避免陷入局部最优。
  2. 超参数优化:采用自动化超参数调优方法,如网格搜索、贝叶斯优化,来找到更合适的超参数组合,提高模型的训练效率和稳定性。
  3. 数据增强:通过对历史数据进行数据增强,如随机时间扰动、模拟不同市场条件等,提升模型的泛化能力,使其能够更好地应对实际市场波动。

????感谢小伙伴们点赞、关注! 如有其他项目需求的,可以在评论区留言,抽空制作更新!
✌粉丝福利:点击下方名片↓↓↓ 回复暗号:13,免费获取600多个深度学习项目资料,快来加入社群一起学习吧。

上一篇:在qemu-system上跑arm-Debian


下一篇:384.打乱数组-题目