4

金融市場のバックテストとリアルタイム分析に使用する予定の大きな (150,000x7) データフレームがあります。データは、5 分間隔での投資車両の状態を表します (穴は存在しますが)。次のようになります (ただし、はるかに長くなります)。

        pTime     Time  Price       M1       M2        M3        M4
1  1212108300 20:45:00 1.5518 12.21849 -0.37125   4.50549 -31.00559
2  1212108900 20:55:00 1.5516 11.75350 -0.81792  -1.53846 -32.12291
3  1212109200 21:00:00 1.5512 10.75070 -1.47438  -8.24176 -34.35754
4  1212109500 21:05:00 1.5514 10.23529 -1.06044  -8.46154 -33.24022
5  1212109800 21:10:00 1.5514  9.74790 -1.02759 -10.21978 -33.24022
6  1212110100 21:15:00 1.5513  9.31092 -1.17076 -11.97802 -33.79888
7  1212110400 21:20:00 1.5512  8.84034 -1.28428 -13.62637 -34.35754
8  1212110700 21:25:00 1.5509  8.07843 -1.63715 -18.24176 -36.03352
9  1212111000 21:30:00 1.5509  7.39496 -1.49198 -20.65934 -36.03352
10 1212111300 21:35:00 1.5512  7.65266 -1.03717 -18.57143 -34.35754

データは R に事前に読み込まれますが、バックテスト中に次の 2 つの基準でサブセット化する必要があります。

最初の基準は、将来をのぞき見ることを避けるためのスライディング ウィンドウです。ウィンドウは、バックテストの新しい 5 分間隔ごとに、ウィンドウ全体が 5 分ずつ未来にシフトするようなものでなければなりません。この部分は次のように実行できます。

require(zoo)
zooser <- zoo(x=tser$Close, order.by=as.POSIXct(tser$pTime, origin="1970-01-01"))
window(zooser, start=A, end=B)    

2 番目の基準は別のスライディング ウィンドウですが、特定の日の入力時間から数分time of day以内のエントリのみをスライドして含めるものです。N

例: ウィンドウのサイズが2 hoursで、入力時間がの場合、ウィンドウにはとの間の12:00PMすべての行が含まれている必要があります。Time10:00AM2:00PM

これは私が理解するのに苦労している部分です。

編集: 私のデータには穴があり、2 つの連続する行が 5 分以上離れている可能性があります。データは次のようになります (非常に拡大) ここに画像の説明を入力

ウィンドウがこれらのギャップを通過すると、ウィンドウ内のポイントの数が変化するはずです。

以下は、R でやりたいことを実行する MySQL コードです (同じテーブル構造)。

SET @qTime = Time(FROM_UNIXTIME(SAMP_endTime));

SET @inc = -1;
INSERT INTO MetIndListBuys (pTime,ArrayPos,M1,M2,M3,M4)
SELECT pTime,@inc:=@inc+1,M1,M2,M3,M4
 FROM mergebuys USE INDEX (`y`) WHERE  pTime BETWEEN SAMP_startTime AND SAMP_endTime 
AND TIME_TO_SEC(TIMEDIFF(Time,@qTime))/3600 BETWEEN 0-HourSpan AND HourSpan
;  
4

2 に答える 2

3

ターゲット時間 t0 が pTime と同じスケールであるとします。エポックからの秒数です。次に、t0 - pTime = (2 つのエポック以降の日数の差) + (残りの秒数の差)。t0 - pTime %% (num. seconds per day) を取得すると、時計の計算に秒単位の差が残ります (差が負の場合はラップアラウンド)。これは、次の機能を示唆しています。

SecondsPerDay <- 24 * 60 * 60
within <- function(d, t0Sec, wMin) {
  diff <- (d$pTime - t0Sec) %% SecondsPerDay
  wSec <- 60 * wMin
  return(d[diff < wSec | diff > (SecondsPerDay - wSec), ])
}
于 2011-12-19T10:06:08.170 に答える
3

1)が質問に示されているデータ フレームである場合DFは、それから動物園オブジェクトを作成し、それをzs. 次に、各コンポーネント (つまり、毎日)の各連続するポイント セットに対するlapply関数。たとえば、関数を一度に 2 時間のデータに適用する場合、データが 5 分間のデータ間隔で規則的に配置されている場合、w = 24 になります (2 時間には 5 分間の期間が 24 あるため)。このような場合、呼び出されるたびに 24 行のデータが行列として渡されます。また、下に設定されていますが、交互に設定することができ、条件付与は両面などに変更できます。詳細については、次を参照してください。fwfalign"right"align="center"ixrollapply?rollapply

library(zoo)
z <- zoo(DF[-2], as.POSIXct(DF[,1], origin = "1970-01-01"))
w <- 3 # replace this with 24 to handle two hours at a time with five min data
f <- function(x) {
            tt <- x[, 1]
            ix <- tt[w] - tt <= w * 5 * 60 # RHS converts w to seconds
            x <- x[ix, -1]
            sum(x) # replace sum with your function
    }
out <- rollapply(z, w, f, by.column = FALSE, align = "right")

質問のデータ フレームを使用すると、次のようになります。

> out
$`2008-05-30`
2008-05-30 02:00:00 2008-05-30 02:05:00 2008-05-30 02:10:00 2008-05-30 02:15:00 
          -66.04703           -83.92148           -95.93558          -100.24924 
2008-05-30 02:20:00 2008-05-30 02:25:00 2008-05-30 02:30:00 2008-05-30 02:35:00 
         -108.15038          -121.24519          -134.39873          -140.28436 

ところで、この投稿を必ず読んでください。

2)wこれは、次のように行うこともできますf

n <- nrow(DF)
m <- as.matrix(DF[-2])
sapply(w:n, function(i) { m <- m[seq(length = w, to = i), ]; f(m) })

sapply必要に応じてを置き換えlapplyます。また、これは最初のソリューションよりも短いように見えるかもしれませんが、and を定義するコードを追加するfw(最初のソリューションには表示されますが、2 番目のソリューションには表示されません)、大きな違いはありません。

日中は穴がなく、日中は穴しかない場合、これらのソリューションは単純化できます。

于 2011-12-18T21:43:58.840 に答える