R 为数据组创建权重向量

R 为数据组创建权重向量,r,portfolio,R,Portfolio,我使用的数据与财务数据有关。我的问题是,我想给给定投资组合中的多个公司分配权重。也就是说,如果我有3家公司(如下面的例子),我想给投资组合中的3家公司分配相等的权重,每个公司0.33%。我认为,当投资组合的规模增加时,它也会对随机分配权重给投资组合中的公司感兴趣,并且必须手动输入特定的权重可能会很麻烦 数据如下所示: 可使用以下代码使用tidyquant程序包创建: stock_returns_monthly <- c("AAPL", "GOOG", "NFLX") %>% tq

我使用的数据与财务数据有关。我的问题是,我想给给定投资组合中的多个公司分配权重。也就是说,如果我有3家公司(如下面的例子),我想给投资组合中的3家公司分配相等的权重,每个公司0.33%。我认为,当投资组合的规模增加时,它也会对随机分配权重给投资组合中的公司感兴趣,并且必须手动输入特定的权重可能会很麻烦

数据如下所示:

可使用以下代码使用
tidyquant
程序包创建:

stock_returns_monthly <- c("AAPL", "GOOG", "NFLX") %>%
  tq_get(get = "stock.prices",
         from = "2010-01-01",
         to = "2015-12-31") %>%
  group_by(symbol) %>%
  tq_transmute(select = adjusted,
               mutate_fun = periodReturn,
               period = "monthly",
               col_rename = "Ra")

stock_returns_monthly_multi <- stock_returns_monthly %>%
  tq_repeat_df(n = 3)
我想解决两个问题:

1) 为每个投资组合在所有公司中设置相等的权重,下面的代码起作用

weights <- c(0.33, 0.33, 0.33,
             0.33, 0.33, 0.33,
             0.33, 0.33, 0.33)
权重%
分组人(投资组合)
输出:

# A tibble: 6 x 4
# Groups:   portfolio [1]
  portfolio symbol date            Ra
      <int> <chr>  <date>       <dbl>
1         1 AAPL   2010-01-29 -0.103 
2         1 AAPL   2010-02-26  0.0654
3         1 AAPL   2010-03-31  0.148 
4         1 AAPL   2010-04-30  0.111 
5         1 AAPL   2010-05-28 -0.0161
6         1 AAPL   2010-06-30 -0.0208
# A tibble: 9 x 3
# Groups:   portfolio [3]
  portfolio stocks weights
      <int> <chr>    <dbl>
1         1 AAPL     0.330
2         1 GOOG     0.330
3         1 NFLX     0.330
4         2 AAPL     0.330
5         2 GOOG     0.330
6         2 NFLX     0.330
7         3 AAPL     0.330
8         3 GOOG     0.330
9         3 NFLX     0.330
#一个tible:9 x 3
#组别:公文包[3]
投资组合股票权重
1 AAPL 0.330
2.1 GOOG 0.330
3.1 NFLX 0.330
4.2 AAPL 0.330
5.2 GOOG 0.330
6.2 NFLX 0.330
7.3 AAPL 0.330
8.3 GOOG 0.330
9.3 NFLX 0.330
上述结果适用于等权数据。同样,当公司数量增加,投资组合规模增加时,问题就会出现


这是
dput
链接

df
的形式获取
stock\u returns\u monthly\u multi
数据集。请注意,
df
似乎已经在
portfolio
上分组。使用
dplyr
权重将在每个
投资组合中的
符号数
之间平均分配

library(dplyr)

df <- stock_returns_monthly_multi

df %>% 
   distinct(portfolio, symbol) %>% 
mutate(weights = 1/n())

# A tibble: 9 x 3
# Groups:   portfolio [3]
#  portfolio symbol weights
#      <int> <chr>    <dbl>
#1         1 AAPL     0.333
#2         1 GOOG     0.333
#3         1 NFLX     0.333
#4         2 AAPL     0.333
#5         2 GOOG     0.333
#6         2 NFLX     0.333
#7         3 AAPL     0.333
#8         3 GOOG     0.333
#9         3 NFLX     0.333
这是一种快速/简单的实现方法,但在统计准确性方面存在问题,请参阅以下非常有趣的帖子:。我们可以将接受的答案编码成一个函数(
gen\u weight\u vec
),并与
mutate
一起使用。比如:

gen_weight_vec <- function(n){x <- runif(n) 
                              y <- -log(x) 
                              return(y/sum(y))}

df_weight <- df %>% 
                distinct(portfolio, symbol) %>% 
             mutate(weights = gen_weight_vec(n()))

空间不足:问题继续。我试图对
权重向量做两件事。1)根据公司和投资组合的数量,为每个投资组合中的每个公司随机分配权重。2)为每个投资组合的所有公司设置相等的权重。因此,投资组合1:
公司1=0.33
公司2=0.33
公司3=0.33
每个投资组合的权重不应大于1。评论是暂时的,因此不要在评论中加入关键信息;请回答您的问题,并在文章的主体部分提供详细信息!我也不明白你在问什么。您是否希望通过源数据确定权重?如果是,规则是什么?如果没有,提供源数据有什么意义?编辑了主要问题。谢谢你的意见。谢谢。这正是我想要的!最后一点,您知道如何更改
mutate(weights=1/n())
以随机创建权重吗<代码>权重\u表%distinct(投资组合,符号)%%>%mutate(权重=runif(n=1,最小=1e-12,最大=0.9999999))
但是这会随机为每个投资组合中的所有公司分配权重。我试图随机分配权重给投资组合1中的所有公司,然后随机分配权重给投资组合2中的所有公司,等等。如果我理解的很好的话。为此,您需要为每个投资组合创建一个随机权重向量,以独立添加到其中???现在这成了一个很有趣的问题。为了达到同样的目的,我编辑了我的答案。此外,在一篇有趣的交叉验证文章中指出了一些统计准确性方面的问题。我建议你加上这个问题,把你的帖子安排得简洁一点,这样其他有类似需要的人可以再次找到你的帖子。代码是完全可复制的,但dput是用来备份的。
df %>% 
   distinct(portfolio, symbol) %>% 
mutate(weights = prop.table(runif(n())))

#+ + # A tibble: 9 x 3
## Groups:   portfolio [3]
#  portfolio symbol weights
#      <int> <chr>    <dbl>
#1         1 AAPL     0.548
#2         1 GOOG     0.292
#3         1 NFLX     0.160
#4         2 AAPL     0.107
#5         2 GOOG     0.140
#6         2 NFLX     0.754
#7         3 AAPL     0.195
#8         3 GOOG     0.417
#9         3 NFLX     0.387
gen_weight_vec <- function(n){x <- runif(n) 
                              y <- -log(x) 
                              return(y/sum(y))}

df_weight <- df %>% 
                distinct(portfolio, symbol) %>% 
             mutate(weights = gen_weight_vec(n()))
 summarise(df_weight, sum_weights = sum(weights))

## A tibble: 3 x 2
#  portfolio sum_weights
#      <int>       <dbl>
#1         1          1 
#2         2          1
#3         3          1