的幾個問題:
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))
價格< - c(價格,S)' – user31264
謝謝,這工作 –