习
题预览
两位主创最近都有很多事情要做,抽空做一期更新!下面我们继续看题!
22. 每天沪深300指数成分占比最大的10只股票是哪些?
23. 各个行业的平均每日股票数量从大到小排序是什么?
24. 每个行业每天成交额最大的一只股票代码是什么?
25. 每个行业每天最大成交额是最小成交额的几倍?
26. 每个行业每天成交额最大的5只股票和成交额总和是多少?
27. 每个行业每天成交额超过该行业中股票成交额80%分位数的股票的平均收益率是多少?
28. 每天成交额最大的10%的股票的平均收益率和成交额最小的10%的股票的平均收益率的相关系数是多少?
注:关于题目数据的问题可参考R练习50题-第一期!
习
题 22
22. 每天沪深300指数成分占比最大的10只股票是哪些?
data[order(date, -index_w300), .(symbol = symbol[1:10]), by = .(date)
][1:5]
这一题主要考察排序和选择的综合使用。
首先对date和index_w300分别进行升序和降序排列,也即是先将日期升序排列,而后在每一天中将沪深300的各支股票以成分占比降序排列;接下来利用by = .(date),按照日期进行分组,而后用.(symbol = symbol[1:10])选择出成分占比每天排在前十的股票。
23. 各个行业的平均每日股票数量从大到小排序是什么?
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. 每个行业每天成交额最大的一只股票代码是什么?
data[order(-amount), .(symbol = symbol[1]), keyby = .(date, industry)
][1:5]
此题与22题类似,这里不作赘述,感兴趣的水友可以参考22题对此题进行尝试。
25. 每个行业每天最大成交额是最小成交额的几倍?
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只股票和成交额总和是多少?
data[order(date, industry, -amount), .(symbol = symbol[1:5], amount = sum(amount[1:5])),
by = .(date, industry)
][1:5]
本题与25题类似,总体可参考25题进行作答,此处不做赘述。
27. 每个行业每天成交额超过该行业中股票成交额80%分位数的股票的平均收益率是多少?
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 是本题的关键。首先根据date和industry进行分组,而后在分组的.SD中选择每天成交额超过该行业中股票成交额80%分位数的股票:.SD[amount > quantile(amount, 0.8)],这样就将每日每个行业中超过本行业80%分位数的股票选择出来了。
line 3 则是分组计算每日每行业这些股票的平均收益率aver_ret。
28. 每天成交额最大的10%的股票的平均收益率和成交额最小的10%的股票的平均收益率的相关系数是多少?
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语言、数据挖掘以及经济金融学。
我们与大家分享我们的知识和节操,我相信独乐乐不如众乐乐。
我还有许多好玩的计划。
更多的精彩内容正在路上。