Statistics: Mid-term Review
我国债券历史成交日度数据(20190121-20190628)
问题背景:
从2014年出现第一只公募债券违约,到现在2021年,高收益债市场经历了明显的扩容。2014年以后,零星出现一些弱资质企业和中小企业集合债违约,当时违约主要集中在抗风险能力比较差的企业。2017-2018年,出现一波民营产业类企业违约潮,并伴随股权质押爆仓,民间借贷也出现了风险。2018年之后,市场中出现了一批所谓的“假国企”违约,比如华阳经贸、中城建、北大方正等等,市场赋予这类企业一定信仰,但企业内部的公司治理和商业经营层面存在问题。再后来,2020年底弱资质大型国企违约,2021年又蔓延到了恒大这种超大型房地产企业,到后来多个大型房企进入违约潮,高收益债市场迅速扩容。
在高收益债市场迅速扩容,标的不断增加的契机下,高收益债也出现了较好的投资机会,如何对高收益债市场成交数据进行日度、周度或月度的监控,深挖投资机会,也显得尤其重要。
数据描述:
债券简称(name),成交价格(price),年化到期收益率%(yield),估值(val),估值和收益率的偏离%(diff),成交量(volume),交易日期(trddate),代码(code),发行人(issuer),中介成交收益(brokeryield),中介成交日期(brokerdate)。
注:代码以SH和SZ结尾的,成交量单位是“万”, 以IB结尾的,成交量单位是“亿”。
数据集分享链接:https://pan.baidu.com/s/1-NcO5s9yhs9pjdQaUr1mPA,提取码qf55。
---
title: "Mid-term Review"
author: "leon"
date: "2022-10-28"
output: html_document
---
path = "C:/Users/胡图图/Desktop/为了宝子/统计学/ibex_example/IBEX_example/"
filenames = list.files(path, pattern="*.csv", full.names=FALSE) # These functions produce a character vector of the names of files or directories in the named directory.
n = length(filenames)
tmp = read.csv(header = T, paste0(path,filenames[1]), fileEncoding="GBK")
num_feature = rep(0, n)
for(i in 1:n){tmp = read.csv(header = T, paste0(path,filenames[i]), fileEncoding="GBK")# print(colnames(tmp))num_feature[i] = length(colnames(tmp))
} #如果不是UTF-8的格式,可以用write.csv来重新读写table(num_feature)
which(num_feature==11)
colnames(tmp)
colnames(read.csv(header = T, paste0(path,filenames[35]), fileEncoding="GBK"))data0 = NULL
for(i in 1:n){tmp = read.csv(header = T, paste0(path, filenames[i]), fileEncoding = "GBK")date0 = substring(filenames[i], 5, 12) #注意到各个数据表中的trddate有的带有具体时间有的不带,又注意到各个数据表的命名规律,因此为了统一,可以用substring函数取出数据表的名字的第5~12位,并以之代替表中的日期data0 = rbind(data0, data.frame(name = tmp$name, price = tmp$price,yield = tmp$yield, val = tmp$val,diff = tmp$diff, volume = tmp$volume,trddate = date0, code = tmp$code))print(i)# 方便了解电脑进行到了第几步
}
class(data0); dim(data0)
利用substring函数替换trddate中不规则的日期,利用rbind函数提取、合并想要的数据并得到需要的数据框后的部分结果如下所示:
name | price | yield | val | diff | volume | trddate | code |
国开1704 | 101.20850 | 2.865500 | 2.8170 | 4.850000e+00 | 3305.8735 | 20190121 | 108602.SZ |
国开1804 | 100.50000 | 2.120800 | 2.4416 | -3.208000e+01 | 83.616 | 20190121 | 108603.SZ |
农发1801 | 100.30000 | 2.390100 | 2.5990 | -2.089000e+01 | 22.8684 | 20190121 | 108901.SZ |
14长证债 | 100.78140 | 3.846600 | 3.2556 | 5.910000e+01 | 7.0547 | 20190121 | 112232.SZ |
15西部02 | 101.00000 | 3.948600 | 3.5168 | 4.318000e+01 | 10.1 | 20190121 | 112283.SZ |
11陕气债 | 101.30000 | 3.407900 | 3.2540 | 1.539000e+01 | 30.39 | 20190121 | 112034.SZ |
##数据特征概览
#缺失值
sum(is.na(data0))
sum(apply(is.na(data0), 1, sum)!=0) #有多少行是缺失的?;apply函数中的"1"指对行运用,"!="是不等
data1 = data0[which(apply(is.na(data0), 1, sum)==0),] #","在右边,则把每一行取出来;“=”是赋值,"=="是相等
#异常值
attach(data1)
hist(price); length(price[which(price>120)]); min(price)
hist(val); min(val); sum(val>100); quantile(val,0.99); hist(val[which(val>100)])
hist(price)的结果如图所示:
hist(val)的结果如图所示:
由于数据过于集中,因此在利用quantile函数查看val列所对应的数据的分位数后,尝试hist(val[which(val>100)]),结果如图所示:
volume0 = as.numeric(volume)
which(is.na(volume0))
data1$volume[which(is.na(volume0))]
ind = which(is.na(volume0))
data2 = data1[,-6]
data2$volume = volume0
data2 = data2[-ind,]
detach(data1)
为了处理缺失的数据,此处简单粗暴地删掉了所有缺失数据的行。
##进一步区分市场
market = NAfor(i in 1:nrow(data2)){nc = nchar(data2$code[i])market[i] = substring(data2$code[i], nc-1, nc)
}table(market)data2$market = market#单位转换(SH/SZ万,IB亿)
data3 = data2
data3$volume[data2$market=="IB"] = data2$volume[data2$market=="IB"]*10000
#比较市场间差异
layout(matrix(c(1,2,3), nrow=1, ncol=3, byrow=TRUE), heights=1)
hist(data3$volume[data2$market=="IB"], main = "Histogram_1", xlab= "IB volume")
hist(data3$volume[data2$market=="SH"], main = "Histogram_2", xlab= "SH volume")
hist(data3$volume[data2$market=="SZ"], main = "Histogram_3", xlab= "SZ volume")
效果图如下:
由于数据右偏极其明显,考虑采用对数变换:
quantile(data3$volume[data2$market=="IB"])
quantile(data3$volume[data2$market=="SH"])
quantile(data3$volume[data2$market=="SZ"])hist(log(data3$volume[data2$market=="IB"]), main = "Logtransformed_1", xlab= "IB volume")
hist(log(data3$volume[data2$market=="SH"]), main = "Logtransformed_2", xlab= "SH volume")
hist(log(data3$volume[data2$market=="SZ"]), main = "Logtransformed_3", xlab= "SZ volume") #高度右偏的变量可以用log变换
效果图如下:
除了用条形图,还可以用箱线图来实现数据可视化:
layout(matrix(c(1,2), nrow=1, ncol=2, byrow=TRUE), heights=1)
boxplot(data3$volume~data3$market)
boxplot(log(data3$volume)~data3$market)
效果图如下:
可以认为SH market 和SZ market的均值相当吗?
t.test((data3$volume[data2$market=="SH"]),(data3$volume[data2$market=="SZ"]))t.test(log(data3$volume[data2$market=="SH"]),log(data3$volume[data2$market=="SZ"]))
寻找新兴高收益主体:
#对于每日的成交数据,及时发现新出现的高收益债券
date4 = unique(data3$trddate)
max(date4)data_current = data3[data3$trddate!="20190628",]
data_new = data3[data3$trddate=="20190628",]#定义高收益
high_yield = 50
high_yield_bond = unique(data_current$name[data_current$yield > high_yield]) #由于关心的是某一个债券到底是不是高收益,所以外套一个unique函数:unique returns a vector, data frame or array like x but with duplicate elements/rows removed.
new_high_yield_bond = unique(data_new$name[data_new$yield > high_yield])#找到新的高收益主体
setdiff(new_high_yield_bond, high_yield_bond)new_b = "13永利债"
for(i in 1:length(high_yield_bond)){if(high_yield_bound[i]==new_b){print(i)
}
} #循环函数for嵌套条件函数if,检验13永利债是否真的为“新的”高收益主体
最后的循环函数没有输出结果,或输出结果为NULL,证明“13永利债”就是我们要找的新兴高收益主体。
就这样通过一顿“猛如虎”的操作,我们复习了《统计学——基于R(第4版)》的第1章~第6章。
Statistics: Mid-term Review相关推荐
- RDC Lent ifm IP Analysis Exercise
RDC Lent ifm IP Analysis Exercise 文章目录 RDC Lent ifm IP Analysis Exercise Team Intro Introduction to ...
- 【详细解析】1080 MOOC期终成绩 (25分)_45行代码AC
立志用更少的代码做更高效的表达 PAT乙级最优题解-->传送门 对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想 ...
- 1080 MOOC期终成绩 (25 分)
对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想要获得一张合格证书,必须首先获得不少于200分的在线编程作业分,然后总 ...
- 信息系统状态过程图_过程状态图中使用的重要术语| 操作系统
信息系统状态过程图 1)上下文切换 (1) Context Switching) Whenever a process is transferred within the system, it mov ...
- 信息系统状态过程图_操作系统中的增强型过程状态图
信息系统状态过程图 The enhanced process state diagram was introduced for maintaining the degree of multiprogr ...
- PAT (Basic Level) Practice (中文)答案合集
准备复试专用,目标刷完全部中文题! 1001 害死人不偿命的(3n+1)猜想 (15 分) 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 ...
- 【PAT乙】1080 MOOC期终成绩 (25分)
problem 1080 MOOC期终成绩 (25分) 对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想要获得一张合格 ...
- python3实现PAT乙级算法题库全集
最近在学python,我把一些代码贴到这里,不定期更新,欢迎交流.因为有些算法有时间和空间要求,建议找个oj平台跑一遍. 现在在用的算法平台链接:https://pintia.cn/ 文章目录 1. ...
- PAT乙级【1051~1095】
1051 复数乘法 (15分) 复数可以写成 (A+Bi) 的常规形式,其中 A 是实部,B 是虚部,i 是虚数单位,满足 i2=−1:也可以写成极坐标下的指数形式 (R×e(Pi)),其中 R 是复 ...
- 1080MOOC期中成绩
1080 MOOC期终成绩(25 分) 对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想要获得一张合格证书,必须首先获 ...
最新文章
- spring中间scope详细解释
- opencv2中访问像素的简单方法-自定义一个宏CV_MAT_ELEM2
- Ugly Pairs
- 精通Android自定义View(十一)绘制篇Canvas分析之裁剪
- debian解决中文乱码,安装chinese font
- 【笔记】mac os命令行编译objective-c
- JavaScript学习指南 修订版pdf
- DFT频谱泄漏的数学分析及不产生泄漏的条件
- Shapley值法介绍及实例计算
- 做视频直播时如何测试本地网络的上行带宽(网速测试)
- Python——数字排列组合
- matlab需要多大运存_MATLAB下高效使用内存
- 表单上下间隔怎么设置php,html中怎么设置每行文字的间隔
- js将数字转换为汉字
- iOS 闪光的按钮,流光动画,iPhone经典滑动解锁动画
- 数学与计算机科学研究生大学排名,计算数学专业考研院校排名
- python二手房价格预测_分析香港2万6千套在售二手房数据,1000万的居然有那么多...
- 苹果、微软合作推新版iCloud for Windows app
- 炸弹人游戏开发系列(8):放炸弹
- EI检索期刊JA检索与CA检索有什么区别?