习
题预览
小编最近实在有很多事情要做,抓住了空档就马上更新了!继续看题!
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语言、数据挖掘以及经济金融学。
我们与大家分享我们的知识和节操,我相信独乐乐不如众乐乐。
我还有许多好玩的计划。
更多的精彩内容正在路上。