私は15日間のバーで指数移動平均を計算しようとしていますが、各日(終わり)のバーのEMAの「進化」を見たいと思っています。つまり、私は15日間のバーを持っているということです。新しいデータが毎日入ってくると、私は新しい情報を使ってEMAを再計算したいと思います。実際には私は15日間のバーを持っていて、毎日の後に新しい15日間のバーが成長し始め、新しいバーはEMA計算に使用される予定です。WMA(加重移動平均)計算を高速化する
2012-01-01(この例では各カレンダー日のデータがあります)から始まり、2012-01-15の最後に15日の最初の完全なバーがあります。 2012-03-01に4つの完全な15日間のバーが完成したら、4バーEMA(EMA(x、n = 4))の計算を開始できます。 2012-03-02の終わりに、この瞬間までの情報を使用し、2012-03-02のEMAを計算します。2012-03-02のOHLCが進行中の15日のバーです。そこで、2012-03-02に4つのバーとバーを取り、EMA(x、n = 4)を計算します。その後、別の日を待って、進行中の新しい15日間のバーで何が起こったかを見てください(詳細については、to.period.cumulativeを参照してください)。そしてEMAの新しい価値を計算してください...そして今後15日間は...ファンクションEMAの詳細は下記をご覧ください。
以下、私が今までに何を思いついたのかを見つけてください。パフォーマンスは私には受け入れられないし、限られたR知識ではそれをもっと速くすることはできない。私のシステムでは、それは
user system elapsed
4.708 0.000 4.410
を取る
library(quantmod)
do.call.rbind <- function(lst) {
while(length(lst) > 1) {
idxlst <- seq(from=1, to=length(lst), by=2)
lst <- lapply(idxlst, function(i) {
if(i==length(lst)) { return(lst[[i]]) }
return(rbind(lst[[i]], lst[[i+1]]))
})
}
lst[[1]]
}
to.period.cumulative <- function(x, name=NULL, period="days", numPeriods=15) {
if(is.null(name))
name <- deparse(substitute(x))
cnames <- c("Open", "High", "Low", "Close")
if (has.Vo(x))
cnames <- c(cnames, "Volume")
cnames <- paste(name, cnames, sep=".")
if (quantmod:::is.OHLCV(x)) {
x <- OHLCV(x)
out <- do.call.rbind(
lapply(split(x, f=period, k=numPeriods),
function(x) cbind(rep(first(x[,1]), NROW(x[,1])),
cummax(x[,2]), cummin(x[,3]), x[,4], cumsum(x[,5]))))
} else if (quantmod:::is.OHLC(x)) {
x <- OHLC(x)
out <- do.call.rbind(
lapply(split(x, f=period, k=numPeriods),
function(x) cbind(rep(first(x[,1]), NROW(x[,1])),
cummax(x[,2]), cummin(x[,3]), x[,4])))
} else {
stop("Object does not have OHLC(V).")
}
colnames(out) <- cnames
return(out)
}
EMA.cumulative<-function(cumulativeBars, nEMA = 4, period="days", numPeriods=15) {
barsEndptCl <- Cl(cumulativeBars[endpoints(cumulativeBars, on=period, k=numPeriods)])
# TODO: This is sloooooooooooooooooow...
outEMA <- do.call.rbind(
lapply(split(Cl(cumulativeBars), period),
function(x) {
previousFullBars <- barsEndptCl[index(barsEndptCl) < last(index(x)), ]
if (NROW(previousFullBars) >= (nEMA - 1)) {
last(EMA(last(rbind(previousFullBars, x), n=(nEMA + 1)), n=nEMA))
} else {
xts(NA, order.by=index(x))
}
}))
colnames(outEMA) <- paste("EMA", nEMA, sep="")
return(outEMA)
}
getSymbols("SPY", from="2010-01-01")
SPY.cumulative <- to.period.cumulative(SPY, , name="SPY")
system.time(
SPY.EMA <- EMA.cumulative(SPY.cumulative)
)
許容実行時間が1秒未満になります...それは純粋なRを使用してこれを達成することは可能ですか?
この投稿はOptimize moving averages calculation - is it possible?にリンクしていますが、回答がありませんでした。私は今、スピードアップしたいものの詳細な説明と再現可能な例を作成することができました。私は今質問がより意味をなさないことを願っています。
これをスピードアップする方法に関するアイデアは高く評価されています。
わたしは問題があります。私たちは毎日データを持っていると言います。私は4日間のEMA(EMA(x、n = 4))を15日間の基準/バーで計算したいと思います。 to.periodを使用して毎日のデータを15日間のバーに変換します。それは簡単だろう。私が欲しいのは、毎日15日間のバーで4日間のEMAの発達を見たいと思うことです。新しいデータが入ってくるとEMAのリアルタイムグラフを(近くに)描画したいのと同じように、最後の既知のデータを完全な15日間のバーと見なします(たとえそれが3日しか「古い」であっても)。次に、あなたが今知っているものと過去15日間のすべての棒を取り、EMAを計算します。もっと良い? – Samo
ジョシュア、あなたの親切なオファーに感謝します。私はあなたに境界と開始条件を認識させるために:私は私の取引をサポートするためのプラットフォームとしてRを選んだ趣味(またはプログラミング練習)を作る小さな取引口座を持つパートタイムの不採算小売業者/プログラマーです(よく、バックテストのみ実際に)活動。私は法的実体の商業目的でこれを開発していません。私はあなたが作成したすべてのものとあなたの自由な時間に提供されるすべてのサポートに非常に感謝しています。私が他のアイデアを「無料で」得られない場合、私はあなたの親切なオファーを受け入れます。 – Samo
ジョシュア、この1つの収入、申し訳ありません。 Rを使ってCを使う方法を教えてくれてありがとう "TTRのCとFortranのコードに感謝します。 – Samo