0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是强化学习

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-30 11:36 次阅读

强化学习是机器学习的方式之一,它与监督学习、无监督学习并列,是三种机器学习训练方法之一。

图片

在围棋上击败世界第一李世石的 AlphaGo、在《星际争霸2》中以 10:1 击败了人类顶级职业玩家的AlphaStar,他们都是强化学习模型。诸如此类的模型还有 AlphaGo Zero 等。

强化学习的原理非常简单,它非常像心理学中新行为主义派的斯金纳发现的操作性条件反射。

操作性条件反射是什么?当年斯金纳做了一个箱子,进行了两次实验。

第一次实验,箱子里放了一只饥饿的老鼠,在箱子的一边有一个可供按压的杠杆,在杠杆旁边有一个放置食物的小盒子。动物在箱内按下杠杆,食盒就会释放食物进入箱内,动物可以取食。结果:小鼠自发学会了按按钮。这是积极强化。

另一次实验是,每次小白鼠不按下按钮,则给箱子通电,小白鼠因此学会了按按钮以防自己遭受电击。这是消极强化(负向强化)。

这就是斯金纳发现的操作性条件反射,当行为得到奖励或惩罚时出现刺激,反过来控制这种行为。

图片

强化学习与操作性条件反射有异曲同工之妙,以人类玩游戏为例,如果在游戏中采取某种策略购买某种类型的装备可以取得较高的得分,那么就会进一步“强化”这种策略,以期继续取得较好的结果。

网上有不少强化学习的例子,鉴于读者中对股票感兴趣的同学比较多,我们以股票预测为例,实验一下 wangshub 的 RL-Stock 项目。

下面就试一下这个强化学习项目,前往GitHub下载 RL-Stock:

https://github.com/wangshub/RL-Stock/

如果你无法使用GitHub,也可以在Python实用宝典公众号后台回复:股票强化学习1 下载全文完整代码,这份代码包括第三部分的多进程优化逻辑。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。

**(可选1) **如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

**(可选2) **此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南

请注意,由于TensorFlow版本限制,这个强化学习项目只支持 Python3 以上,Python3.6 及以下的版本,因此我建议使用Anaconda创建一个新的虚拟环境运行这个项目:

conda create -n rlstock python=3.6

另外,实测依赖需要改动 requirements.txt 的tensorflow-gpu版本至1.14:

图片

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),进入 RL-Stock 项目文件夹输入命令安装依赖:

pip install -r requirements.txt

2.小试强化学习

运行RL-Stock项目前,需要下载数据。进入刚创建的虚拟环境,运行get_stock_data.py代码会自动下载数据到 stockdata 目录中:

python get_stock_data.py

如果你使用的是在Github上下载的代码而不是Python实用宝典后台改好的代码,请注意 get_stock_data.py 的第46行,必须对 row["code_name"] 去除 * 号,否则Windows系统下可能会存在问题:

df_code.to_csv(f'{self.output_dir}/{row["code"]}.{row["code_name"].strip("*")}.csv', index=False)

数据下载完成后就可以运行 main.py 执行强化学习训练和测试,不过在训练之前,我们先简单了解下整个项目的输入状态、动作、和奖励函数。

输入状态(观测 Observation)

策略网络观测的就是一只股票的各类数据,比如开盘价、收盘价、成交量等,它可以由许多因子组成。为了训练时网络收敛,观测状态数据输入时必须要进行归一化,变换到 ** [-1, 1] ** 的区间内。RL-Stock输入的观测数据字段如下:

动作 Action

共有 买入卖出和**持有 **3 种动作,定义动作( ** action ** )为长度为 2 的数组

  • **action[0] **为操作类型;
  • action[1] 表示买入或卖出百分比;
动作类型action[0]说明
1买入action[1]
2卖出action[1]
3持有

注意,当动作类型 action[0] = 3 时,表示不买也不抛售股票,此时 action[1] 的值无实际意义,网络在训练过程中,Agent 会慢慢学习到这一信息。Agent,实称代理,在我们的上下文中,你可以视其为策略。

奖励 Reward

奖励函数的设计,对强化学习的目标至关重要。在股票交易的环境下,最应该关心的就是当前的盈利情况,故用当前的利润作为奖励函数。

# profits
reward = self.net_worth - INITIAL_ACCOUNT_BALANCE
reward = 1 if reward > 0 else -100

为了使网络更快学习到盈利的策略,当利润为负值时,给予网络一个较大的惩罚 (-100)。

梯度策略

作者采用了基于策略梯度的PPO 算法,OpenAI 和许多文献已把 PPO 作为强化学习研究中首选的算法。PPO 优化算法 Python 实现参考 stable-baselines。

数据集及自定义

在数据集上,作者使用了1990年至2019年11月作为训练集,2019年12月作为测试集。

1990-01-01~2019-11-292019-12-01~2019-12-31
训练集测试集

如果你要调整这个训练集和测试集的时间,可以更改 get_stock_data.py 的以下部分:

if __name__ == '__main__':
    # 获取全部股票的日K线数据
    # 训练集
    mkdir('./stockdata/train')
    downloader = Downloader('./stockdata/train', date_start='1990-01-01', date_end='2019-11-29')
    downloader.run()
     # 测试集
    mkdir('./stockdata/test')
    downloader = Downloader('./stockdata/test', date_start='2019-12-01', date_end='2019-12-31')
    downloader.run()

训练并测试

首先,我们尝试一下单一代码的训练和测试,修改main.py里的股票代码,比如我这里修改为601919中远海控:

if __name__ == '__main__':
    # multi_stock_trade()
    test_a_stock_trade('sh.601919')
    # ret = find_file('./stockdata/train', '601919')
    # print(ret)

运行下面的命令,执行此深度学习模型的训练和测试。

python main.py

训练完成后,会自动进行模拟操作测试集这20个交易日,然后会输出这20个交易日的测试结果:

------------------------------
Step: 20
Balance: 0.713083354256014
Shares held: 2060 (Total sold: 2392)
Avg cost for held shares: 5.072161917927474 (Total sales value: 12195.091008936648)
Net worth: 10930.56492977963 (Max net worth: 10930.56492977963)
Profit: 930.5649297796299
------------------------------
Step: 21
Balance: 0.713083354256014
Shares held: 2060 (Total sold: 2392)
Avg cost for held shares: 5.072161917927474 (Total sales value: 12195.091008936648)
Net worth: 10815.713083354256 (Max net worth: 10930.56492977963)
Profit: 815.713083354256

利润图如下:

图片

然后我们看一下中远海控2019年12月的走势:

图片

可以看到这个月的中远海控是一个上升趋势,一共上涨了12%,而这个模型捕捉到其中8%左右的利润,还是相当不错的。

当然,凡事不能只看个体,下面我们修改下作者的源代码,试一下其在市场里的整体表现。

3.强化学习模型整体表现

由于作者原有的模型是单进程的计算,为了测试全市场的表现,我进行了多进程改造。

我将作者的训练及测试任务集成到一个函数中,并使用celery做并行:

@app.task
def multi_stock_trade(code):
    stock_file = find_file('./stockdata/train', str(code))
    if stock_file:
        try:
            profits = stock_trade(stock_file)
            with open(f'result/code-{code}.pkl', 'wb') as f:
                pickle.dump(profits, f)
        except Exception as err:
            print(err)

将训练集的时间范围设置为1990年到2021年,测试集的测试周期改为最近一个月:

1990-01-01~2021-11-252021-11-26~2021-12-25
训练集测试集

开启redis-server 及 Celery Worker:

# redis-server 独占一个进程,所以需要另开一个窗口
celery -A tasks worker -l info

遍历所有的股票代码做并发测试:

files = os.listdir("stockdata/train")
files_test = os.listdir("stockdata/test")
all_files_list = list(set(files) & set(files_test))
for i in all_files_list:
    # 使用celery做并发
    code = ".".join(i.split(".")[:2])
    # multi_stock_trade.apply_async(args=(code,))
    multi_stock_trade(code)

再对生成的结果进行统计,测试结果如下:

图片

对这个模型在2021-11-26到2021-12-25的测试结果表明,有40.8%的股票进行了交易并且获利,有49.9%的股票没有进行操作,有9.4%的股票进行了交易并亏损。平均每次交易利润为445元,作为一个测试策略,这个结果已经很不错了。

由于只是一个测试策略,这里就不做详细的风险分析了,实际上我们还需要观察这个策略的最大回撤率、夏普率等指标才能更好地评判此策略的好坏。

我认为这个项目还有很大的改造空间,原逻辑中只观察了OHLC等基本数据,我们还可以增加很多指标,比如基于Ta-lib,算出MACD、RSI等技术指标,再将其加入Observation中,让模型观察学习这些数据的特征,可能会有不错的表现。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模型
    +关注

    关注

    1

    文章

    2704

    浏览量

    47687
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66771
  • 机器学习
    +关注

    关注

    66

    文章

    8122

    浏览量

    130563
  • 强化学习
    +关注

    关注

    4

    文章

    259

    浏览量

    11114
收藏 人收藏

    评论

    相关推荐

    什么是深度强化学习?深度强化学习算法应用分析

    什么是深度强化学习? 众所周知,人类擅长解决各种挑战性的问题,从低级的运动控制(如:步行、跑步、打网球)到高级的认知任务。
    发表于 07-01 10:29 1187次阅读
    什么是深度<b class='flag-5'>强化学习</b>?深度<b class='flag-5'>强化学习</b>算法应用分析

    反向强化学习的思路

    强化学习的另一种策略(二)
    发表于 04-03 12:10

    深度强化学习实战

    一:深度学习DeepLearning实战时间地点:1 月 15日— 1 月18 日二:深度强化学习核心技术实战时间地点: 1 月 27 日— 1 月30 日(第一天报到 授课三天;提前环境部署 电脑
    发表于 01-10 13:42

    强化学习在RoboCup带球任务中的应用刘飞

    强化学习在RoboCup带球任务中的应用_刘飞
    发表于 03-14 08:00 0次下载

    将深度学习强化学习相结合的深度强化学习DRL

    深度强化学习DRL自提出以来, 已在理论和应用方面均取得了显著的成果。尤其是谷歌DeepMind团队基于深度强化学习DRL研发的AlphaGo,将深度强化学习DRL成推上新的热点和高度,成为人工智能历史上一个新的里程碑。因此,深
    发表于 06-29 18:36 2.8w次阅读

    萨顿科普了强化学习、深度强化学习,并谈到了这项技术的潜力和发展方向

    萨顿在专访中(再次)科普了强化学习、深度强化学习,并谈到了这项技术的潜力,以及接下来的发展方向:预测学习
    的头像 发表于 12-27 09:07 1.1w次阅读

    什么是强化学习?纯强化学习有意义吗?强化学习有什么的致命缺陷?

    强化学习是人工智能基本的子领域之一,在强化学习的框架中,智能体通过与环境互动,来学习采取何种动作能使其在给定环境中的长期奖励最大化,就像在上述的棋盘游戏寓言中,你通过与棋盘的互动来学习
    的头像 发表于 07-15 10:56 1.7w次阅读
    什么是<b class='flag-5'>强化学习</b>?纯<b class='flag-5'>强化学习</b>有意义吗?<b class='flag-5'>强化学习</b>有什么的致命缺陷?

    基于强化学习的MADDPG算法原理及实现

    之前接触的强化学习算法都是单个智能体的强化学习算法,但是也有很多重要的应用场景牵涉到多个智能体之间的交互。
    的头像 发表于 11-02 16:18 2.1w次阅读

    深度强化学习你知道是什么吗

    强化学习非常适合实现自主决策,相比之下监督学习与无监督学习技术则无法独立完成此项工作。
    发表于 12-10 14:34 1113次阅读

    一文详谈机器学习强化学习

    强化学习属于机器学习中的一个子集,它使代理能够理解在特定环境中执行特定操作的相应结果。目前,相当一部分机器人就在使用强化学习掌握种种新能力。
    发表于 11-06 15:33 1582次阅读

    83篇文献、万字总结强化学习之路

    深度强化学习是深度学习强化学习相结合的产物,它集成了深度学习在视觉等感知问题上强大的理解能力,以及强化学习的决策能力,实现了...
    的头像 发表于 12-10 18:32 396次阅读

    DeepMind发布强化学习库RLax

    RLax(发音为“ relax”)是建立在JAX之上的库,它公开了用于实施强化学习智能体的有用构建块。。报道:深度强化学习实验室作者:DeepRL ...
    的头像 发表于 12-10 18:43 527次阅读

    强化学习在智能对话上的应用介绍

    本文主要介绍深度强化学习在任务型对话上的应用,两者的结合点主要是将深度强化学习应用于任务型对话的策略学习上来源:腾讯技术工程微信号
    的头像 发表于 12-10 19:02 808次阅读

    强化学习的基础知识和6种基本算法解释

    来源:DeepHub IMBA 强化学习的基础知识和概念简介(无模型、在线学习、离线强化学习等) 机器学习(ML)分为三个分支:监督学习、无
    的头像 发表于 12-20 14:00 879次阅读

    强化学习的基础知识和6种基本算法解释

    来源:DeepHubIMBA强化学习的基础知识和概念简介(无模型、在线学习、离线强化学习等)机器学习(ML)分为三个分支:监督学习、无监督
    的头像 发表于 01-05 14:54 488次阅读
    <b class='flag-5'>强化学习</b>的基础知识和6种基本算法解释