3

20 取引日分の 1 時間ごとの FX データに関数を適用したいと考えています (多くの例の 1 つとして)。

から始めましたrollapply(data,width=20*24,FUN=FUN,by=24)。それはうまくいっているように見えました。私は常に 480 小節が渡されたと主張することさえできました...それが私が望んでいたものではないことに気付くまで. これらの 480 バーの開始時間と終了時間は、夏時間の変更と市場の休日のために、長年にわたって変動していました。

だから、私が欲しいのは、データがある各日の 22:00 から 22:00 までを 1 日として扱う関数です。(ニューヨークの夏時間の 21:00 から 21:00 - 私のデータのタイムゾーンは UTC で、開始時刻は東部標準時の午後 5 時に定義されています)

だから、私はこれを核として独自のrollapply関数を作りました:

 ep=endpoints(data,on=on,k=k) 
 sp=ep[1:(length(ep)-width)]+1
 ep=ep[(width+1):length(ep)]
 xx <- lapply(1:length(ep), function(ix) FUN(.subset_xts(data,sp[ix]:ep[ix]),...) )

次に、これを on="days"、k=1、width=20 で呼び出しました。

これには 2 つの問題があります。

  1. 日数は取引日数ではなく日数です! そのため、通常は 4 週間分のデータではなく、3 週間弱のデータが得られます。
  2. カットオフは UTC の午前 0 時です。22:00 (または 21:00) のカットオフを使用するように変更する方法がわかりません。

更新: 上記の問題 1 は間違っています! XTSendpoints関数、暦日ではなく取引日で機能します。私がそうでないと思った理由は、タイムゾーンの問題により、週が 6 日間の取引のように見えたためです。日曜から金曜までです。タイムゾーンの問題が修正されたら (私の自己回答を参照)、 と を使用するwidth=20と、on="days"実際に 4 週間分のデータが得られます。

(一般的に重要なのは、この 4 週間の間に取引休日がある場合、4 週間 1 日分のデータ、つまり常に正確に 20 取引日分のデータを受け取ることを期待しているということです。)

データを 24 時間単位の 5 つのチャンクに分割できると考えて、データを数週間に分割する機能の開発に着手しましたが、これは間違ったアプローチのように感じられます。また、誰かがこの車輪を私の前に発明したのではないでしょうか?

4

1 に答える 1

1

夜明けを正しく取得する方法は次のとおりです。

x2=x
index(x2)=index(x2)+(7*3600)
indexTZ(x2)='America/New_York'

つまり、タイムゾーンを設定するだけで夜明けが 17:00 になります。24:00 にしたいので、最初に 7 時間を追加します。

助けを借りて: POSIXct と xts のタイムゾーン、R の GMT からの変換

完全な機能は次のとおりです。

rollapply_chunks.FX.xts=function(data,width,FUN,...,on="days",k=1){
data <- try.xts(data)

x2 <- data
index(x2) <- index(x2)+(7*3600)
indexTZ(x2) <- 'America/New_York'

ep <- endpoints(x2,on=on,k=k)    #The end point of each calendar day (when on="days").
    #Each entry points to the final bar of the day. ep[1]==0.

if(length(ep)<2){
    stop("Cannot divide data up")
}else if(length(ep)==2){  #Can only fit one chunk in.
    sp <- 1;ep <- ep[-1]
}else{
    sp <- ep[1:(length(ep)-width)]+1
    ep <- ep[(width+1):length(ep)]
}

xx <- lapply(1:length(ep), function(ix) FUN(.subset_xts(data,sp[ix]:ep[ix]),...) )
xx <- do.call(rbind,xx)   #Join them up as one big matrix/data.frame.

tt <- index(data)[ep]  #Implicit align="right". Use sp for align="left"
res <- xts(xx, tt)
return (res)
}

変更されたインデックスを使用して元のデータを分割していることがわかります。(R が内部でコピー オン ライトを使用している場合、追加のメモリ要件は、データではなくインデックスのコピーのみである必要があります。)

(法的ビット: MIT の下でライセンスされていると考えてください。ただし、GPL-2 XTS パッケージでの使用が必要な場合は、明示的な許可が与えられています。)

于 2012-08-24T01:55:30.587 に答える