2

日中データの時系列 (つまり 10 秒) に可変指数移動平均を実装しようとしています。変数とは、移動平均に含まれるウィンドウのサイズが別の要因 (つまりボラティリティ) に依存することを意味します。私は次のことを考えていました:

MA(t)=アルファ(t)*価格(t) + (1-アルファ(t))MA(t-1)、

ここで、アルファは、たとえば変化するボラティリティ インデックスに対応します。

巨大なシリーズ (100000 を超える) ポイントのバックテストでは、この計算によって「問題」が発生します。私は完全なベクトル alpha と price を持っていますが、MA の現在の値については、直前に計算された値が常に必要です。したがって、これまでのところ、ベクトル化されたソリューションは見当たりません????

私が持っていた別のアイデアは、実装された EMA(..,n=f()) 関数をすべてのデータ ポイントに直接適用しようとするもので、常に f() に異なる値を持たせることでした。しかし、これまでのところ、迅速な解決策は見つかりません。

誰かが私の問題を手伝ってくれたらとても親切です??? 変数の移動平均をどのように構築するかについての他の提案も素晴らしいでしょう.

事前にどうもありがとう マーティン

4

3 に答える 3

3

を介して非常に効率的な移動平均操作も可能filter()です。

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

これは左側のみでした。他の選択肢も可能です。

于 2010-10-07T16:06:48.893 に答える
0

VMAこれを行うための関数をTTRパッケージに追加しました。例えば:

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'の反応が速くなります(遅くなります)。

コンパイル済みのバイナリは、24時間以内にR-forgeに保存されます。

于 2010-10-09T23:31:17.963 に答える
0

rollmean時系列については、zoo パッケージの関数を参照してください。

実際には移動平均を計算するのではなく、ある種の加重累積平均を計算します。(加重) 移動平均は次のようになります。

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

これは、平均を MAt の線形結合として計算し、加重は alpha の累積積によって定義されます。

余談ですが、インデックスは0から1の間のどこかにあると想定しました。

于 2010-10-07T08:31:57.307 に答える