前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R练习50题 - 第五期

R练习50题 - 第五期

作者头像
用户7652506
发布2021-01-21 10:11:07
4640
发布2021-01-21 10:11:07
举报
文章被收录于专栏:大猫的R语言课堂

题预览

小编最近实在有很多事情要做,抓住了空档就马上更新了!继续看题!

16. 上证50、沪深300、中证500指数成分股中,沪股和深股各有多少?

17. 上证50、沪深300、中证500指数成分股中,行业分布如何?

18. 每天上证50、沪深300、中证500指数成分股的总成交额各是多少?

19. 上证50、沪深300、中证500指数日收益率的历史波动率是多少?

20. 上证50、沪深300、中证500指数日收益率的相关系数矩阵?

21. 上证50、沪深300、去除上证50的沪深300指数日收益率的相关系数矩阵?

题 16

16. 上证50、沪深300、中证500指数成分股中,沪股和深股各有多少?

代码及解析:

data[, melt(.SD, measure.vars = patterns("index"),

variable.name = "index_name") ][value > 0,

.(stkcd_amount = uniqueN(symbol)),

by = .(index_name, date,

type = ifelse(str_detect(symbol, "SH"),

"SH", "SZ"))]

此题解答上需要感谢frankZhang在村长github主页的提问,提问链接:https://github.com/Ravin515/r-data-practice/issues/1 。这一题的关键在于数据结构的reshape,在这里我们用了melt将一个‘宽’的数据集变成了一个‘长’的数据集;此外还在by中生成了一列标识出股票属于上证还是深证。为了更加直观展示数据reshape之后的形态,我们将代码分成两部分展示。

第一部分

data[, melt(.SD,

measure.vars = patterns("index"),

variable.name = "index_name")

][1:5]

line 1中我们首先使用了melt,而需要进行处理的变量是index_w50、 index_w300和index_w500,我们需要以这三个变量的变量名为观测值,重新生成一个变量index_name,而后这三个变量曾经的观察值生成另外一个变量value。接下来,如果要将这三个变量进行批量处理,则需要用到patterns这个函数,表示挑选出变量名里面含有“index”字段的变量;之后的variable.name = "index_name"表明生成一个名为index_name的变量,value这个变量自动生成。

第二部分

line 2首先选出了那些value > 0的观测行;而后在by中用ifelse以及str_detect生成一个区分沪股和深股的变量type,如果其中包含SH则生成SH, 其他的生成SZ;再以type,date和index_name进行分组,计算每个组中股票的数量stkcd_amount,这里还使用了去重操作uniqueN(注:这里还加入了date这个变量进行分组,是因为三大指数的成分股是滚动变化的)。代码和生成结果如下:

data[, melt(.SD,

measure.vars = patterns("index"),

variable.name = "index_name") ][value > 0,

.(stkcd_amount = uniqueN(symbol)),

by = .(index_name, date,

type = ifelse(str_detect(symbol, "SH"),

"SH", "SZ")) ][1:5]

题 17、18、19

习题17、18、19在基本原理上都用到了16题中的melt,有感兴趣的同学可以自己试着做一做,在这里不再赘述,只附上三道题目的代码和运行结果。

17. 上证50、沪深300、中证500指数成分股中,行业分布如何?

data[, melt(.SD,

measure.vars = patterns("index"),

variable.name = "index_name")

][value > 0,

.(stkcd_amount = uniqueN(symbol)),

by = .(index_name, date, industry)

][1:5]

18. 每天上证50、沪深300、中证500指数成分股的总成交额各是多少?

data[, melt(.SD,

measure.vars = patterns("index"),

variable.name = "index_name") ][value > 0,

.(amount = sum(amount)),

by = .(index_name, date) ][1:5]

19. 上证50、沪深300、中证500指数日收益率的历史波动率是多少?

data[, melt(.SD,

measure.vars = patterns("index"),

variable.name = "index_name")

][, .(index_ret = sum(value * (close/pre_close - 1))),

by = .(date, index_name)

][, .(vol = sd(index_ret)),

by = .(index_name)]

题 20 & 21

习题20&21属于两道类似的题目,在此只讲述一道,另一道可以留作感兴趣同学的练习。

20. 上证50、沪深300、中证500指数日收益率的相关系数矩阵?

data[, .(index_w50_ret =

sum(index_w50 * (close/pre_close - 1)),

index_w300_ret =

sum(index_w300 * (close/pre_close - 1)),

index_w500_ret =

sum(index_w500 * (close/pre_close - 1))),

keyby = date ][, cor(.SD[, -1])]

line 1以日期date分组计算三大指数的日收益率,index*(close/pre_close - 1)

line 2去掉变量日期date,对其余三个变量求相关系数矩阵。

21. 上证50、沪深300、去除上证50的沪深300指数日收益率的相关系数矩阵?

感兴趣的同学可以用此题进行拓展练习,代码和结果如下:

data[, .(index_w50_ret =

sum(index_w50 * (close/pre_close - 1)),

index_w300_ret =

sum(index_w300 * (close/pre_close - 1)),

index_w300_50 =

ifelse(index_w50 == 0 & index_w300 > 0, index_w300, 0),

close = close,

pre_close = pre_close),

keyby = date

][, .(index_w50_ret = unique(index_w50_ret), index_w300_ret = unique(index_w300_ret), index_w300_50_ret =

sum(index_w300_50 * (close/pre_close - 1)) %>% unique()),

keyby = date

][, cor(.SD[, -1])]

大猫的R语言课堂

我是大猫,一个高中读文科但却在代码、数学的路上狂奔不止的Finance Ph. D Candidate。

我是村长,一个玩了12年指弹吉他,却被代码深深吸引的博士候选人。

大猫的微信号是:

iRoss2007

村长的微信号及B站主页是:

ravin515

http://space.bilibili.com/40771572

大猫的R语言课堂关注R语言、数据挖掘以及经济金融学。

我们与大家分享我们的知识和节操,我相信独乐乐不如众乐乐。

我还有许多好玩的计划。

更多的精彩内容正在路上。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大猫的R语言课堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档