2013-10-06 2 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).

Смежные вопросы