我正在尝试查找n
个股票的所有可能的投资组合分配,加权步长为s
。函数expand.grid()
用于计算所有变体,子集使用rowSums()
完成,将输出减少到权重为100的所有变体。
问题:
这种方式不适用于“较大”的数字。在expand.grid()
之后使用子集似乎不是最好的方法。有什么想法吗?
以下是代码:
n <- 5 #number equities
s <- 20 #weighting steps
Ptf <- function(n, s){
m <- expand.grid(rep(list(seq(0, 100, s)), n))
subset(m, rowSums(m)==100)
}
Ptfs <- Ptf(n, s)
结果:
head(Ptfs)
Var1 Var2 Var3 Var4 Var5
6 100 0 0 0 0
11 80 20 0 0 0
16 60 40 0 0 0
21 40 60 0 0 0
26 20 80 0 0 0
31 0 100 0 0 0
> tail(Ptfs)
Var1 Var2 Var3 Var4 Var5
4321 0 0 0 40 60
5186 20 0 0 0 80
5191 0 20 0 0 80
5221 0 0 20 0 80
5401 0 0 0 20 80
6481 0 0 0 0 100
增加股票数量n <- 10
会发出错误消息:
> n <- 10 #number equities
> s <- 20 #weighting steps
>
...
>
> Ptfs <- Ptf(n, s)
Error: cannot allocate vector of size 461.3 Mb
任何帮助都会非常感激!
答案 0 :(得分:2)
根据上面的链接,您可以使用partitions
包...
library(partitions)
Ptfs <- as.data.frame(s*t(as.matrix(compositions(100/s,n))))
Ptfs
V1 V2 V3 V4 V5
1 100 0 0 0 0
2 80 20 0 0 0
3 60 40 0 0 0
4 40 60 0 0 0
5 20 80 0 0 0
6 0 100 0 0 0
7 80 0 20 0 0
8 60 20 20 0 0
9 40 40 20 0 0
10 20 60 20 0 0
11 0 80 20 0 0
12 60 0 40 0 0
13 40 20 40 0 0
14 20 40 40 0 0
15 0 60 40 0 0
16 40 0 60 0 0
17 20 20 60 0 0
18 0 40 60 0 0
19 20 0 80 0 0
20 0 20 80 0 0
21 0 0 100 0 0
22 80 0 0 20 0
...