R练习50题 - 第七期

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

题预览

小编趁着刚打了疫苗,有点困,无法做脑力非常集中的事情,所以来更新一期,但绝对保质保量,希望大家能满意这一期!!

首先需要感谢水友@苏叶,在R练习50题 - 第三期中对其中纠正的错误,小编已将其改正,对此有疑问的水友可从链接前往。大猫的R语言课堂由衷感谢各位提出的修正意见,并将继续虚心接受更多宝贵意见。

继续看题!!

29. 每天哪些行业的平均成交额高于全市场平均成交额?

30. 每天每个股票对市场的超额收益率是多少?

31. 每天每个股票对市场去除自身的超额收益率是多少?

32. 每天每个股票对行业的超额收益率是多少?

33. 每天每个股票对行业去除自身的超额收益率是多少

34. 每个股票每天对市场的超额收益率与对行业的超额收益率的相关系数如何?

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

题 29

29. 每天哪些行业的平均成交额高于全市场平均成交额?

代码语言:javascript复制
data[, .(amount_mkt_aver = mean(amount), industry = industry, amount = amount), keyby = .(date)
    ][, .(amount_ind_aver = mean(amount), amount_mkt_aver), keyby = .(date, industry)
    ][amount_ind_aver > amount_mkt_aver, unique(.SD[, 1:2])
    ][1:5]

这一题主要是分组计算行业平均成交额amount_ind_aver和市场平均成交额amount_mkt_aver,而后进行比较。

line 1 分组计算每天的市场平均成交额amount_mkt_aver,而后选择出需要的变量。

line 2 分组计算每天每个行业的平均成交额amount_ind_aver

line 3 将每天每个行业平均成交额amount_ind_aver高于市场平均成交额amount_mkt_aver的观测行选择出来,而后只保留日期date和行业industry这两个变量,由于这时的数据是以个股为单个观测值的数据,所以最后对数据进行去重。

题 30

30. 每天每个股票对市场的超额收益率是多少?

代码语言:javascript复制
data[, .(stkcd_ret = close/pre_close - 1, weight = capt/sum(capt), symbol), keyby = date
    ][, .(mkt_ret = sum(weight*stkcd_ret), stkcd_ret, symbol), keyby = date
    ][, .(alpha = coef(lm(stkcd_ret ~ mkt_ret))[1], beta = coef(lm(stkcd_ret ~ mkt_ret))[2], mkt_ret, stkcd_ret, date), by = symbol
    ][, .(abnr_ret = stkcd_ret - alpha - beta * mkt_ret), keyby = .(date, symbol)
    ][1:5]

此题关键在于利用公式 ,其中 为个股每日的收益率, 为市场每日的收益率, 而后进行回归,提取回归系数 和 ,最后依据公式 进行超额收益率计算,其中 。

line 1 首先计算每日的个股收益率stkcd_ret以及市场总每只股票流通市值占比的权重weight

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

line 3 依据公式 ,利用回归模型lm(stkcd_ret ~ mkt_ret)分别计算出回归的截距项alpha和beta。

line 4 依据公式 进行每只股票每天的超额收益率abnr_net计算。

题 31

31. 每天每个股票对市场去除自身的超额收益率是多少?

代码语言:javascript复制
data[, .(stkcd_ret = close/pre_close - 1, symbol, mkt_capt_outself =  sum(capt) - capt, capt), keyby = date
    ][, .(mkt_ret_outself = {
        a <- vector()
        for (i in 1:.N) {
            a[i] <- sum((capt[-i]/mkt_capt_outself[i]) * stkcd_ret[-i])
        }
        a
    }, stkcd_ret, symbol), 
      keyby = date
    ][, .(alpha = coef(lm(stkcd_ret ~ mkt_ret_outself))[1], beta = coef(lm(stkcd_ret ~ mkt_ret_outself))[2], mkt_ret_outself, stkcd_ret, date), by = symbol
    ][, .(abnr_ret = stkcd_ret - alpha - beta * mkt_ret_outself), keyby = .(date, symbol)
    ][1:5]

此题关键在于市场除去每只股票自身的超额收益率的计算,公式如下:

line 1 计算每只股票每日的收益率stkcd_ret,并且计算出市场中除这只股票自己本身之外其他股票的总流通市值mkt_capt_outself

line 2 这一步为此题的关键,我们以日期date分组,而后遍历所有的股票,将所有其他股票当天的流通市值capt[-i],除以除去自身流通市值的市场整体流通市值mkt_capt_outself[i]: capt[-i]/mkt_capt_outself[i]

而后利用R当中两个向量相乘的原理,乘以这些股票当天的收益率stkcd_ret[-i],最后整体加和得出市场除去每只股票自身的收益率:sum((capt[-i]/mkt_capt_outself[i]) * stkcd_ret[-i])

line 3 依据公式 ,利用回归模型lm(stkcd_ret ~ mkt_ret_outself)分别计算出回归的截距项alpha和beta。

line 4 依据公式 进行每只股票每天的超额收益率abnr_net计算。

题 32

32. 每天每个股票对行业的超额收益率是多少?

代码语言:javascript复制
data[, .(stkcd_ret = close/pre_close - 1, symbol, weight = capt/sum(capt)), keyby = .(industry,date)
    ][, .(ind_ret = sum(weight*stkcd_ret), stkcd_ret, symbol), keyby = .(industry, date)
    ][, .(alpha = coef(lm(stkcd_ret ~ ind_ret))[1], beta = coef(lm(stkcd_ret ~ ind_ret))[2], ind_ret, stkcd_ret, symbol, date), keyby = .(industry, symbol)
    ][, .(abnr_ret = stkcd_ret - alpha - beta * ind_ret), keyby = .(date, symbol)
    ][1:5]

与Ex-30类似,可完全参考Ex-30,此处不作赘述。感兴趣的水友可以尝试自己做一做!

题 33

33. 每天每个股票对行业去除自身的超额收益率是多少?

代码语言:javascript复制
data[, .(stkcd_ret = close/pre_close - 1, symbol, ind_capt_outself =  sum(capt) - capt, capt), keyby = .(industry,date)
    ][, .(ind_ret_outself = {
         a <- vector()
        for (i in 1:.N) {
            a[i] <- sum((capt[-i]/ind_capt_outself[i]) * stkcd_ret[-i])
        }
        a
    }, stkcd_ret, symbol),     
      keyby = .(industry, date)
    ][, .(alpha = coef(lm(stkcd_ret ~ ind_ret_outself))[1], beta = coef(lm(stkcd_ret ~ ind_ret_outself))[2], ind_ret_outself, stkcd_ret, symbol, date), keyby = .(industry, symbol)
    ][, .(abnr_ret = stkcd_ret - alpha - beta * ind_ret_outself), keyby = .(date, symbol)
    ][1:5]

与Ex-31类似,可完全参考Ex-31,此处不作赘述。感兴趣的水友可以尝试一下!!

题 34

34. 每个股票每天对市场的超额收益率与对行业的超额收益率的相关系数如何?

答案1

代码语言:javascript复制
mkt <- data[, .(stkcd_ret = close/pre_close - 1, weight = capt/sum(capt), symbol), keyby = date
    ][, .(mkt_ret = sum(weight/100*stkcd_ret), stkcd_ret, symbol), keyby = date
    ][, .(alpha = coef(lm(stkcd_ret ~ mkt_ret))[1], beta = coef(lm(stkcd_ret ~ mkt_ret))[2], mkt_ret, stkcd_ret, symbol, date)
    ][, .(abnr_mkt_ret = stkcd_ret - alpha - beta * mkt_ret), keyby = .(date, symbol)]
ind <- data[, .(stkcd_ret = close/pre_close - 1, symbol, weight = capt/sum(capt)), keyby = .(industry,date)
    ][, .(ind_ret = sum(weight/100*stkcd_ret), stkcd_ret, symbol), keyby = .(industry, date)
    ][, .(alpha = coef(lm(stkcd_ret ~ ind_ret))[1], beta = coef(lm(stkcd_ret ~ ind_ret))[2], ind_ret, stkcd_ret, symbol, date), keyby = .(industry)
    ][, .(abnr_ind_ret = stkcd_ret - alpha - beta * ind_ret), 
      keyby = .(date, symbol)]

mkt[ind, on = .(date, symbol)
   ][, cor(abnr_mkt_ret, abnr_ind_ret)]
rm(mkt, ind)

答案2

代码语言:javascript复制
data_key2 <- data
data_key2[, ':='(stkcd_ret = close/pre_close - 1, mkt_weight = capt/sum(capt)), keyby = date
    ][, mkt_ret := sum(mkt_weight/100*stkcd_ret), keyby = date
    ][, ':='(stkcd_ret = close/pre_close - 1, ind_weight = capt/sum(capt)), keyby = .(industry,date)
    ][, ind_ret := sum(ind_weight/100*stkcd_ret), keyby = .(industry, date)
    ][, ':='(alpha_mkt = coef(lm(stkcd_ret ~ mkt_ret))[1], beta_mkt = coef(lm(stkcd_ret ~ mkt_ret))[2])
    ][, ':='(alpha_ind = coef(lm(stkcd_ret ~ ind_ret))[1], beta_ind = coef(lm(stkcd_ret ~ ind_ret))[2]), keyby = .(industry)
    ][, ':='(abnr_ind_ret = stkcd_ret - alpha_ind - beta_ind * ind_ret, abnr_mkt_ret = stkcd_ret - alpha_mkt - beta_mkt * mkt_ret), keyby = .(date, symbol)
    ][, cor(abnr_mkt_ret, abnr_ind_ret)]
rm(data_key2)

此题为Ex-30和Ex-32的结合,答案1最后合并了这两题的两个表,得出结果。可完全参考Ex-30和Ex-32,此处不做赘述。

此外,此题由于牵涉的变量生成较多,运用.()进行处理会比较容易出错,因为每行都要想清楚下一行需要哪些变量,需要提前提取一些变量。此处再提供一个较多利用:=进行处理的答案2,还可以避免两个表进行合并的操作,整体代码比较整洁。基本思路与答案1一致。

大猫的R语言课堂

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

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

大猫的微信号是:

iRoss2007

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

ravin515

http://space.bilibili.com/40771572

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

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

我还有许多好玩的计划。

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

0 人点赞