2012-04-02 8 views
5

Tôi đang thực hiện mô phỏng mô hình GARCH. Bản thân mô hình không quá liên quan, những gì tôi muốn hỏi bạn là tối ưu hóa mô phỏng trong R. Hơn bất cứ thứ gì nếu bạn thấy bất kỳ phòng nào cho vector hóa, tôi đã nghĩ về nó nhưng tôi không thể nhìn thấy nó. Cho đến nay những gì tôi có là thế này:Mô phỏng GARCH trong R

Lết:

# ht=cond.variance in t 
# zt= random number 
# et = error term 
# ret= return 
# Horizon= n periods ahead 

Vì vậy, đây là mã:

randhelp= function(horizon=horizon){ 
    ret <- zt <- et <- rep(NA,horizon)#initialize ret and zt et 
    for(j in 1:horizon){ 
     zt[j]= rnorm(1,0,1) 
     et[j] = zt[j]*sqrt(ht[j]) 
     ret[j]=mu + et[j] 

     ht[j+1]= omega+ alpha1*et[j]^2 + beta1*ht[j] 
    } 
    return(sum(ret)) 
    } 

tôi muốn làm một mô phỏng của lợi nhuận 5 giai đoạn từ nay, vì vậy tôi sẽ chạy điều này giả sử 10000.

#initial values of the simulation 
ndraws=10000 
horizon=5 #5 periods ahead 
ht=rep(NA,horizon) #initialize ht 
ht[1] = 0.0002 
alpha1=0.027 
beta1 =0.963 
mu=0.001 
omega=0 


sumret=sapply(1:ndraws,function(x) randhelp(horizon)) 

Tôi nghĩ rằng điều này đang chạy khá nhanh nhưng tôi muốn hỏi bạn có cách nào appr không oaching vấn đề này một cách tốt hơn.

Cảm ơn!

+1

Trông như 'mu' và 'omega' không được định nghĩa. Bạn có thể di chuyển 'zt' bên ngoài vòng lặp và tạo tất cả các giá trị ngẫu nhiên cùng một lúc, sau đó chỉ mục vào chúng? Bạn đã thử 'thư viện (trình biên dịch) 'chưa? – Chase

+1

'thư viện (trình biên dịch); f1 <- cmpfun (randhelp) 'là tất cả những gì cần thiết để cung cấp cho nó một xoáy. Đôi khi nó mang lại một sự thúc đẩy lớn, những lúc khác không quá nhiều ... nhưng dễ dàng để thử nghiệm đáng để IMHO ngắn ngủi. Chúc may mắn :) – Chase

Trả lời

4

Thay vì sử dụng các số trong vòng lặp của mình, bạn có thể sử dụng các vectơ có kích thước N: để loại bỏ vòng lặp ẩn trong sapply.

randhelp <- function(
    horizon=5, N=1e4, 
    h0 = 2e-4, 
    mu = 0, omega=0, 
    alpha1 = 0.027, 
    beta1 = 0.963 
){ 
    ret <- zt <- et <- ht <- matrix(NA, nc=horizon, nr=N) 
    ht[,1] <- h0 
    for(j in 1:horizon){ 
    zt[,j] <- rnorm(N,0,1) 
    et[,j] <- zt[,j]*sqrt(ht[,j]) 
    ret[,j] <- mu + et[,j] 
    if(j < horizon) 
     ht[,j+1] <- omega+ alpha1*et[,j]^2 + beta1*ht[,j] 
    } 
    apply(ret, 1, sum) 
} 
x <- randhelp(N=1e5) 
5

xây dựng ứng phó Vincent, tất cả tôi đã thay đổi được dfining zt tất cả cùng một lúc và chuyển đổi apply(ret, 1, sum) để rowSums(ret) và nó tăng tốc lên khá một chút. Tôi đã cố gắng cả hai biên soạn, nhưng không có diff chính:

randhelp2 <- function(horizon = 5, N = 1e4, h0 = 2e-4, 
         mu = 0, omega = 0, alpha1 = 0.027, 
         beta1 = 0.963){ 
    ret <- et <- ht <- matrix(NA, nc = horizon, nr = N) 
    zt <- matrix(rnorm(N * horizon, 0, 1), nc = horizon) 
    ht[, 1] <- h0 
    for(j in 1:horizon){ 
     et[, j] <- zt[, j] * sqrt(ht[, j]) 
     ret[,j] <- mu + et[, j] 
     if(j < horizon) 
      ht[, j + 1] <- omega + alpha1 * et[, j]^2 + beta1 * ht[, j] 
    } 
    rowSums(ret) 
} 

system.time(replicate(10,randhelp(N=1e5))) 
    user system elapsed 
    7.413 0.044 7.468 

system.time(replicate(10,randhelp2(N=1e5))) 
    user system elapsed 
    2.096 0.012 2.112 

khả năng vẫn còn chỗ cho sự cải thiện :-)