आर

2012-04-02 6 views
5

में गर्च का सिमुलेशन मैं एक गर्च मॉडल का अनुकरण कर रहा हूं। मॉडल स्वयं बहुत प्रासंगिक नहीं है, मैं आपसे पूछना चाहता हूं कि आप आर में सिमुलेशन को अनुकूलित करने के बारे में हैं। यदि आप वेक्टरेशन के लिए कोई कमरा देखते हैं तो कुछ भी ज्यादा है, मैंने इसके बारे में सोचा है लेकिन मैं इसे नहीं देख सकता। अब तक मैं क्या है यह है:आर

करते हैं:

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

तो यह कोड है:

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)) 
    } 

मैं अब से 5 अवधि रिटर्न के अनुकरण करना चाहते हैं, तो मैं इस चलेंगे मान लीजिए कि 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)) 

मुझे लगता है कि यह काफी तेजी से चल रहा है जाने लेकिन अगर वहाँ appr की किसी भी तरह से है मैं आप से पूछना चाहते हैं एक बेहतर तरीके से इस समस्या को ओचिंग।

धन्यवाद!

+1

सुधार की गुंजाइश 'mu' और' omega' परिभाषित नहीं कर रहे हैं ऐसा लगता है। क्या आप लूप के बाहर 'zt' ले जा सकते हैं और सभी यादृच्छिक मान एक बार में उत्पन्न कर सकते हैं, फिर उनमें अनुक्रमणिका? क्या आपने 'लाइब्रेरी (कंपाइलर)' की कोशिश की है? – Chase

+1

'लाइब्रेरी (कंपाइलर); f1 <- cmpfun (randhelp) 'यह सब एक भंवर देने के लिए लेता है। कभी-कभी यह एक बड़ा बढ़ावा देता है, अन्यथा इतना नहीं ... लेकिन एक छोटा IMHO के लायक परीक्षण करने में आसान है। सौभाग्य :) – Chase

उत्तर

4

अपने लूप में संख्याओं का उपयोग करने के बजाय, आप आकार एन: के वैक्टर का उपयोग कर सकते हैं जो 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

निर्माण, सब मैं सभी को एक बार zt dfining किया गया था और rowSums(ret) को apply(ret, 1, sum) स्विचिंग बदल गया और यह काफ़ी तेज। मैं दोनों संकलित की कोशिश की, लेकिन कोई बड़ा अंतर:

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 

संभावना अभी भी :-)