55. 是否存在股票的月成交额超过所在行业当月中某天一天总成交额的情况?
data[, .(date_ym = str_sub(date, start = 1, end = 6), amount, industry), keyby = .(symbol, date)
][, .(stkcd_m_amount = sum(amount), amount, industry, date), keyby = .(date_ym, symbol)
][, .(stkcd_m_amount, ind_d_amount = sum(amount), date_ym, symbol), keyby = .(industry, date)
][stkcd_m_amount > ind_d_amount
][1:5]
此题关键在于计算出每只股票每月的成交额,而后计算每个行业每天成交额,二者进行对比。
line 1 生成一个仅表示年和月的变量date_ym,即截取date变量前6位字符。
line 2 根据所生成的变量date_ym和个股symbol,分组计算每只股票每个月的成交额stkcd_m_amount。
line 3 再根据行业industry和日期date,分组计算每个行业的日成交额ind_d_amount。
line 4 将这两个变量进行对比找出股票月成交额大于行业日成交额的部分:stkcd_m_amount > ind_d_amount。
56. 每天每个行业编入、编出的股票各有多少?
data[, .(symbol_list = list(symbol)), keyby = .(industry, date)
][, {
l <- list()
for (i in 2:.N) {
intec <- intersect(symbol_list[[i]], symbol_list[[i-1]]) %>% length()
len1 <- length(symbol_list[[i]])
len2 <- length(symbol_list[[i-1]])
l[[i]] <- list(export = len2-intec, import = len1-intec)
}
rbindlist(l)
}, keyby = industry
][1:5]
此题的关键在于如何确定每天每个行业编入编出的股票有多少只,可以将其转化为集合处理问题。
line 1 将股票代码symbol按照日期date和行业industry,进行list化,每个行业每天的股票都将其变为一个单独的list:symbol_list,这么做有利于之后进行向量之间取交集的操作。
line 2 对每个行业进行分组循环操作,遍历所有日期,首先对每一期和上一期的symbol_list取交集:intersect(...),并得出这个交集向量的长度intec;接下来分别得出每一期和上一期symbol_list的长度:len1和len2;最后,用len2-intec得到上一期编出该行业的股票数量export,len1-intec得到这一期编入该行业的股票数量import,将这个有两个变量的list用rbindlist纵向拼接。
57. 每天每个行业内股票收益率的标准差是多少?
data[, .(stkcd_ret = close/pre_close - 1), keyby = .(symbol, industry, date)
][, .(ret_sd = sd(stkcd_ret)), keyby = .(industry, date)
][1:5]
本题关键在于分组计算。
line 1 计算每一只股票的日收益率stkcd_ret。
line 2 以行业industry和日期date分组计算每天每个行业内股票收益率的标准差ret_sd。
58. 每天每个行业内股票收益率的标准差的相关性如何?
data[, .(stkcd_ret = close/pre_close - 1), keyby = .(symbol, industry, date)
][, .(ret_sd = sd(stkcd_ret)), keyby = .(industry, date)
][, dcast(.SD, date ~ industry, value.var = "ret_sd")
][, cor(.SD[, -1])
][1:5, 1:5]
此题在Ex-57的基础上,将每天每个行业内股票收益率的标准差求相关系数矩阵。
line 1 和 line 2 可完全参考Ex-57。
line 3 保留日期date这个变量,而后将industry里的所有行业观测值,变为变量名,而后在这些变量名里填充各个行业每天的收益率标准差ret_sd。即dcast(.SD, date ~ industry, value.var = "ret_sd")。
line 4 求这些行业收益率标准差之间的相关系数矩阵cor(.SD[, -1])。
59. 每天计算出成交额的 z-score (减去均值除以标准差), 该指标能解释下一天个股超额收益率的多少比例?
data[, .(stkcd_ret = close/pre_close - 1, weight = capt/sum(capt), symbol, amount), keyby = date
][, .(mkt_ret = sum(weight*stkcd_ret), stkcd_ret, symbol, amount), keyby = date
][, .(alpha = coef(lm(stkcd_ret ~ mkt_ret))[1], beta = coef(lm(stkcd_ret ~ mkt_ret))[2], mkt_ret, stkcd_ret, date, amount), keyby = symbol
][, .(abnr_ret = stkcd_ret - alpha - beta * mkt_ret, amount), keyby = .(date, symbol)
][, .(abnr_ret, zscore = (amount - mean(amount))/ sd(amount), symbol), keyby = date
][, .(abnr_lead_ret = shift(abnr_ret, n = 1L, type = "lead"), zscore, symbol), keyby = symbol
][, summary(lm(abnr_lead_ret ~ zscore))$r.squared]
本题为个股超额收益率和z-score计算的综合应用。
line 1 ~ line 4 为个股超额收益率的计算,可完全参考Ex-30(R练习50题 - 第七期),此处不做赘述。
line 5 计算个股每天成交额的的z-score:zscore。
line 6 将所有个股超额收益率abnr_ret提前一期,生成abnr_lead_ret。
line 7 最后用zscore对abnr_lead_ret进行回归,提取回归的r-squared,即为解释比例。
60. 每个股票的收益率和300、500指数收益率可以回归出一个截距项和2个beta,这两个beta的分布如何?
data[, .(stkcd_ret = close/pre_close - 1, ind_w300_ret = sum((close/pre_close - 1) * index_w300), ind_w500_ret = sum((close/pre_close - 1) * index_w500), symbol), keyby = date
][, .(coef_beta = coef(lm(stkcd_ret ~ ind_w300_ret + ind_w500_ret))[-1], tag = c("ind_w300_ret", "ind_w500_ret")), keyby = symbol
][!is.na(coef_beta), .(sample_mean = mean(coef_beta), sample_sd = sd(coef_beta)), keyby = tag]
此题关键在于将每一只股票对300和500指数进行分组回归并取出两个beta值。
line 1 分别计算每只股票、300指数和500指数每天的收益率。
line 2 将300指数和500指数分别对每只股票做回归,并提取出每只股票的两个beta系数,并生成一个变量标记出beta值属于300还是500指数。
line 3 计算这两个beta值的均值和方差。
61. 每天开盘后到最高价涨幅最大的100只股票同样也是全天(昨收到今收)涨幅最大的100只股票的比例是多少?
data[, .(date_ym = str_sub(date, start = 1, end = 6), amount, industry), keyby = .(symbol, date)
][, .(stkcd_m_amount = sum(amount), amount, industry, date), keyby = .(date_ym, symbol)
][, .(stkcd_m_amount, ind_d_amount = sum(amount), date_ym, symbol), keyby = .(industry, date)
][stkcd_m_amount > ind_d_amount
][1:5]
此题关键在于计算每只股票开盘价到最高价的涨幅和每个交易日的涨幅,而后进行降序排序,分别选出前100只股票。
line 1 计算每只股票开盘价到最高价的涨幅high_open。
line 2 按日期date升序并按照high_open降序排列,选择出前100的股票,并分日期进行list化ho_symbol,这里进行list化是为了进行merge的时候,对key的选择的唯一性问题的方便,因为这样两个表就可以有一个unique key名为date。
line 3 重复line 1 和 line 2的操作统计出每天涨幅前100的股票clo_open,并和之前的表按照日期date进行合并。
line 4 将所创建的两个股票代码的list先向量化,而后求交集intersect(unlist(cp_symbol), unlist(ho_symbol)),并计算这个交集向量的长度len。
line 5 计算每个日期下面符合两个条件的比例,首先判断len == 100,再将所有符合条件的element加起来,再除以整个行数,就可以得出比例。
62. 每天计算最近三天每天对市场的超额收益率都排进当天前100的股票有哪些?
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), keyby = symbol
][, .(abnr_ret = stkcd_ret - alpha - beta * mkt_ret), keyby = .(date, symbol)
][order(date, -abnr_ret), .(symbol = list(symbol[1:100])), keyby = date
][, {
l <- list()
for (t in 4:.N) {
l[[t]] <- list(symbol = Reduce(intersect, list(symbol[[t]], symbol[[t-1]], symbol[[t-2]])), date = date[[t]])
}
rbindlist(l)
}][1:5]
此题为超额收益率和集合问题的结合。
line 1 ~ line 4 为股票超额收益率的计算过程,可完全参考Ex-30(R练习50题 - 第七期)在此不作赘述。
line 5 以日期date升序和超额收益率abnr_ret降序排列,选择出每天超额收益率都在前100的股票,并list化。
line 6 由于需要选择出最近三天超额收益率都进前一百的股票,那么对整体进行循环,对t、t-1和t-2三天超额收益率都进入的100股票进行交集的计算,合并上日期date,整体进行输出。
63. 每天计算最近三天每天对行业的超额收益率都排进当天行业前30%的股票有哪些?
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 = .(symbol, industry)
][, .(abnr_ret = stkcd_ret - alpha - beta * ind_ret), keyby = .(date, symbol)
][order(date, -abnr_ret) & abnr_ret > quantile(abnr_ret, 0.7), .(symbol = list(symbol)), keyby = date
][, {
l <- list()
for (t in 4:.N) {
l[[t]] <- list(symbol = Reduce(intersect, list(symbol[[t]], symbol[[t-1]], symbol[[t-2]])), date = date[[t]])
}
rbindlist(l)
}][1:5]
此题为Ex-62的变形,可完全参考,此处不做赘述。感兴趣的同学可以自行编写!!