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

R练习50题 - 第九期

作者头像
用户7652506
发布2021-07-23 16:41:20
3100
发布2021-07-23 16:41:20
举报
文章被收录于专栏:大猫的R语言课堂

题 40

40. 每天分别有多少股票是最新5个交易日中至少有4个交易日的收益率超过当天市场平均收益率?

代码语言:javascript
复制
data[, .(stkcd_ret = close/pre_close - 1, mkt_weight = capt/sum(capt), symbol), keyby = .(date)
    ][, .(mkt_ret = sum(stkcd_ret * mkt_weight), symbol, stkcd_ret), keyby = .(date)
    ][, .(rday_ret = ifelse(stkcd_ret > mkt_ret, 1, 0)), keyby = .(symbol, date)
    ][, {
        l <- list()
        for (t in 1:.N) {
            l[[t+5]] <- list(r3day_ret = mean(rday_ret[t:(t+4)]), date = date[t+5])
        }
        rbindlist(l)
    }, keyby = symbol
    ][r3day_ret > 0.8 & !is.na(date), .(stkcd_amount = uniqueN(symbol)), keyby = date
    ][1:5]

与Ex-39思路基本一致,可完全参考Ex-39,在此不作赘述。感兴趣的同学可作为上一期的复习,自己尝试编写,具体可参考R练习50题-第八期的第39题!

题 41

41. 每个月中,个股月收益超过市场月收益1倍以上的股票有哪些?

代码语言:javascript
复制
data[, .(stkcd_ret = close/pre_close - 1, mkt_weight = capt/sum(capt), symbol), keyby = .(date)
    ][, .(mkt_ret = sum(mkt_weight * stkcd_ret), stkcd_ret, symbol, date_ym = str_sub(date, start = 1, end = 6)), keyby = .(date)
    ][, .(stkcd_m_ret = mean(stkcd_ret), date, mkt_ret), keyby = .(symbol, date_ym)
    ][, .(stkcd_m_ret, symbol, date, mkt_m_ret = mean(mkt_ret)), keyby = .(date_ym)
    ][stkcd_m_ret > 2*mkt_m_ret, .(symbol = unique(symbol)), keyby = .(date_ym)
    ][1:5]

此题关键在于分别计算个股月收益stkcd_m_ret和市场月收益mkt_m_ret

line 1 计算每日个股收益率stkcd_ret和个股每日在市场中的市值权重mkt_weight

line 2 计算出每日的市场收益率mkt_ret,并生成一个精确到某年某月的时间变量date_ym,这里用了str_subdate前6位进行提取。

line 3 以symboldate_ym分组计算个股月收益率stkcd_m_ret

line 4 以date_ym分组计算市场平均月收益率mkt_m_ret

line 5 判断语句挑选出每月收益大于市场收益1倍的股票:stkcd_m_ret > 2*mkt_m_retkeyby = .(date_ym)标记出年月,而后用unique(symbol)对股票代码去重。

题 42

42. 每个月中,个股月收益超过行业月收益1倍以上的股票有哪些?

代码语言:javascript
复制
data[, .(stkcd_ret = close/pre_close - 1, ind_weight = capt/sum(capt), symbol), keyby = .(industry, date)
    ][, .(ind_ret = sum(ind_weight * stkcd_ret), stkcd_ret, symbol, date_ym = str_sub(date, start = 1, end = 6)), keyby = .(industry, date)
    ][, .(stkcd_m_ret = mean(stkcd_ret), date, ind_ret, industry), keyby = .(symbol, date_ym)
    ][, .(stkcd_m_ret, symbol, date, ind_m_ret = mean(ind_ret)), keyby = .(date_ym, industry)
    ][stkcd_m_ret > 2*ind_m_ret, .(symbol = unique(symbol)), keyby = .(date_ym)
    ][1:5]

此题与Ex-41类似,可完全参考,此处不作赘述。感兴趣的同学可以尝试自己编写。

题 43

43. 每个股票的收益率对市场收益率的相关系数最高的10个股票是哪些?

代码语言:javascript
复制
data[, .(stkcd_ret = close/pre_close - 1, mkt_weight = capt/sum(capt), symbol), keyby = .(date)
    ][, .(stkcd_ret, mkt_ret = sum(mkt_weight * stkcd_ret), symbol), keyby = .(date)
    ][, .(cor_coef = cor(stkcd_ret, mkt_ret)), keyby = .(symbol)
    ][order(-cor_coef), .SD[1:10]
    ][1:5]

此题关键在于分别求出每只股票和市场每天的收益率。

line 1 计算每只股票每天的收益率stkcd_ret和每天的市值加权比例mkt_weight

line 2 计算每天的市场收益率mkt_ret

line 3 计算股票收益率与市场收益率的相关系数cor_coef,这里需要以symbol进行分组。

line 4 按照cor_coef进行降序排列,最后挑选出前十行。

题 44

44. 每个行业日收益率的历史波动率是多少?(用日收益率计算标准差)

代码语言:javascript
复制
data[, .(stkcd_ret = close/pre_close - 1, ind_weight = capt/sum(capt), symbol), keyby = .(industry, date)
    ][, .(ind_ret = sum(stkcd_ret * ind_weight)), keyby = .(industry, date)
    ][, .(ind_vol = sd(ind_ret)), keyby = .(industry)
    ][1:5]

此题关键在于计算行业日收益率。

line 1 计算个股每日收益率stkcd_ret和行业市值加权ind_weight

line 2 计算每个行业每日收益率ind_ret

line 3 计算行业波动率ind_vol

题 45

45. 各个行业的日收益率的相关系数矩阵如何?哪两个行业相关性最高、最低?

代码语言:javascript
复制
cor.coef <- data[, .(stkcd_ret = close/pre_close - 1, ind_weight = capt/sum(capt), symbol, capt), keyby = .(industry, date)
    ][, .(ind_ret = sum(stkcd_ret * ind_weight)), keyby = .(industry, date)
    ][, dcast(.SD, date ~ industry, value.var = "ind_ret")
    ][, cor(.SD[, -1])]
which(max(cor.coef[cor.coef != 1]) == cor.coef, arr.ind = TRUE) %>% rownames()
which(min(cor.coef) == cor.coef, arr.ind = TRUE) %>% rownames()
rm(cor.coef)

此题关键在于计算相关系数矩阵时的数据结构的变换。

line 1 和 line 2 首先按照常规计算股票每日收益率stkcd_ret和行业内各股流通市值加权ind_weight,进而计算行业每日的收益率ind_ret

line 3 为本题的关键,这里对数据集进行reshape,用dcast从一个长的数据集变成一个宽的数据集,保留date这样一个变量,将industry变量里面的观测全部变成变量,即date ~ industry。而后在生成的这一系列变量里面填充各行业的收益率ind_ret,即value.var = "ind_ret"

line 4 计算每个行业收益率之间的相关系数矩阵:cor(.SD[, -1])

接下来的两行就是挑选出相关性最高和最低的两个行业,因为生成的数据格式是矩阵(相关系数矩阵),我们要将其中最大的相关系数挑选出来,并且需要知道这两个行业的定位和名称,首先用判断语句max(cor.coef[cor.coef != 1]) == cor.coef挑选出最大的那个相关系数(注:需要删除相关系数为1的那些部分,因为这些是自身与自身的相关系数),而由于需要定位这两个行业,那么输出格式还需要是一个保留行名和列名的矩阵,那么需要在which这个函数中加入arr.ind = TRUE这个argument。最后用rownames返回两个行业的名称。同理可应用在相关系数最低的两个行业的选取。

题 46

46. 各个行业的收益率对市场收益率的相关系数由高到低排列如何?

代码语言:javascript
复制
data[, .(stkcd_ret = close/pre_close - 1, symbol, ind_weight = capt/sum(capt), capt), keyby = .(industry,date)
    ][, .(ind_ret = sum(ind_weight*stkcd_ret), stkcd_ret, symbol, capt), keyby = .(industry, date)
    ][, .(ind_ret, mkt_weight = capt/sum(capt), stkcd_ret, industry), keyby = date
    ][, .(ind_ret, mkt_ret = sum(mkt_weight*stkcd_ret), industry), keyby = date
    ][, unique(.SD)
    ][, .(cor_coef = cor(ind_ret, mkt_ret)), keyby = .(industry)
    ][order(-cor_coef)
    ][1:5]

此题与Ex-43类似,可完全参考,此处不作赘述。感兴趣的同学可以自己编写一下。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 习题 40
  • 习题 41
  • 习题 42
  • 习题 43
  • 习题 44
  • 习题 45
  • 习题 46
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档