2010-10-07 65 views
2

我試圖在時間序列的日內數據(即10秒)上實現可變指數移動平均值。通過變量,我的意思是包含在移動平均數中的窗口大小取決於另一個因素(即波動率)。我想的以下內容:高效計算「變量(包含的點數)」移動平均數R

MA(T)=α(t)的*價格(T)+(1-α(t))的MA(T-1),

其中alpha例如對應於到波動性指數的變化。

在一個巨大系列(超過100000)點的回測中,這個計算會導致我「麻煩」。我有完整的矢量alpha和價格,但對於MA的當前值,我總是需要之前計算的值。因此,到目前爲止,我沒有看到一個矢量化的解決方案?

我的另一個想法是試圖直接將實現的EMA(..,n = f())函數應用於每個數據點,因爲f()始終具有不同的值。但是到目前爲止我還沒有找到一個快速的解決方案。

如果有人可以幫我解決問題,會非常友善嗎???甚至關於如何構建變量移動平均線的其他建議也會很好。

THX很多提前 馬丁

+0

我會在接下來的幾天將這個功能添加到TTR包中。 – 2010-10-07 11:48:39

回答

0

對於時間序列,在動物園裏看到包的功能rollmean

您實際上不計算移動平均數,而是某種加權累積平均數。 (加權)移動平均線會是這樣的:

price <- runif(100,10,1000) 
alpha <- rbeta(100,1,0.5) 

tp <- embed(price,2) 
ta <- embed(alpha,2) 

MA1 <- apply(cbind(tp,ta),1,function(x){ 
    weighted.mean(x[1:2],w=2*x[3:4]/sum(x)) 
}) 

確保您重新調整權重,使他們總結到觀測的數量。

對於自己的計算,你可以嘗試這樣的:

MAt <- price*alpha 

ma.MAt <- matrix(rep(MAt,each=n),nrow=n) 
ma.MAt[upper.tri(ma.MAt)] <- 0 

tt1 <- sapply(1:n,function(x){ 
    tmp <- rev(c(rep(0,n-x),1,cumprod(rev(alpha[1:(x-1)])))[1:n]) 
    sum(ma.MAt[i,]*tmp) 
}) 

這個計算的平均值作爲墊的線性組合,由阿爾法的累計產品定義權重。

在一個旁註:我假定索引躺下1.一種非常有效的移動平均運算經由filter()介於0和

+0

感謝您的回答,但這些函數假設固定的窗口...... – Martin 2010-10-07 09:10:47

+0

@Martin:我也實現了你自己的計算。我誤解了你真正想做的事情,希望我現在明白了。乾杯 – 2010-10-07 10:00:13

3

也是可能的:

## create a weight vector -- this one has equal weights, other schemes possible 
    weights <- rep(1/nobs, nobs)  

    ## and apply it as a one-sided moving average calculations, see help(filter) 
    movavg <- as.vector(filter(somevector, weights, method="convolution", side=1)) 

即僅左側,其他選擇是可能的。

+0

我非常感謝你的提示, – Martin 2010-10-09 07:02:47

+0

看到你的名字,我知道得到真正有經驗的R用戶甚至開發者的幫助...... – Martin 2010-10-09 07:04:02

+1

快樂!認識周圍的方法是:a)對你覺得有幫助的問題進行「投票」,所以你點擊向上三角形(或者如果你不夠強烈地反對,就下來),同樣b)如果你是「接受」一個問。 – 2010-10-09 15:44:29

0

我剛剛爲TTR包添加了一個VMA函數來執行此操作。例如:

library(quantmod) # loads TTR 
getSymbols("SPY") 
SPY$absCMO <- abs(CMO(Cl(SPY),20))/100 
SPY$vma <- VMA(Cl(SPY), SPY$absCMO) 
chartSeries(SPY,TA="addTA(SPY$vma,on=1,col='blue')") 

x <- xts(rnorm(1e6),Sys.time()-1e6:1) 
y <- xts(runif(1e6),Sys.time()-1e6:1) 
system.time(VMA(x,y)) # < 0.5s on a 2.2Ghz Centrino 

從文檔一對夫婦說明:

「VMA」計算基於「W」的絕對值 值的可變長度 移動平均值。 'w'的較高(較低)值 將導致'VMA'以更快(較慢)的速度反應 。

pre-compiled binaries應在24小時內在R-forge上。