强化深度学习中利用时序差分法中的Sarsa算法解决风险投资问题实战(附源码 超详细必看)

news2024/11/19 7:49:08

需要源码请点赞关注收藏后评论区留下QQ~~~

一、Sarsa算法简介

Sarsa算法每次更新都需要获取五元组(S,A,R,S',A')这也是该算法称为Sarsa的原因,每当从非终止状态进行一次转移后,就进行一次更新,但需要注意的是,动作A是情节中实际发生的动作。在更新(S,A)的动作值函数Q(S,A)时,Agent并不实际执行状态S'下的动作A‘。由于采用了贪心策略,Sarsa算法在各时间步都隐式地进行了策略改进,像这种在每个样本更新后都进行策略改进的策略迭代算法,也成为完全乐观策略算法

估算最优策略的Sarsa算法步骤如下

 二、风险投资问题实战

在进行投资时,预期收益是一个非常重要的参考指标,现在越来越多的人接收概率的观点,但是收益为正的投资也未必一定理性。

假设一种风险投资,当前本金为S,下一个单位时间有0.5的概率变为原有资产的0.9倍,0.5的概率变为原有资产的1.11倍。经过一个时间单位后预期收益率变为百分之0.5,但是在实际情况中,进行2n各时间步后连续投资预期收益非常低,当N趋近于无穷时,该投资会血本无归,为了使投资更加合理,利用Sarsa算法给出在给定本金情况下的投资方案

该问题的MDP模型如下

1:状态空间

状态为当前资产的数目,因此状态空间为连续的实数空间

2:动作空间

该问题中一共有两个动作,分别为投资和不投资。用0表示不投资,用1表示投资

3:立即奖赏

在这个问题中 如果不投资则立即奖赏为0,如果进行投资则分为四种情况

资产增长且结果大于等于本金 +1奖赏

资产减少 且投资结果小于等于本金 -1奖赏

资产增加 且投资结果小于本金 +0.5奖赏

资产减少 且投资结果大于本金 -0.5奖赏

使用Sarsa算法解决风险投资问题 首先设置本金为10  将动作值函数设置为50×2的数组,且初值为0,初始学习率为0.05,使用贪心策略

当迭代到20000个情节时  迭代已经收敛 导出的Q值迭代过程表如下 

 

结论:当资金小于本金时(10)时,不进行投资,当现有资金大于等于本金(10)时,可以进行投资 

部分代码如下



import numpy as np
from invest import InvestEnv
np.random.seed(1)
env = InvestEnv()

def trans_q(Q):  # 输出保留3位小数
    new_q = []
    new_q = [round(x, 3) for x in Q]
    return new_q

def Attenuation(epsilon, alpha, episode_sum, episode):  # epsilon和alpha衰减函数
    epsilon = (float(episode_sum) - float(episode)) / float(episode_sum) * epsilon
    alpha = (float(episode_sum) - float(episode)) / float(episode_sum) * alpha
    return epsilon, alpha

# 输出函数
def print_ff(list_q, Q, episode_i, epsilon_k, alpha_k):
    list_s = range(0,50)
    for em in list_q:
        if em == episode_i:
            print("*******************************情节数:%s*******************************" % (str(em)))
            for state in list_s:
                print("Q(%d,*)" % (state) + str(trans_q(Q[state])))
                prob = [epsilon_k / 2.0, epsilon_k / 2.0]
                max_a = np.argmax(Q[state])
                prob[max_a] = 1 - (epsilon_k / 2.0)
                print('概率值' + str(trans_q(prob)))
                print("epsilon_k: {}".format(epsilon_k))
                print("alpha_k:{}".format(alpha_k))

# 输出单步计算过程
def print_dd(s, a, R, next_s, next_a, print_len, episode_i, Q, e_k, a_k, P, P_next):

    if s == 6 and a == 1:
        print("*********************************单步的计算过程************************************")
        print(6, 1)
        print("alpha:" + str(a_k))
        print("epsilon:" + str(e_k))
        print("Q_state: {} Q_next: {}".format(Q[s], Q[next_s]))
        print("Q[{},{}]: {}".format(s, a, Q[s, a]))
        print("Q[{},{}]: {}".format(next_s, next_a, Q[next_s, next_a]))

        print("update:" + str(Q[s, a] + a_k * (R + 0.8 * Q[next_s, next_a] - Q[s, a])))
        # print(p)
        print("************************************************************************************")

def policy_epsilon_greedy(env, s, Q, epsilon):
    Q_s = Q[s]
    if np.random.rand() < epsilon:
        a = np.random.choice(env.action_space)
    else:
        a = np.argmax(Q_s)
    return a

def Sarsa(env, episode_num, alpha, gamma, epsilon):
    Q = np.zeros((env.state_space, env.action_space))
    epsilon = epsilon
    count = 0
    list_q = [0,1,2,3,4,9998,9999,10000,10001,10002,19996,19997,19998,19999,20000]
    for episode_i in range(episode_num):
        env.reset()
        S = env.state
        epsilon_k, alpha_k = Attenuation(epsilon, alpha, episode_num, episode_i)
        A = policy_epsilon_greedy(env, S, Q, epsilon_k)
        print_ff(list_q, Q, episode_i, epsilon_k, alpha_k)
        if episode_i == 10000:
            print("e_k:" + str(epsilon_k) + "a_k" + str(alpha_k))
        done = False
        P_S = env.getState()
        for i in range(1000):
            next_S, R = env.step(A)
            P_S_next = env.getState()
            if next_S > 49:
                Q[S, A] = Q[S, A] + alpha_k * (R + gamma * 0.0 - Q[S, A])
                break
            next_A = policy_epsilon_greedy(env, next_S, Q, epsilon_k)
            # 输出某一个
            if episode_i in [9999, 10000]:

            count += 1
    print(count)
    return Q


Q = Sarsa(env, 20001, 0.05, 0.8, 0.5)

 创作不易 觉得有帮助请点赞关注收藏~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29539.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文阅读】社交网络传播最大化问题-04

Efficient Influence Maximization in Social Networks相关工作改进的贪心算法对独立级联模型的改进对加权级联模型的改进改进度折扣算法影响力最大化&#xff1a;在社交网络中找到一小部分能够最大化传播影响力的节点(种子节点)。一是改进原有的贪心算法&#xff0c;进一步缩短…

KMP算法——通俗易懂讲好KMP算法:实例图解分析+详细代码注解

文章目录1.kmp算法基本介绍2.字符串的最长公共前后缀&部分匹配表2.1 什么是最长公共前后缀2.2 什么是部分匹配表Next2.3 字符串最长公共前后缀&部分匹配表的代码实现2.4 代码测试3.根据部分匹配表搜索字符串匹配位置3.1 匹配成功一个就退出匹配的代码3.1.1 KMP算法的大…

Vue父组件给子组件传参数

别人在调用我们写的组件时&#xff0c;虽然要实现的结构一样&#xff0c;但如果别人想改一下显示的内容或者之类的&#xff0c;该怎么做呢&#xff1b;这时候就要提到“传参数”这个词了&#xff0c;别人可以通过传不同的参数&#xff0c;来实现他们具体的结构&#xff1b; 传参…

SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.22 RabbitMQ 安装

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇5 整合第三方技术5.22 RabbitMQ 安装5.22.1 Erlang下载5.22.2 安装5.…

HTML+CSS期末大作业 中国传统美食网站设计 节日美食13页 html5网页设计作业代码 html制作网页案例代码 html大作业网页代码

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

3招学会TikTok电商选品,速看

Sensor Tower商店情报数据显示&#xff0c;2022年10月Instagram以将近6700万下载量&#xff0c;成为全球移动应用&#xff08;非游戏&#xff09;下载榜冠军&#xff0c;较2021年10月增长17.2%。其中&#xff0c;印度市场的下载量占45.2%&#xff0c;美国市场的下载量占比为5.4…

《码出高效:Java开发手册》笔记之二-面向对象

前言 第二章主要是讲面向对象&#xff0c;也就是oop&#xff0c;这个概念其实很多人已经听腻了&#xff0c;都是非常基础的知识&#xff0c;本章就是讲一些java以及很多编程语言的基础设计思想 正文 oop理念 面向对象是在早期滥用面向过程编程后出现的&#xff0c;面向过程…

CSS清除浮动的五种方法(超详细)

1.为什么要清除浮动? 浮动的原理是让图片脱离文档流&#xff0c;直接浮在桌面上。我们一般布局的时候都是只设置宽度不设置高度&#xff0c;让内容来自动填充高度。但使用浮动后会让原本填充的高度消失&#xff0c;父元素高度为0&#xff0c;后续添加内容布局会产生混乱,造成…

C语言tips-数组指针和指针数组

最近因为工作需要开始重新学c语言&#xff0c;越学越发现c语言深不可测&#xff0c;当初用python轻轻松松处理的一些数据&#xff0c;但是c语言写起来却异常的复杂&#xff0c;这个板块就记录一下我的c语言复习之路 数组指针 概念&#xff1a;顾名思义就是一个指针&#xff0c;…

英特尔oneAPI-用于异构计算的英特尔oneAPI

文章目录前景解决方案CUDA替代方案OpenMPOpenACCC 库Python 和 JavaSYCL 和 oneAPI结论如今&#xff0c;异构性广泛存在于高性能计算和消费电子产品中。这些系统在传统 CPU 的基础上增加了大量协处理器或加速器&#xff0c;例如 GPU、TPU 和 FPGA。然而&#xff0c;没有一种简单…

梯度下降——机器学习

一、实验内容 掌握基于密度的聚类方法的基本思想&#xff1b;掌握单变量函数的梯度下降的原理、算法及python实现&#xff1b;掌握双变量函数的梯度下降的原理、算法及python实现&#xff0c;并测试分析&#xff1b;理解学习率η的选择并测试分析。 二、实验过程 1、算法思想 在…

状态估计|基于 MMSE 的分析估计器的不确定电力系统分析(Matlab代码实现)

一、概述 在分布式电网系统中部署可再生资源带来了一系列新挑战&#xff0c;主要是由于它们的可变性和对气候参数的依赖性&#xff0c;这可能对测量潮流和状态估计所需的系统参数产生重大影响。第一个旨在根据某些参数的先验知识&#xff08;或预测&#xff09;计算整个系统参…

从头开始进行CUDA编程:流和事件

前两篇文章我们介绍了如何使用GPU编程执行简单的任务&#xff0c;比如令人难以理解的并行任务、使用共享内存归并&#xff08;reduce&#xff09;和设备函数。为了提高我们的并行处理能力&#xff0c;本文介绍CUDA事件和如何使用它们。但是在深入研究之前&#xff0c;我们将首先…

C++【智能指针】

文章目录一、什么是智能指针RAII思想std::auto_ptr二、智能指针的拷贝问题&#xff08;C98&#xff09;1.unique_ptr2.shared_ptrshared_ptr的问题循环引用的问题3.weak_ptr内存泄漏的危害一、什么是智能指针 #include<iostream>using namespace std; int div() {int a,…

哈希散列表hlist_head - linux内核经典实例

hlist_head和hlist_node用于散列表&#xff0c;分别表示列表头&#xff08;数组中的一项&#xff09;和列表头所在双向链表中的某项&#xff0c;两者结构如下: include/linux/types.h(line 190) struct hlist_head {struct hlist_node *first; };struct hlist_node {struct h…

护眼灯真的可以保护眼睛吗?2022双十二选哪款护眼灯对孩子眼睛好

传统的台灯只是单一色光&#xff0c;无法调节台灯的照度和色温&#xff0c;长时间使用不但不可以护眼&#xff0c;而且还会导致近视、散光等各种问题的发生。现在的护眼台灯大多都是使用led灯珠作为发光源&#xff0c;不但本身比较高效节能&#xff0c;而且光线可调控&#xff…

react--redux

此篇文章非学习使用&#xff0c;学习勿入 redux 文档&#xff1a; http://www.redux.org.cn 用于做状态管理的js库 集中管理react中多个组件共享的状态 安装&#xff1a; cnpm i redux 给形参赋值&#xff0c;表示形参的默认值 错误&#xff1a; 对象不能作为一个dom元素…

NPDP认证|制造业产品经理日常工作必备技能,快来学习提升吧!

不同阶段的产品经理对技能的掌握程度要求不同&#xff0c;侧重点也不同&#xff0c;一般包括需求分析、数据分析、竞品分析、商业分析、行业分析、需求收集、产品设计、版本管理、用户调研等。这些技能&#xff0c;是我们必须要掌握的专业技能。 比如&#xff1a;对于刚入行的…

异常检测算法分类总结(含常用开源数据集)

作者&#xff1a;云智慧算法工程师 Chris Hu 异常检测是识别与正常数据不同的数据&#xff0c;与预期行为差异大的数据。本文详细介绍了异常检测的应用领域以及总结梳理了异常检测的算法模型分类。文章最后更是介绍了常用的异常算法数据集。 异常的概念与类型 目前异常检测主…

硝酸根离子深度去除树脂

普通的阴离子交换树脂对阴离子的交换次序是&#xff1a;SO42-&#xff1e;NO3-&#xff1e;HCO3-&#xff0c;对硝酸盐没有选择性&#xff0c;优先交换水中硫酸根&#xff0c;造成树脂再生频繁&#xff0c;产水中氯离子含量增高&#xff0c;出水水质稳定性差&#xff0c;树脂交…