习题 47
47. 每个月总成交额比上个月下降幅度最大的行业是哪个?
代码语言:javascript复制data[, .(date_ym = str_sub(date, start = 1, end = 6), amount), keyby = .(industry, date)
][, .(ind_m_amount = sum(amount)), keyby = .(industry, date_ym)
][, .(dn_m_range = {
a <- vector()
for (t in 2:.N) {
a[t] <- ind_m_amount[t] - ind_m_amount[t-1]
}
a
}, date_ym = date_ym), keyby = industry
][!is.na(dn_m_range), .SD[min(dn_m_range) == dn_m_range & dn_m_range < 0], keyby = date_ym]
此题的含义笔者理解为:在每个月选择出一个行业,这个行业和其他股票相比这个月比上个月成交额下降最大。关键操作在于计算每个行业每个月对上个月成交额的变化dn_m_range,以及挑选下降幅度最大的那一个行业。
line 1 生成一个变量表示年份和月份date_ym。
line 2计算每个行业每个月的总成交额ind_m_amount。
line 3 计算每个行业这个月相比于上个月成交额变动的幅度dn_m_range,由于牵涉到行之间的操作,这里选择根据行业分组计算,对本月的成交额减去上月的总成交额ind_m_amount[t] - ind_m_amount[t-1]进行循环计算。
line 4 最后我们需要选择出每个月中相比于上个月总成交额下降幅度最大的那个行业,根据“先i,再by,最后j”的原则,首先我们去除dn_m_range为NA的观测,而后根据年月date_ym这个变量进行分组,最后还需要挑选出下降幅度最大的那个行业,就需要在.SD中再进行一次筛选,即.SD[min(dn_m_range) == dn_m_range & dn_m_range < 0]。
习题 48
48. 数据当中各个股票的最大回撤幅度是多少?(最大回撤是从一个高点到低点的降幅的最大值)
代码语言:javascript复制data[, .(mkt_rtrt_d = {
a <- vector()
for (i in 1:.N) {
a[i] <- max(high[i] - low[i:.N])
}
a
}), by = .(symbol)
][, .(mkt_rtrt = max(mkt_rtrt_d)), by = .(symbol)
][1:5]
此题关键在于如何处置最高点减去最低点。由于最大回撤幅度定义在于从一个高点到之后的低点的最大值,那么需要将每一天的最高点和之后所有的最低点进行比较,而后选择最大降幅。
line 1 首先用每一天的最高点high[i],遍历之后所有的的low[i:.N],得到一个每一天的最大降幅mkt_rtrt_d = max(high[i]-low[i:.N])。
line 2 再在每一只股票每一天的最大降幅中选择一个最大降幅mkt_rtrt。
习题 49
49. 每只股票的胜率是多少?(胜率是每天收益率为正数的概率)
代码语言:javascript复制data[, .(stkcd_ret = close/pre_close - 1), keyby = .(symbol, date)
][, .(gain_ratio = sum(stkcd_ret > 0)/.N), keyby = symbol
][1:5]
此题关键在于以股票进行分组计算。
line 1 计算每只股票每天的收益率stkcd_ret
line 2 以股票代码symbol分组计算胜率,gain_ratio = sum(stkcd_ret > 0)/.N。
习题 50
50. 每只股票的盈亏比是多少?(盈亏比是正收益之和与负收益之和的比值的绝对值)
代码语言:javascript复制data[, .(stkcd_ret = close/pre_close - 1), keyby = .(symbol, date)
][, .(stkcd_ret_pn = sum(stkcd_ret)), keyby = .(symbol, tag = ifelse(stkcd_ret > 0, "gain", "loss"))
][, .(gl_ratio = abs(stkcd_ret_pn[1]/stkcd_ret_pn[.N])), keyby = symbol
][1:5]
此题关键在于首先标记出每天每只股票是正收益还是负收益,而后对正负收益分别进行加总,而后将这两个正负收益分别取绝对值进行对比。
line 1 计算每只股票每天的收益率stkcd_ret。
line 2 首先计算出一个分组变量tag,里面有gain和loss两个观测值,如果stkcd_ret > 0,则为gain,反之则为loss;而后分别对gain和loss的部分进行加总,生成累计收益stkcd_ret_pn。
line 3 计算二者绝对值的比例gl_ratio,这里每只股票都有两个stkcd_ret_pn的观测,所以用abs(stkcd_ret_pn[1]/stkcd_ret_pn[.N])计算出盈亏比。
习题 51
51. 市场的胜率是多少?(市场收益率为正的概率)
代码语言:javascript复制data[, .(stkcd_ret = close/pre_close - 1, mkt_weight = capt/sum(capt)), keyby = date
][, .(mkt_ret = sum(stkcd_ret * mkt_weight)), keyby = date
][, .(gain_ratio = sum(mkt_ret > 0)/.N)]
此题关键在于分别计算出市场正负收益率。
line 1 计算个股每日收益率stkcd_ret,以及个股每日流通市值在市场中的权重mkt_weight。
line 2 计算市场每日收益率mkt_ret。
line 3 计算市场的胜率gain_ratio,这里直接在sum中判断出市场收益率大于0的那些观测与所有观测进行求商,sum(mkt_ret > 0/.N)。
习题 52
52. 市场的盈亏比是多少?(市场中每个股票的市值加权正收益和市值加权负收益之比)
代码语言:javascript复制data[, .(stkcd_ret = close/pre_close - 1, mkt_weight = capt/sum(capt)), keyby = date
][, .(mkt_ret = sum(stkcd_ret * mkt_weight)), keyby = date
][, .(mkt_ret_pn = sum(mkt_ret)), keyby = .(tag = ifelse(mkt_ret > 0, "gain", "loss"))
][, .(gl_ratio = abs(mkt_ret_pn[1]/mkt_ret_pn[.N]))]
此题关键在于分别计算市场市值加权正收益与负收益。
line 1 计算每只股票的日收益率stkcd_ret,以及个股每日流通市值在市场中的权重mkt_weight。
line 2 计算市场日收益率mkt_ret。
line 3 先计算出一个分组变量tag,这个变量标记出市场日收益率是gain还是loss,而后分别计算窗口期正收益之和和负收益之和mkt_ret_pn。
line 4 计算盈亏比gl_ratio:abs(mkt_ret_pn[1]/mkt_ret_pn[.N])
习题 53
53. 每个行业的胜率是多少?
代码语言:javascript复制data[, .(stkcd_ret = close/pre_close - 1, ind_weight = capt/sum(capt)), keyby = .(industry, date)
][, .(ind_ret = sum(stkcd_ret * ind_weight)), keyby = .(industry, date)
][, .(gain_ratio = sum(ind_ret > 0)/.N), keyby = industry
][1:5]
此题与Ex-51类似,可完全参考,此处不做赘述。感兴趣的同学可尝试自己编写!!
习题 54
54. 每个行业的盈亏比是多少?(行业盈亏比是行业内每个股票的市值加权的正收益率和市值加权的负收益率之比)
代码语言:javascript复制data[, .(stkcd_ret = close/pre_close - 1, ind_weight = capt/sum(capt)), keyby = .(industry, date)
][, .(ind_ret = sum(stkcd_ret * ind_weight)), keyby = .(industry, date)
][, .(ind_ret_pn = sum(ind_ret)), keyby = .(industry, tag = ifelse(ind_ret > 0, "gain", "loss"))
][, .(gl_ratio = abs(ind_ret_pn[1]/ind_ret_pn[.N])), keyby = industry
][1:5]
此题与Ex-52类似,可完全参考,此处不做赘述。感兴趣的同学可尝试自己编写!!