2017-11-06 8 views
3

n株式数の可能なすべてのポートフォリオ配分を、sの重み付けステップで見つけることを試みています。機能expand.grid()は、すべてのバリエーションを計算するために使用され、サブセットはrowSums()を使用して行われ、重み付けが問題100条件を使用してexpand.gridのバリエーションを制限する方法は?

あるすべての変動に出力を低下させる:

この方法は機能しません「大きい」数字。 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 

すべてのヘルプは本当にいただければ幸いです!上記のリンクを1として

+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 
... 
+1

これはまさに私が探していたものです!よく働く!どうもありがとう! –

関連する問題