在给定条件的情况下更改排名中的值 数据

问题描述

我正在尝试将按回报排名的股票表转换为值矩阵,该矩阵将作为投资组合中股票的权重输入 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 Modeapply 循环遍历行,得到 MARGIN = 1quantile 作为 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...