当前位置: 首页 > news >正文

Python—看我分析下已经退市的 可转债 都有什么特点

分析

需求分析

  • 可转债退市原因的种类与占比是多少

  • 强赎非强赎导致的退市可转债 存续时间 维度占比

  • 强赎非强赎导致的退市可转债 发行资金 规模占比

  • 强赎非强赎导致的退市可转债 各个评级 的占比

  • 强赎非强赎导致的退市可转债 各个行业(一级行业) 的占比

程序环境分析

  • 需要依赖的三方代码库:  

    • requests(处理http请求)

    • pyecharts(图表显示)

    • pandas(数据表处理)

    • BeautifulSoup(html文件解析)

  • 抓取数据的网站

    • 集思录(www.jisilu.cn/)

程序逻辑分析

  • 通过 http请求 抓取已退市可转债的列表

  • 获取列表中的每个转债代码,通过 http请求 访问转债详情页面,通过BeautifulSoup库提供的方法 获取到债券评级与行业

  • 获取列表中的(转债代码、转债名称、发行规模、存续年限、退市原因、债券评级、行业)字段,存入到csv文件中

    • 存入到csv文件是因为后面要做各个维度的数据分析,如果不存到文件中,后面数据分析中一但出现一点错误,就又得重新去网站抓取数据,比较麻烦

  • 读取csv文件中的数据,用pandas转成表格,按退市原因分组计数,用pyecharts做成饼图展示

  • 读取csv文件中的数据,用pandas转成表格,按强赎与非强赎中的存续时间分组计数,用pyecharts做成饼图

  • 读取csv文件中的数据,用pandas转成表格,按强赎与非强赎中的发行资金规模分组计数(从大到小排序,取前15),用pyecharts做成柱形图

  • 读取csv文件中的数据,用pandas转成表格,按强赎与非强赎中的债券评级分组计数,用pyecharts做成饼图

  • 读取csv文件中的数据,用pandas转成表格,按强赎与非强赎中的债券行业分组计数,用pyecharts做成柱状图

实现代码

编写http请求方法

import pandas as pd
from bs4 import BeautifulSoup
from pyecharts.charts import Bar, Pie
from pyecharts import options as optsdef get_request(url):# 设置请求头,防止部分网站对请求头做拦截 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"}try:resp = requests.get(url, headers=headers)resp.encoding="utf-8"if resp.status_code == 200:return resp.textexcept Exception as e:print("http请求出错:",e)return None
 

爬取债券详情页,取 债券评级与行业 (列表页面中没有这两个)

def assemble_grade(resp):resp_json=json.loads(resp)datas=resp_json["rows"]if datas is None:return NonedataList=[]for data in datas:# 转债代码、转债名称、发行规模、存续年限、退市原因、债券评级bond_id=data["cell"]["bond_id"]bond_nm=data["cell"]["bond_nm"]orig_iss_amt=data["cell"]["orig_iss_amt"]listed_years=data["cell"]["listed_years"]delist_notes=data["cell"]["delist_notes"]#获取详情grade,indusity=parse_html("https://www.jisilu.cn/data/convert_bond_detail/%s" %bond_id)print("当前可转债是:%s,评级是:%s,行业是:%s" %(bond_nm,grade,indusity))dataList.append(",".join([bond_id,bond_nm,orig_iss_amt,listed_years,delist_notes,grade,indusity]))#防止访问过快,网站拦截,睡5秒time.sleep(2)return dataList
 

将抓取的数据存入csv文件中

def write_csv(data):if not data:print("当前要写入的数据为空")with open("bonds.csv", "w", encoding="utf-8") as f:f.write("\n".join(data))
 

读取csv文件的数据,用做分析

'''
type 1全部  2强赎  3非强赎
'''
def read_csv(type):dataList=[]with open("bonds.csv", "r", encoding="utf-8") as f:lines=f.readlines()for line in lines:line=line.replace("\\n","")data=line.split(",")# 排除可交换债if data[1].endswith("EB"):continueindustry=data[6].split("-")[0]year=assemble_year(data[3])if type==1:dataList.append([data[2], year, data[4],data[5],industry])elif type==2:if data[4]=="强赎":dataList.append([data[2], year, data[4],data[5],industry])elif type==3:if data[4] != "强赎":dataList.append([data[2],year,data[4],data[5],industry])return dataList
 

按退市原因进行分析,生成饼图

def craete_notes_pie(pf):data = pf.groupby(by=["delist_notes"]).size()notesList=list(data.index)notesCount=list(data)c=(Pie().add("",[list(z) for z in zip(notesList,notesCount)]).set_global_opts(title_opts=opts.TitleOpts(title="退市原因统计")).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c}个  ,占比:{d}%")).render("notes.html"))

按强赎与非强赎中的存续时间分组计数,用pyecharts做成饼图

def craete_years_pie(pf,name,title):data = pf.groupby(by=["listed_years"]).size()notesList = list(data.index)notesCount = list(data)c = (Pie().add("", [list(z) for z in zip(notesList, notesCount)]).set_global_opts(title_opts=opts.TitleOpts(title=title),legend_opts=opts.LegendOpts(pos_left="20%")).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c}个  ,占比:{d}%")).render(name))
 

强赎与非强赎中的发行资金规模分组计数(从大到小排序,取前15),用pyecharts做成柱形图

def craete_amt_bar(pf,name,title):data = pf.groupby(by=["orig_iss_amt"]).size().reset_index(name="size").sort_values("size",ascending=False).head(15)print(data)notesList=list(data["orig_iss_amt"])notesCount=list(data["size"])c=(Bar().add_xaxis(notesList).add_yaxis("发行规模",notesCount).set_global_opts(title_opts=opts.TitleOpts(title=title),xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-20))).render(name))
 

按强赎与非强赎中的债券评级分组计数,用pyecharts做成饼图

def craete_grade_pie(pf,name,title):data = pf.groupby(by=["grade"]).size()notesList=list(data.index)notesCount=list(data)c=(Pie().add("",[list(z) for z in zip(notesList,notesCount)]).set_global_opts(title_opts=opts.TitleOpts(title=title)).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c}个  ,占比:{d}%")).render(name))
 

按强赎与非强赎中的债券行业分组计数,用pyecharts做成柱状图

def craete_industry_bar(pf,name,title):# 按行业分组,排序,取前30位data = pf.groupby(by=["industry"]).size().reset_index(name="size").sort_values("size",ascending=False).head(30)print(data)notesList=list(data["industry"])notesCount=list(data["size"])c=(Bar().add_xaxis(notesList).add_yaxis("行业",notesCount).set_global_opts(title_opts=opts.TitleOpts(title=title),xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))).render(name))
 

最终调用 主方法

def main():#生成动太时间戳rTime=str(round(time.time()*1000))#获取退市可转债列表resp=get_request("https://www.jisilu.cn/data/cbnew/delisted/?___jsl=LST___t="+rTime)#组装每个可转债的评级dataList=assemble_grade(resp)#将数据写入csvwrite_csv(dataList)#读取csv文件中的数据,并制成表格(发行规模,存续时间,退市原因)dfData = read_csv(1)pf = pd.DataFrame(dfData, columns=["orig_iss_amt", "listed_years", "delist_notes", "grade", "industry"])dfData=read_csv(2)pf2=pd.DataFrame(dfData, columns=["orig_iss_amt", "listed_years", "delist_notes","grade","industry"])dfData = read_csv(3)pf3 = pd.DataFrame(dfData, columns=["orig_iss_amt", "listed_years", "delist_notes", "grade","industry"])#按退市原因分组计数,用pyecharts做成饼图craete_notes_pie(pf)#存续时间维度占比craete_years_pie(pf2,"qs_years.html","强赎存续年限统计")craete_years_pie(pf3,"years.html","非强赎存续年限统计")# 强赎与非强赎发行资金规模占比craete_amt_bar(pf2,"qs_amt.html","强赎发行规模统计")craete_amt_bar(pf3, "amt.html","非强赎发行规模统计")# 强赎与非强赎各个评级的占比craete_grade_pie(pf,"qs_grade.html","强赎评级统计")craete_grade_pie(pf, "grade.html", "非强赎评级统计")# 强赎与非强赎行业占比craete_industry_bar(pf2,"qs_industry.html","强赎行业统计")craete_industry_bar(pf3, "industry.html", "非强赎行业统计")if __name__ == '__main__':main()
 

结果展示图

退市原因分析:总135个已退市可转债中,127个都是 强赎导致的,占比是94.08%;8个是因为到期或者资产不足导致,占比5.92%

存续时间分析:

强赎的可转债中,按存续时间分析,1年以内被强赎的最多,有53个,占比 41.73%,其次是 大于1年,小于等于2年的,有46个,占比 36.22%, 其次是 大于2年,小于等于3年的,有 14个,占比11.02% ....    ,从分析结果中可得知 可转债发行后,短时间内被赎回的概率比较大存续时间越长,赎回概率则越小

发行规模分析:

强赎的可转债中,按资金规模划分 发行10亿的有6个,4.2亿的3个,25亿的3个...

按债券评级分析:

强赎的可转债中,按评级划分 占比最多的是AA级,有61个,占比 45.18%,其次是 AA+ 有25个,占比18.52, 第三是 AAA有22个,占比16.3%...   

总结:最好买AA- 级或以上的,被强赎的概率最高

按债券行业分析:

强赎的可转债中,按一级行业划分,取排名靠前的30个,占比最多的是 电子行业,其次是医药生物、化工、机械设备

总结:

  • 岂今为止,在已退市的可转债中,94%以上都是被强赎的

  • 可转债发行后,1年以内被强赎的概率最高,存续时间越往后,则概率越低

  • 从债券评级上看,AA- 或以上,被强赎的概率最高,AAA级债券暂还没出现被回售的

  • 从行业上看,电气、医药生物、化工、机械设备、电气设备等都是被强赎比较高的行业

注:此历史数据只供参考,具体投资还需要独立思考,且近两年,可转债的发行数量增加很多,质量更是参差不齐,选择时还需要谨慎。 如果能抱着持有到期的心态,买上价格在100以内AA级及以上的债券,相信亏本的可能性及小,且收益不会太差,此乃保守投资者投资的一种方式

程序猿与投资生活实录已改名为  程序猿知秋,WX同款,欢迎关注!   

相关文章:

Python—看我分析下已经退市的 可转债 都有什么特点

分析 需求分析 可转债退市原因的种类与占比是多少 强赎与非强赎导致的退市可转债 存续时间 维度占比 强赎与非强赎导致的退市可转债 发行资金 规模占比 强赎与非强赎导致的退市可转债 各个评级 的占比 强赎与非强赎导致的退市可转债 各个行业(一级行业&#xf…...

【第八课】空间数据基础与处理——数据结构转化

一、前言 数据结构即指数据组织的形式,是适合于计算机存储、管理和处理的数据逻辑结构。对空间数据则是地理实体的空间排列方式和相互关系的抽象描述。它是对数据的一种理解和解释,不说明数据结构的数据是毫无用处的,不仅用户无法理解,计算机程序也不能正确地处理,对同样一组数…...

MATLAB绘制三Y轴坐标图:补充坐标轴及字体设置

三轴坐标图 1 函数 MATLAB绘制三轴图函数可见MATLAB帮助-multiplotyyy 基础图形绘制是很简单,但坐标轴及字体设置该如何实现呢? 本文以以下几个例子为例,希望可以解决在利用MATLAB绘制三轴坐标图时常见的疑惑。 2 案例 2.1 案例1&#xf…...

springboot项目中Quartz

下面内容大家可在自己创建的 springboot项目中 玩1 定时清理垃圾图片定时任务组件Quartz,可以根据我们设定的周期,定时执行目标任务计划1.1 Quartz介绍(了解)Quartz是Job scheduling(作业调度)领域的一个开源项目&…...

Presto本地开发,plugin的设置

1. 新的问题 之前搭建Presto的本地开发环境时,一直使用config.properties中的plugin.bundles配置项定义需要加载的plugin模块,详细可以参考博客《win10基于IDEA,搭建Presto开发环境》presto服务启动时,指定加载哪些组件&#xff…...

2023年3月西安/杭州/深圳/东莞NPDP产品经理认证考试报名

产品经理国际资格认证NPDP是国际公认的唯一的新产品开发专业认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年…...

Vue3笔记01 创建项目,Composition API,新组件,其他

Vue3 创建Vue3项目 vue-cli //查看vue/cli版本,确保在4.5.0以上 vue --version //安装或升级vue/cli npm install -g vue/cli //创建项目 vue create new_project //启动 cd new_project npm run serve 也可以通过vue ui进入图形化界面进行创建 vite 新一代前端…...

pandas数据分析(二)

文章目录DataFrame数据处理与分析读取Excel文件中的数据筛选符合特定条件的数据查看数据特征和统计信息按不同标准对数据排序使用分组与聚合对员工业绩进行汇总DataFrame数据处理与分析 部分数据如下 这个数据百度可以搜到,就是下面这个 读取Excel文件中的数据 …...

Spring实现[拦截器+统一异常处理+统一数据返回]

Spring拦截器 1.实现一个普通拦截器 关键步骤 实现 HandlerInterceptor 接口重写 preHeadler 方法,在方法中编写自己的业务代码 Component public class LoginInterceptor implements HandlerInterceptor {/*** 此方法返回一个 boolean,如果为 true …...

MySQL——插入加锁/唯一索引插入死锁/批量插入效率

本篇主要介绍MySQL跟加锁相关的一些概念、MySQL执行插入Insert时的加锁过程、唯一索引下批量插入可能导致的死锁情况,以及分别从业务角度和MySQL配置角度介绍提升批量插入的效率的方法;MySQL跟加锁相关的一些概念在介绍MySQL执行插入的加锁过程之前&…...

【专项训练】数组、链表

数组array: list = []链表linked list # Definition for singly-linked list. class ListNode:def __init__(self, x):self.val = xself.next =...

基于Jeecgboot前后端分离的ERP系统开发代码生成(六)

商品信息原先生成的不符合要求,重新生成,包括一个附表商品价格信息表 一、采用TAB主题一对多的模式 因为主键,在online表单配置是灰的,所以不能进行外键管理,只能通过下面数据库进行关联录入,否则online界面…...

什么?同步代码块失效了?-- 自定义类加载器引起的问题

一、背景 最近编码过程中遇到了一个非常奇怪的问题,基于单例对象的同步代码块似乎失效了,百思不得其姐。 下面给出模拟过程和最终的结论。 二、场景描述和模拟 2.1 现象描述 Database实现单例,在 init 方法中使用同步代码块来保证 data不…...

CHAPTER 4 文件共享 - Samba

文件共享 - Samba1 Samba1.1 Samba的软件架构1.2 搭建Samba服务器1.3 samba用户管理1. 添加用户2. 修改用户密码3. 删除用户和密码4. 查看samba用户列表5. 查看samba服务器状态1.4 samba共享设置(配置文件详解)1.5 访问共享目录1. windows访问2. linux客…...

深入分析@Configuration源码

文章目录一、源码时序图1. 注册ConfigurationClassPostProcessor流程源码时序图2. 注册ConfigurationAnnotationConfig流程源码时序图3. 实例化流程源码时序图二、源码解析1. 注册ConfigurationClassPostProcessor流程源码解析(1)运行案例程序启动类Conf…...

Unity 代码优化 内存管理优化

项目遇到了卡顿的情况 仔细检查了代码没检查出有误的地方 仔细的总结了一下可以优化的东西 解决了卡顿 记录一下 1 协程 项目之前写的关于倒计时之类的东西 都是开了个协程 虽然协程是消耗很小的线程 , 可是还是有额外消耗 而且 有很多用携程来检测销毁预制体的操作 也都放到U…...

设计模式~门面(外观)模式(Facade)-08

目录 (1)优点 (2)缺点 (3)使用场景 (4)注意事项: (5)应用实例: (6)源码中的经典应用 代码 外观模式&am…...

C++面向对象编程之一:封装

C面向对象编程三大特性为:封装,继承,多态。C认为万事万物皆为对象,对象有属性和行为。比如:游戏里的地图场景可以看作是长方形对象,属性场景id,有长,有宽,可能有NPC&…...

IDEA插件系列(3):Maven Helper插件

一、引言在写Java代码的时候,我们可能会出现Jar包的冲突的问题,这时候就需要我们去解决依赖冲突了,而解决依赖冲突就需要先找到是那些依赖发生了冲突,当项目比较小的时候,还比较依靠IEDA的【Diagrams】查看依赖关系&am…...

SAP 更改物料基本计量单位

前言部分 在SAP中物料创建后,一旦发生业务,其基本计量单位便很难修改。由于单位无法满足业务要求,往往会要求新建一个物料替代旧物料。这时候除了要将旧物料上所有的未清业务删除外,还需要替换工艺与BOM中的旧物料。特别是当出现旧…...

golang循环变量捕获问题​​

在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下: 问题背景 看这个代码片段: fo…...

【JavaEE】-- HTTP

1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...