1

我正在尝试将按其回报排名的股票表转换为一个值矩阵,该矩阵将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)

这是一个现在的例子:

苹果 IBM KO 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

这就是我想要的:

苹果 IBM KO 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
4

1 回答 1

1

我们可以用 and 遍历行,用andapply获取MARGIN = 1行,将其作为in传递,转换为并使用该索引将值替换为 1、0、-1quantileprobs.33.67breakscutinteger

asset_selection[] <- t(apply(asset_selection, 1, function(x)
   c(1, 0, -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

数据

asset_selection <- structure(list(AAPL = c(1, 2, 1, 6), 
      IBM = c(2, 1, 4, 4), KO = c(3, 
 3, 2, 5), T = c(4, 5, 5, 2), TLT = c(6, 4, 3, 1), SPY = c(5, 
6, 6, 3)), class = "data.frame", row.names = c(NA, -4L))
于 2021-01-19T19:54:46.857 回答