如何根据组内值计算按比例分配的投资组合权重?

How to calculate pro rata portfolio weights based on values within groups?

我想根据每个投资组合中相对于基金总价值的基金价值来计算投资组合权重。

我有一个 50,000 x 4 的数据框。基金价值栏应确定每个基金在每次抽奖中的权重。

 draw Fund.ID Fund.Value..mn.USD. Net.Multiple..X.
   (int)   (int)               (dbl)            (dbl)
1      1   10678              1963.8             1.29
2      1    8812              9400.0             1.61
3      1    7236              7525.0             1.58
4      1   12702              5979.7             1.40
5      1   13715              3510.0             1.70
6      2    2060               334.8             1.42
7      2    2059               250.0             1.47
8      2    1151               202.0             2.12
9      2    1812               500.0             0.11
10     2    6822               151.2             2.09

对于抽奖 1,第 2 行中的基金应具有最高权重 (33.12%),第 3 行中的基金应具有第二高权重 (26.52%),第 1 行中的基金应具有最低权重 (6.92 %)。第 1-5 行的权重总和应等于 100%。

如何为 1,000 次抽取创建这样的权重向量?然后我想将每个权重乘以各自的 Net Multiple (weight(fund1)*Net Multiple(fund1)).

我们可以使用 dplyr 来获取基金权重,另外,我们将您的 data.frame 称为 df,并将列名设为单个单词,这样更容易理解处理.

library(dplyr)
head(df)
  Draw  Fund  Value Multiple
1    1 10678 1963.8     1.29
2    1  8812 9400.0     1.61
3    1  7236 7525.0     1.58
4    1 12702 5979.7     1.40
5    1 13715 3510.0     1.70
6    2  2060  334.8     1.42

df <- df %>% group_by(Draw) %>% mutate(FundWeight = Value / sum(Value))
head(df)

Source: local data frame [6 x 5]
Groups: Draw [2]

   Draw  Fund  Value Multiple FundWeight
  (int) (int)  (dbl)    (dbl)      (dbl)
1     1 10678 1963.8     1.29 0.06920027
2     1  8812 9400.0     1.61 0.33123668
3     1  7236 7525.0     1.58 0.26516553
4     1 12702 5979.7     1.40 0.21071234
5     1 13715 3510.0     1.70 0.12368518
6     2  2060  334.8     1.42 0.23282337

#multiply columns
df$WeightMultiple <- df$FundWeight * df$Multiple
df

Source: local data frame [10 x 6]
Groups: Draw [2]

    Draw  Fund  Value Multiple FundWeight WeightMultiple
   (int) (int)  (dbl)    (dbl)      (dbl)          (dbl)
1      1 10678 1963.8     1.29 0.06920027     0.08926835
2      1  8812 9400.0     1.61 0.33123668     0.53329105
3      1  7236 7525.0     1.58 0.26516553     0.41896154
4      1 12702 5979.7     1.40 0.21071234     0.29499727
5      1 13715 3510.0     1.70 0.12368518     0.21026481
6      2  2060  334.8     1.42 0.23282337     0.33060918
7      2  2059  250.0     1.47 0.17385257     0.25556328
8      2  1151  202.0     2.12 0.14047288     0.29780250
9      2  1812  500.0     0.11 0.34770515     0.03824757
10     2  6822  151.2     2.09 0.10514604     0.21975522

您可以使用 data.table

library(data.table) 
setDT(df)[, weight := prop.table(Fund.Value), by = draw]
df
#    draw Fund.ID Fund.Value Net.Multiple..X.     weight
# 1:    1   10678     1963.8             1.29 0.06920027
# 2:    1    8812     9400.0             1.61 0.33123668
# 3:    1    7236     7525.0             1.58 0.26516553
# 4:    1   12702     5979.7             1.40 0.21071234
# 5:    1   13715     3510.0             1.70 0.12368518
# 6:    2    2060      334.8             1.42 0.23282337
# 7:    2    2059      250.0             1.47 0.17385257
# 8:    2    1151      202.0             2.12 0.14047288
# 9:    2    1812      500.0             0.11 0.34770515
#10:    2    6822      151.2             2.09 0.10514604