R练习50题 - 第六期

2021-04-26 11:17:22 浏览数 (1)

题预览

两位主创最近都有很多事情要做,抽空做一期更新!下面我们继续看题!

22. 每天沪深300指数成分占比最大的10只股票是哪些?

23. 各个行业的平均每日股票数量从大到小排序是什么?

24. 每个行业每天成交额最大的一只股票代码是什么?

25. 每个行业每天最大成交额是最小成交额的几倍?

26. 每个行业每天成交额最大的5只股票和成交额总和是多少?

27. 每个行业每天成交额超过该行业中股票成交额80%分位数的股票的平均收益率是多少?

28. 每天成交额最大的10%的股票的平均收益率和成交额最小的10%的股票的平均收益率的相关系数是多少?

注:关于题目数据的问题可参考R练习50题-第一期!

题 22

22. 每天沪深300指数成分占比最大的10只股票是哪些?

代码语言:javascript复制
data[order(date, -index_w300), .(symbol = symbol[1:10]), by = .(date)
    ][1:5]

这一题主要考察排序和选择的综合使用。

首先对dateindex_w300分别进行升序和降序排列,也即是先将日期升序排列,而后在每一天中将沪深300的各支股票以成分占比降序排列;接下来利用by = .(date),按照日期进行分组,而后用.(symbol = symbol[1:10])选择出成分占比每天排在前十的股票。

23. 各个行业的平均每日股票数量从大到小排序是什么?

代码语言:javascript复制
data[, .(stkcd_amount = uniqueN(symbol)), keyby = .(date, industry)
    ][, .(stkcd_mean = mean(stkcd_amount)), by = .(industry)
    ][order(-stkcd_mean)
    ][1:5]

本题主要在于理解题意,并利用排序和分组计算。

首先理解题意:计算观测时间内每个行业每天股票的数量,求每个行业股票数量的均值,而后按从大到小排序。

line 1 利用分组计算出了每个行业每天的股票数量stkcd_amount,line 2 以行业industry进行分组计算每个行业的股票数量的均值,line 3则依据stkcd_mean进行降序排列。

24. 每个行业每天成交额最大的一只股票代码是什么?

代码语言:javascript复制
data[order(-amount), .(symbol = symbol[1]), keyby = .(date, industry)
    ][1:5]

此题与22题类似,这里不作赘述,感兴趣的水友可以参考22题对此题进行尝试。

25. 每个行业每天最大成交额是最小成交额的几倍?

代码语言:javascript复制
data[order(date, industry, -amount)
    ][amount > 0, .(times = amount[1]/amount[.N]), by = .(date, industry)
    ][1:5]

本题的重点在于理解题意,并进行排序后的分组计算。

本题根据24题题意,推测本题含义应是:行业每天最大成交额的股票是最小成交股票的几倍。

首先依据日期date、行业industry和成交额amount分别进行升序,升序和降序排列,并且删除所有成交额amount等于0的观测。

接下来以日期date和行业industry进行分组,最后在每组中以amount最大值除以amount最小值times = amount[1]/amount[.N]

注:在此处有一个data.table的小技巧,i中的排序和选择的操作的在代码中分成了两步,这是因为这两个部分不能够以order(date, industry, -amount) & amount > 0形式书写,这样书写其中的排序部分会失效。换句话说一个i中只能存在排序和选择两个功能其中的一个!!!

26. 每个行业每天成交额最大的5只股票和成交额总和是多少?

代码语言:javascript复制
data[order(date, industry, -amount), .(symbol = symbol[1:5], amount = sum(amount[1:5])),
     by = .(date, industry)
    ][1:5]

本题与25题类似,总体可参考25题进行作答,此处不做赘述。

27. 每个行业每天成交额超过该行业中股票成交额80%分位数的股票的平均收益率是多少?

代码语言:javascript复制
data[, .(symbol = symbol, ret = close/pre_close - 1, amount = amount, industry, date)
    ][, .SD[amount > quantile(amount, 0.8)], by = .(date, industry)
    ][, .(aver_ret = mean(ret)), by = .(date, industry)
    ][1:5]

这一题的关键在于运用了分组以后的.SD选择,这是一个data.table包的常用技巧。

line 1 计算了个股每日的收益率ret,再将其余需要的变量挑选出来。

line 2 是本题的关键。首先根据dateindustry进行分组,而后在分组的.SD中选择每天成交额超过该行业中股票成交额80%分位数的股票:.SD[amount > quantile(amount, 0.8)],这样就将每日每个行业中超过本行业80%分位数的股票选择出来了。

line 3 则是分组计算每日每行业这些股票的平均收益率aver_ret

28. 每天成交额最大的10%的股票的平均收益率和成交额最小的10%的股票的平均收益率的相关系数是多少?

代码语言:javascript复制
data[, .(symbol = symbol, ret = close/pre_close - 1, amount = amount, date)
    ][, .(tag = ifelse(amount > quantile(amount, 0.9), "max10%", ifelse(amount < quantile(amount, 0.1), "min10%", "others")), ret), by = .(date)
    ][, .(ret_aver = mean(ret)), by = .(date, tag)
    ][tag != "others", dcast(.SD, date ~ tag, value.var = "ret_aver")
    ][, cor(`max10%`, `min10%`)]

这一题主要运用了dcast一个‘长’的表变成一个‘宽’的表,还有关于R中变量名引用问题

line 1 与前一题类似计算出个股收益率ret,而后挑选出需要的变量。

line 2 生成一个变量tag,首先以日期date进行分组,而后以quantile(amount, 0.9)quantile(amount, 0.1)为两个标识,生成三个观测值max10%min10%others

line 3 接下来根据日期date和标识tag,计算三个分组在每日的平均收益率ret_aver

line 4 在删除tag = "other"的这些观测之后,用dcast将表进行变形,把观测值max10%min10%变成两个变量名,而后在这两个变量名下填充ret_aver的观测值:dcast(.SD, date ~ tag, value.var = "ret_aver"

line 5 计算max10%min10%这两个变量的相关系数。因为在变量名中出现的%,会在函数中自动识别为函数%,如果需要讲变量名进行引用,则需要运用引用符号``这个函数。

注:此处作者在进行解答时,特意应用了max10%min10%两个变量名,仅为了说明``的用法,大家在一般编写过程中则需尽量避免变量名与函数的混用!!

大猫的R语言课堂

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

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

大猫的微信号是:

iRoss2007

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

ravin515

http://space.bilibili.com/40771572

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

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

我还有许多好玩的计划。

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

0 人点赞