2013-10-06 54 views
4

格路例如,如果我有一个格子,看起来像这样:生成中的R

  133.1 
     /
     121 
    /\ 
    110 108.9 
/\/
100 99 
    \/\ 
    90 89.1 
     \/
     81 
     \ 
      72.9 

凡格从100开始,要么用因子1.1上升,并用系数0.9下降。这个格子有3个周期,在这个周期中上升或下降。很明显,这个矩阵可以填充更多的时间段。

矩阵形式的格子看起来是这样的:

 [,1] [,2] [,3] [,4] 
[1,] 100 110 121 133.1 
[2,] NA 90 99 108.9 
[3,] NA NA 81 89.1 
[4,] NA NA NA 72.9 

我在工作R.的代码来生成格矩阵如下:

#Parameters 
S0 <- 100 #price at t0 
u <- 1.1 #up factor 
d <- 0.9 #down factor 
n <- 3 #number of periods 

#Matrix for the prices 
prices <- matrix(data=NA, nrow=(n+1), ncol=(n+1)) 
prices[1,1] <- S0 

#Fill the matrix 
for(column in 2:(n+1)){ 

    for(row in 1:(column-1)){ 

    prices[row,column] <- u*prices[row,column-1]; 
    } 

    prices[column,column] <- d*prices[column-1,column-1]; 
} 

我想创建一个代码生成一个矩阵,其中包含所有可能的路径。在这个例子中,它应该是这样的:

 [,1] [,2] [,3] [,4] 
[1,] 100 110 121 133.1 
[2,] 100 110 121 108.9 
[3,] 100 110 99 108.9 
[4,] 100 110 99 89.1 
[5,] 100 90 99 108.9 
[6,] 100 90 99 89.1 
[7,] 100 90 81 89.1 
[8,] 100 90 81 72.9 

我一直在挣扎着这片现在小时的代码,所以任何帮助,将不胜感激!提前致谢! :)

回答

5

长度为n的每个路径对应于 以上下移动的序列: 您只需要枚举所有这些序列。 如果你已经有长度n-1, 的序列作为基质u, 长度n的序列可以得到

rbind( 
    cbind(u, .9), 
    cbind(u, 1.1) 
) 

你可以把它放在一个函数,并调用它n倍。

n <- 4 
up <- 1.1 
down <- .9 
m <- Reduce( 
    function(u,v) rbind(cbind(u, up), cbind(u, down)), 
    rep(NA,n), 
    100 
) 
t(apply(m, 1, cumprod)) 
# [1,] 100 110 121 133.1 146.41 
# [2,] 100 90 99 108.9 119.79 
# [3,] 100 110 99 108.9 119.79 
# [4,] 100 90 81 89.1 98.01 
# [5,] 100 110 121 108.9 119.79 
# [6,] 100 90 99 89.1 98.01 
# [7,] 100 110 99 89.1 98.01 
# [8,] 100 90 81 72.9 80.19 
# [9,] 100 110 121 133.1 119.79 
# [10,] 100 90 99 108.9 98.01 
# [11,] 100 110 99 108.9 98.01 
# [12,] 100 90 81 89.1 80.19 
# [13,] 100 110 121 108.9 98.01 
# [14,] 100 90 99 89.1 80.19 
# [15,] 100 110 99 89.1 80.19 
# [16,] 100 90 81 72.9 65.61 
2

同样,你可以做这样的事情:

next.period<-function(x) rep(x,2)*rep(c(u,d),each=length(x)) 

next.matrix<-function(x) { 
    next.period.col<-next.period(x[,ncol(x)]) 
    cbind(rbind(x,x),next.period.col) 
} 

lattice.paths<-t(S0) 
for (i in 1:(n-1)) lattice.paths<-next.matrix(lattice.paths) 

     next.period.col next.period.col 
[1,] 100    110    121 
[2,] 100    90    99 
[3,] 100    110    99 
[4,] 100    90    81 
2

另一个想法是首先建立一个“支架”,利用expand.grid,明年填充它。

#all possible paths of times (either 1.1. or 0.9) each previous value 
    aa <- expand.grid(1, c(1.1,0.9), c(1.1,0.9), c(1.1,0.9), c(1.1,0.9)) 

    aa[,1] <- aa[,1] * 100 # start with 100 

    for(i in 2:ncol(aa)) # fill by multiplying value of previous column 
    { 
     aa[,i] <- aa[,i] * aa[,i-1] 
    } 

    aa 
    #Var1 Var2 Var3 Var4 Var5 
    #1 100 110 121 133.1 146.41 
    #2 100 90 99 108.9 119.79 
    #3 100 110 99 108.9 119.79 
    #4 100 90 81 89.1 98.01 
    #5 100 110 121 108.9 119.79 
    #6 100 90 99 89.1 98.01 
    #7 100 110 99 89.1 98.01 
    #8 100 90 81 72.9 80.19 
    #9 100 110 121 133.1 119.79 
    #10 100 90 99 108.9 98.01 
    #11 100 110 99 108.9 98.01 
    #12 100 90 81 89.1 80.19 
    #13 100 110 121 108.9 98.01 
    #14 100 90 99 89.1 80.19 
    #15 100 110 99 89.1 80.19 
    #16 100 90 81 72.9 65.61 

更多时间,expand.grid需要另一个c(1.1,0.9)