习题预览
今天我们继续做题,由于整个题目按照从易到难排列,所以今天的题目并不会很难。先看一下预览:
- 每天每个交易所上涨、下跌的股票各有多少?
- 沪深300成分股中,每天上涨、下跌的股票各有多少?
- 每天每个行业各有多少只股票?
- 每天涨幅超过5%、跌幅超过5%的股票各有多少?
我们已经把所有50题的答案都上传到了我们的Github主页,但是校对及代码解析只写到了第十题。等不及想先睹为快的同学,请猛戳这里:
“
github.com/Ravin515/r-data-practice
”
另外,感谢frankzhangyd同学在Github上提的建议!
习题 3
每天每个交易所上涨、下跌的股票各有多少?
分析:
这题和Ex-2非常类似,唯一的不同就是分组变量多了一个:对于每个交易日,我们不仅需要根据涨跌updown分组,还要根据交易所分组。也即,每个交易日都会产生四个subgroup:SH-DOWN, SH-UP, SZ-DOWN, SZ-UP.
由于股票代码symbol的最后两个字符表示交易所(例如,600123.SH表示上海交易所,股票代码600123),我们在建立分组变量时需要使用str_sub函数截取最后两个字符。
代码及解析:
- 在keyby语句中,我们创建了三个分组变量,首先是日期date,其次是交易所exchange(只取SH/SZ两个值),最后是涨跌updown。注意这三个变量的先后顺序非常重要,不能颠倒。
- 字符串截取函数str_sub来自stringr包。str_sub(symbol, start = -2, end = -1)的意思是截取symbol最后两个字符(注意start/end取了负值)。
练习 4
沪深300成分股中,每天上涨、下跌的股票各有多少?
分析:
本题仍旧是Ex-2的拓展,只不过要求我们进行行选择操作。在data.table的dt[i,j,by]语法中,i代表行选择操作。
为了选出沪深300成分股,我们需要用到index_w300这个变量。index_w300表示一个股票在沪深300指数中的权重,如果大于零,说明它是成分股;如果为零,说明不是成分股。
代码及解析:
- 为了选出沪深300成分股,我们使用了index_w300 > 0这个语句。index_w300是一个数值变量,与零进行比较运算后会生成一列与原向量等长的布尔向量(例如 c(True, False False, True...))。data.table只会选择为True的那些元素。
- 在data.table的dt[i, j, by]语法中,先执行行选择操作i, 再执行分组操作by, 最后执行列操作j。因此上述代码的执行顺序为:先index_w300 > 0,然后keyby, 最后生成num.
练习 5
每天每个行业各有多少只股票?
分析:
仍旧是Ex-2的拓展,而且更为简单。我们只需要按照date和industry进行分组,然后统计每个subgroup的个数即可。
代码及解析:
- 我们生成一个新的变量stk_num用来表示每天每个行业的股票数。
习题 7
每天涨幅超过5%、跌幅超过5%的股票各有多少?
分析:
这一题的关键思路还是Ex-2中的分组。首先,我们自然要对日期分组,然后按照updown进行分组。updown是用户新建的字符变量,只取up5% 和down5% 两个值,一个表示涨幅超过5%,一个表示跌幅超过5%。最后,我们统计每个subgroup的个数
代码及解析:
- 为了方便计算,我们首先在原数据集中新增一个变量ret,表示股票的日收益率。':='(ret = (close - pre_close)/pre_close)即为新建收益率的语句,其定义为今日收盘价减去昨日收盘价,再除以昨日收盘价
- ret > 0.05 | ret < -0.05用来删选出收益率超过5%或小于-5%的观测。注意以上运算的结果是一个取值为True或False的向量,data.table最终会挑选出为True的那些行。
- 我们仍旧使用ifelse函数生成updown这个变量。ifelse(ret > 0.05, "up5% ", "down5% ")的意思是,如果条件(ret > 0.05)成立,那么取值up5% ,否则取值down5% .
下期预告
在下一期,我们会继续带来剩余题目的解答~
大猫的R语言课堂
我是大猫,一个高中读文科但却在代码、数学的路上狂奔不止的Finance Ph. D Candidate。
我是村长,一个玩了9年指弹吉他,却被代码深深吸引的博士候选人。
大猫的微信号是:
iRoss2007
村长的B站主页是:http://space.bilibili.com/40771572
大猫的R语言课堂关注R语言、数据挖掘以及经济金融学。
我们与大家分享我们的知识和节操,我相信独乐乐不如众乐乐。