2014-10-03 50 views
1
max.simu <- 1000 # max simulation trials 
v.simu <- 0*1:max.simu # initialize trials 
barrier.level1 <- 10 # barrier level 
barrier.level2 <- -10 
v.simu[1] <- rnorm(1) # first simulation value 
sim.index <- 2 # initialize simulation index 
while ((sim.index <= max.simu) && 
     (v.simu[sim.index - 1] < barrier.level1 && 
      v.simu[sim.index - 1] > barrier.level2)){ 


    v.simu[sim.index] <- v.simu[sim.index - 1] + rnorm(1) 
    sim.index <- sim.index + 1 
} # end while 

if (sim.index <= max.simu) { # fill zero prices 
    v.simu[sim.index:max.simu] <- v.simu[sim.index - 1] 
} 

# create daily time series starting 2011 
ts_var <- ts(data=v.simu, frequency=365) 
plot(ts_var) 

當我運行我的代碼時,模擬停止時,數字命中10或-10。我需要對它進行編碼,以便它碰到一個障礙編號,然後如果它碰到另一個障礙編號,模擬將停止。我需要使用while循環停止模擬,當它碰到其中一個障礙時,然後另一個

回答

1

我不知道我知道你想要什麼,但或許這可以做到這一點:

max.simu <- 1000 # max simulation trials 
v.simu <- 0*1:max.simu # initialize trials 
barrier.level1 <- 10 # barrier level 
barrier.level2 <- -10 
v.simu[1] <- rnorm(1) # first simulation value 
sim.index <- 2 # initialize simulation index 

flag_up <- flag_down <- FALSE 

while ((sim.index <= max.simu) && !(flag_up && flag_down)){ 

    v.simu[sim.index] <- v.simu[sim.index - 1] + rnorm(1) 

    if (v.simu[sim.index] > barrier.level1){ 

    flag_up <- TRUE 
    v.simu[sim.index] <- v.simu[sim.index - 1] + pmin(rnorm(1),0) 

    }else if (v.simu[sim.index] < barrier.level2){ 

    flag_down <- TRUE 
    v.simu[sim.index] <- v.simu[sim.index - 1] + pmax(rnorm(1),0) 

    } 

    sim.index <- sim.index + 1 
} # end while 

if (sim.index <= max.simu) { # fill zero prices 
    v.simu[sim.index:max.simu] <- v.simu[sim.index - 1] 
} 

# create daily time series starting 2011 
ts_var <- ts(data=v.simu, frequency=365) 
plot(ts_var) 

不是很優雅,而且由於大量RNORM,可能會發生一些奇怪的停止條件()可以給。希望這第一步將有所幫助!

+1

設置標誌<-c(0,0)'並檢查條件'while(!prod(flag))'可能會更「清潔」'這樣你可以任意增加每個標誌和標誌出現超出範圍的值而沒有一堆「ifs」 – 2014-10-03 11:52:46

相關問題