当前位置: 首页 > 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中的旧物料。特别是当出现旧…...

蓝桥web基础知识学习

HTMLCSS 知识点重要指数HTML 基础标签🌟🌟🌟🌟🌟HTML5 新特性🌟🌟🌟🌟🌟HTML5 本地存储🌟🌟🌟🌟CSS 基础语法…...

Python+ChatGPT制作一个AI实用百宝箱

目录一、注册OpenAI二、搭建网站及其框架三、AI聊天机器人四、AI绘画机器人ChatGPT 最近在互联网掀起了一阵热潮,其高度智能化的功能能够给我们现实生活带来诸多的便利,可以帮助你写文章、写报告、写周报、做表格、做策划甚至还会写代码。只要与文字相关…...

Python中格式化字符串输出的4种方式

Python格式化字符串的4中方式 一、%号 二、str.format(args) 三、f-Strings 四、标准库模板 五、总结四种方式的应用场景’ 一、%号占位符 这是一种引入最早的一种,也是比较容易理解的一种方式.使用方式为: 1、格式化字符串中变化的部分使用占位符 2、…...

C#基础教程15 枚举与类

文章目录 C# 枚举(Enum)声明 enum 变量C# 类(Class)类的定义成员函数和封装C# 中的构造函数关键字 staticC# 枚举(Enum) 枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。 C# 枚举是值类型。换句话说,枚举包含自己的值,且不能继承或传递继承。 声明 enum 变…...

三步 让你的 vscode 自动编译ts文件

三步让你的 vscode 自动编译ts文件 TypeScript环境安装与如何在vscode实现自动编译ts文件? 文章目录三步让你的 vscode 自动编译ts文件前提条件环境安装自动编译运行监视任务时报错?前提条件 安装 node 环境 环境安装 tsc 作用:负责将ts 代码 转为 浏…...

STM32程序下载和启动方式

目录1 BOOT引脚配置和下载说明2 关于串口下载方式3 关于一按复位就跑代码4 关于下载调试速度5 关于三种启动方式5.1 FLASH启动5.2 系统存储器器启动5.3 SRAM启动6 关于程序的三种下载方式1 BOOT引脚配置和下载说明 BOOT0BOOT1程序运行ST-Link下载串口下载启动说明xx无0x√√用…...

基础01-ajax fetch axios 的区别

ajax fetch axios 的区别 题目 ajax fetch axios 的区别 分析 三者根本没有可比性,不要被题目搞混了。要说出他们的本质 传统 ajax AJAX (几个单词首字母,按规范应该大写) - Asynchronous JavaScript and XML(异…...

Android Execution failed for task ‘:app:mergeDebugJavaResource

错误提示 FAILURE: Build failed with an exception.* What went wrong: Execution failed for task :app:mergeDebugJavaResource. > A failure occurred while executing com.android.build.gradle.internal.tasks.MergeJavaResWorkAction> 2 files found with path k…...

spring事物源码分析

今天的任务是剖析源码,看看Spring 是怎么运行事务的,并且是基于当前最流行的SpringBoot。还有,我们之前剖析Mybatis 的时候,也知道,Mybatis 也有事务,那么,他俩融合之后,事务是交给谁…...

炫龙游戏本Win10系统总是蓝屏崩溃怎么办?

炫龙游戏本Win10系统总是蓝屏崩溃怎么办?有用户使用的炫龙游戏本最近总是在运行的过程中出现自动蓝屏的情况,有的时候自己还在操作电脑,而屏幕却蓝屏了,导致自己的工作被中断了。那么这个情况要怎么去进行修复呢?来看看…...