2017-03-26 22 views
1

我是R新手,目前我正在爲for循環努力工作。運行for循環而不覆蓋R中向量中的現有元素

我的代碼將模擬從時間0(股票價格爲100)到時間8的8個股票價格。我想這樣做10次,並將所有值存儲在向量中,價格。我的矢量最終將包含80個價格。但是,矢量中存儲的唯一值是最後一次模擬。我不知道如何在不覆蓋現有元素的情況下存儲所有的值。有沒有人有關於如何做到這一點的線索?

這裏是我的代碼:

S = c(100) 
delta = 0.25 
sigma = 0.2 
rf = 0.01 

prices = c() 

Ber.reg <- function(S, delta, sigma, rf) { 
    for(i in 1:10) { 
     for(j in 1:8) { 
     S[j+1] <- S[j]*exp((rf - 0.5*sigma^2)*delta + sigma*sqrt(delta)*rnorm(1)) 
     } 
    prices <- S 
    } 
return(prices) 
} 
+0

價格< - c(價格,S)' – user31264

+0

謝謝,這工作 –

回答

0

的幾個問題:

1)依賴於全局變量運行之前進行正確的初始化是一個脆弱的函數的函數。全球設有prices的設計很差。它應該是本地的功能。

2)他們只有相關的東西S是價值100。初始價格應該是參數,將其包裝在c()中是不必要的晦澀難懂(雖然無害,因爲100 c(100))。從概念上講,100是標量

3)您的代碼是10次模擬運行,其中每個模擬有8個轉換步驟。爲什麼不a)使這些數字參數,而不是硬連接他們?和b)返回一個矩陣其中每一行是一個運行?從邏輯上講,你有更多的矩陣而不是平面向量。

4)增長的載體(例如price <- c(price,S))效率低下,因爲它重複分配更多空間並將舊值複製到新空間。既然您知道提前輸出的大小,請一次性分配空間。

5)讓你的代碼更加矢量化。開始重複試驗的次數的初始值的向量,並在每一個階段,更新整個載體中的一行代碼,而無需內部循環:

Ber.reg <- function(initial, delta, sigma, rf,runs,steps){ 
    n <- runs*(steps+1) 
    prices <- vector("numeric",n) 
    price <- rep(initial,runs) 
    prices[1:runs] <- price 
    for(i in seq_len(steps)){ 
    price <- price*exp((rf - 0.5*sigma^2)*delta + sigma*sqrt(delta)*rnorm(runs)) 
    prices[(1+ i*runs):((i+1)*runs)] <- price 
    } 
    dim(prices) <- c(runs,steps+1) 
    prices 
} 

例如,使用值對於delta, sigma, rf

> Ber.reg(100,delta,sigma,rf,3,4) 
    [,1]  [,2]  [,3]  [,4]  [,5] 
[1,] 100 94.72913 94.35394 92.47475 90.03819 
[2,] 100 91.91992 85.05428 83.87200 65.26291 
[3,] 100 120.12281 121.45070 131.76266 124.25140 

你的代碼是(幾乎)相當於

prices <- Ber.reg(100,delta,sigma,rf,10,8) 

如果你真的想要一個平坦的載體這樣做是爲了輸出:

prices <- as.vector(t(prices)) 
+0

非常感謝。模擬100,000條路徑時,你的方法肯定更有效,這就是我應該做的事情 –

+0

@KristianLomheim最近出版的一本書,對我來說是一個令人大開眼界的經歷(我現在大約完成了一半)是Gillespie和Lovelace的「高效R編程」。他們的技巧之一(也可以在其他來源中找到)是「永不增長對象」,而是在可能的情況下預先分配。你可能會喜歡這本書,但我會拋出警告,說我沒有足夠的經驗來真正判斷它的質量。 –