如何根据组内值计算按比例分配的投资组合权重?
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
我想根据每个投资组合中相对于基金总价值的基金价值来计算投资组合权重。
我有一个 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