打造一个投资组合管理的金融强化学习环境

news2024/11/29 4:38:56

原创文章第120篇,专注“个人成长与财富自由、世界运作的逻辑, AI量化投资”。

今天继续金融强化学习环境。

网上的金融学习环境不少,但都太过于“业余”,或者离像样的投资还差得太远。我一直觉得投资组合应该是必要的,不做投资组合,要控制回撤实在太难了,加上低相关多资产组合,对于投资而言,低层逻辑就是成立的。再加上一些规则也好,模型也罢,或者强化学习的加持,争取提升收益率。

所以,强化学习我也希望能够做投资组合。在finRL-meta里有投资组合分配的环境,今天结合咱们自己的AI量化平台,打造一个金融“投资组合管理”的学习环境。

from abc import ABC

import gym
import numpy as np
from gym import spaces


class FinanceEnv(gym.Env, ABC):
    def __init__(self, symbols, df_features, df_returns, initial_amount=1000000):
        super(FinanceEnv, self).__init__()
        # 正则化,和=1,长度就是组合里的证券数量
        self.action_space = spaces.Box(low=0, high=1, shape=(len(symbols),))
        self.observation_space = spaces.Box(
            low=-np.inf,
            high=np.inf,
            shape=(len(symbols), len(df_features.columns)), dtype=np.float64
        )
        #print(self.observation_space)
        self.dates = list(df_features.index)
        self.df_features = df_features
        self.df_returns = df_returns
        self.initial_amount = initial_amount
        self.portfolio_value = initial_amount
        self.index = 0

    def reset(self):
        self.index = 0
        self.portfolio_value = self.initial_amount
        df = self.df_features.loc[self.dates[0]]
        print(df.values.shape)
        return df.values

    def step(self, actions):
        done = False
        if self.index >= len(self.dates) - 1:
            done = True
            print(self.reward)
            return self.state, self.reward, done, {}

        self.index += 1

        weights = self.softmax_normalization(actions)
        df_return = np.array(self.df_returns.loc[self.dates[self.index]]['return'])
        port_return = sum(df_return * np.array(weights))
        self.portfolio_value = self.portfolio_value * (1 + port_return)

        df = self.df_features.loc[self.dates[self.index], :]

        self.state = df.values
        self.reward = self.portfolio_value * 1.0

        return self.state, self.reward, done, {}

    def softmax_normalization(self, actions):
        numerator = np.exp(actions)
        denominator = np.sum(np.exp(actions))
        softmax_output = numerator / denominator
        return softmax_output


if __name__ == '__main__':
    from stable_baselines3.common.env_checker import check_env
    from stable_baselines3 import A2C
    from engine.datafeed.dataloader import Dataloader

    symbols = ['399006.SZ', '000300.SH']
    names = []
    fields = []

    features = []
    fields += ['Slope($close,20)']
    names += ['mom_slope']
    features += ['mom_slope']

    fields += ['KF($mom_slope)']
    names += ['kf_mom_slope']
    features += ['kf_mom_slope']

    fields += ["$close/Ref($close,1) - 1"]
    names += ['return']

    loader = Dataloader(symbols, names, fields, load_from_cache=True)
    data = loader.data
    data = data[data.index > '2010-06-02']
    df_features = data[names]
    df_return = data[['return']]
    print(df_features)
    env = FinanceEnv(symbols, df_features, df_return)
    # check_env(env)
    model = A2C("MlpPolicy", env)
    model.learn(total_timesteps=100000)

1、继承自gym.Env。

2、定义动作与状态空间,都是gym.spaces 对象。

动作空间就是投资组合里的symbol数量,因为我们给出的是证券的仓位占比;而状态空间是symbol行*特征列——也就是所有证券的因子值。

3、重点实现step与reset两个函数

Step就是传入一个动作,并计算reward,返回新的state。

Reset是环境重置初始化。

4、step函数:

传入的参数actions是各标的的权重,按actions归一化为和为1的向量,计算新的投资组合收益率,计算新的组合价值。这里把组合市值作为环境的reward,当然我们还可以计算夏普比,最大回撤等。

代码和数据已经上传至星球,有任何问题请在星球群里讨论。

把backtrader改造成金融强化学习回测引擎

强化学习框架stable-baseline3以及pandas datareader

我的开源项目及知识星球

 

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

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

相关文章

怎么恢复已删除的全部数据,不小心删除的数据怎么恢复,删除的文件还能找回吗

怎么恢复已删除的全部数据?一般来讲,当文件被删除后,都会暂时被放置在回收站的位置,如果我们想找回相应的丢失数据,具体该如何操作呢? 一、当回收站没有被清空 这是最简单的一种恢复误删数据的方法&#…

前端入门--JavaScript篇

JavaScript基础 文章目录JavaScript基础JavaScript是什么JavaScript的使用方式JavaScript的运行过程JS的语法三种语言的注释输入输出JS中的变量JS中基本的数据类型number类型string字符串undefined类型null类型运算符数组数组的创建数组的使用数组新增元素函数对象之前学过了HT…

缓存的设计

文章目录1. 缓存的更新机制1.1 被动更新1.2 主动更新1.2.1 Cache Aside Pattern (更新数据库,再删除缓存)1.2.2 更新数据库,更新缓存1.2.3 先删除缓存,在更新数据库1.3 Read/Write Through Pattern1.4 Write Behind Ca…

【Linux】权限管理

文章目录一、shell 命令以及运行原理二、Linux的用户权限1、权限概念引入2、用户分类3、用户切换4、用户提权三、Linux 权限管理1、文件访问者的角色划分2、文件类型和访问权限a、文件类型(后缀理解 file 指令讲解)b、文件访问权限四、文件访问权限的更改1、chmod 指令(对拥有…

STM32CubeMX串口通讯

串口的简单介绍 RS-232与TTL 根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准。而STM32的串口是TTL电平标准的。如果需要使用到RS-232则需要一个电平转换芯片。 单工通信、半双工通信和全双工通信 讲到串口,我们还需要具备这些基…

嵌入式分享合集113

一、 模拟输入信号的保护电路问题 四种模拟输入信号的保护电路的实现方法。 近由于工作的需要,涉及到了模拟输入信号的保护电路问题。结合以往的工作实践以及网络文献资料的查找。现在就保护电路作一简单的说明。 电源钳位保护 上述电路存在可靠性的问题。如果输…

JavaScript_DOM

JavaScript_DOM 概述 简单说就是用来操作HTML的方法,详情看官方文档。 对于我们只需要会使用下面的这个Element对象就可以了。 获取 Element对象 HTML 中的 Element 对象可以通过 Document 对象获取,而 Document 对象是通过 window 对象获取。 Doc…

焱融科技为国家重点实验室打造海量高性能存储

中国科学院大气物理研究所大气科学和地球流体力学数值模拟国家重点实验室(英文缩写 LASG)是国家级重点实验室。LASG 主要研究方向为地球气候系统模式的研发与应用;天气气候动力学理论、气候系统变化规律及其异常发生机制;天气气候…

排行榜谁最稳?

在 RedMonk 编程语言排行榜中,前端JavaScript 编程语言从2015年开始便稳居榜首,可以说是所有编程语言中最稳定的一个。 01 JavaScript 常年居于榜首原因 JavaScript 编程语言可以常年居于排行榜榜首位置,和它是前端工程师使用的唯一编程语言…

【树莓派】刷机、基础配置及多种方式登录

目录一、树莓派刷机二、树莓派登录1、HDMI线连接显示器登录2、串口方式登录(1)USB-TTL模块连接树莓派串口(2)修改系统配置,启用串口(3)用secureCRT登录树莓派3、网络方式登录(1&…

基于51单片机霍尔传感器测速(仿真+源程序)

资料编号:196 下面是该资料仿真演示视频: 196-基于51单片机霍尔传感器测速(仿真源程序全套资料)功能简介: 51单片机计数测速转速测量,在仿真中等价于测量外部脉冲频率;如果修改输入脉冲的频率&…

前端小白科普:小程序组件与插件有啥区别?怎么用?

一直以为小程序组件和小程序插件是一回事,只是措辞不一样,导致造成乌龙,其实完全是两回事,插件是可以直接提供服务的,组件是给开发者提供的轮子,不能直接提供服务。 先看看微信是如何定义小程序插件的&…

[附源码]计算机毕业设计springboot健身房信息管理

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Flutter 离线数据方案 Flutter_Data 包

Flutter 离线数据方案 Flutter_Data 包 原文 https://levelup.gitconnected.com/flutter-offline-first-with-flutter-data-62bad61097be 前言 通过离线优先来改善您的用户体验 Flutter Data 是一个让你的应用程序先离线的软件包。 离线时,它在设备上使用 Hive 存储…

DirectX12 - Triangle Culling and Winding Order(三角形的剔除与绕序)

这里是SunshineBooming,GPU公司一枚小小的Driver工程师,主要工作是写DirectX12 Driver,我会持续更新这个DX12 Spec系列,可能比较冷门,但是都是干货和工作中的心得体会,有任何GPU相关的问题都可以在评论区互…

Chapter9.2:线性系统的状态空间分析与综合(下)

此系列属于胡寿松《自动控制原理题海与考研指导》(第三版)习题精选,仅包含部分经典习题,需要完整版习题答案请自行查找,本系列属于知识点巩固部分,搭配如下几个系列进行学习,可用于期末考试和考研复习。 自动控制原理(…

GJB 5000B二级-LD领导作用

概要:GJB 5000B将GJB 5000A三级中的LD领导作用划分为二级内容,将组织类目标下沉至二级 借鉴GJB 9001C中的领导作用,结合各个行业优秀的实践,将5000A中的共用目标、实践进行了提炼、总结最终形成GJB 5000B中的领导作用实践域。 目的:进一步强化上层的领导作用,由高层、中层…

DOPE修饰岩藻多糖 Fucoidan-DOPE 岩藻多糖-二油酰基磷脂酰乙醇胺

DOPE修饰岩藻多糖 Fucoidan-DOPE 岩藻多糖-二油酰基磷脂酰乙醇胺 中文名称:岩藻多糖-二油酰基磷脂酰乙醇胺 英文名称:Fucoidan-DOPE 别称:DOPE修饰岩藻多糖,DOPE-岩藻多糖 外观:固体或粘性液体,取决于分子量 PEG分…

天问一号(Tianwen-1)详细介绍

天问一号(Tianwen-1)是中国第二个火星探测项目。2020年4月24日,中国行星探测任务被命名为“天问系列”,火星探测任务被命名为天问一号,后续行星探测任务依次编号。中国首次火星探测任务标识为“揽星九天”。 火星探测任…

基于stm32的智能药盒

提示:记录2022年4月做的毕设 文章目录前言一、任务书1.1设计(研究)目标:1.2设计(研究)内容:二、框架思路三、硬件四、联系我们五、相关功能介绍六、喜欢请点赞哦!前言 基于STM32的智能药盒,主控使用STM32F103(正点原子战舰板子&a…