问题描述
我正在尝试将按回报排名的股票表转换为值矩阵,该矩阵将作为投资组合中股票的权重输入 PerformanceAnalytics::ReturnPortfolio
。
我特别想做的是将 33% 最好的股票的排名值转换为 1,将 33% 表现最差的股票的排名值转换为 -1,其余的为 0。
这是我选取最好的股票并将其排名值更改为 1 的原始代码:
asset_ranking <- db_Momentum %>%
dplyr::select(-date) %>%
as.matrix() %>%
rowRanks(ties.method = "min") %>%
as.data.frame() %>%
dplyr::mutate(date = db_Momentum$date) %>%
dplyr::select(date,everything()) %>%
purrr::set_names(c("date",tickets)) %>%
as_tibble()
# Analyzing Sector Selection
asset_selection <- asset_ranking %>%
mutate_if(is.numeric,~ + ( . > (length(tickets) - n_assets_buy))) %>%
dplyr::select(-date)
这是现在的一个例子:
AAPL | IBM | KO | T | TLT | 间谍 |
---|---|---|---|---|---|
1 | 2 | 3 | 4 | 6 | 5 |
2 | 1 | 3 | 5 | 4 | 6 |
1 | 4 | 2 | 5 | 3 | 6 |
6 | 4 | 5 | 2 | 1 | 3 |
这就是我想要的:
AAPL | IBM | KO | T | TLT | 间谍 |
---|---|---|---|---|---|
1 | 1 | 0 | 0 | -1 | -1 |
1 | 1 | 0 | -1 | 0 | -1 |
1 | 0 | 1 | -1 | 0 | -1 |
-1 | 0 | -1 | 1 | 1 | 0 |
解决方法
我们可以用 Reader Mode
和 apply
循环遍历行,得到 MARGIN = 1
和 quantile
作为 probs
和 .33
,传递那个作为 .67
中的 breaks
,转换为 cut
并使用该索引将值替换为 1、0、-1
integer
-输出
asset_selection[] <- t(apply(asset_selection,1,function(x)
c(1,-1)[as.integer(cut(x,c(-Inf,quantile(x,c(.33,.67)),Inf)))]))
数据
asset_selection
# AAPL IBM KO T TLT SPY
#1 1 1 0 0 -1 -1
#2 1 1 0 -1 0 -1
#3 1 0 1 -1 0 -1
#4 -1 0 -1 1 1 0