2011-12-18 2 views
4

금융 시장의 백 테스트 및 실시간 분석에 사용할 대형 (150,000x7) 데이터 프레임이 있습니다. 데이터는 5 분 간격으로 투자 차량의 상태를 나타냅니다 (구멍이 있지만). 그것은 다음과 같습니다 (하지만 더 이상) :R : 시간대에 따라 데이터 프레임을 효율적으로 하위 집합으로 지정

 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에 미리로드,하지만 내 다시 테스트하는 동안 나는 두 가지 기준하여 부분 집합해야

첫 번째 기준은이다 미래로 들여다 보지 않으려면 슬라이딩 윈도우. 창은 백 테스트에서 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)  

두 번째 기준은 time of day을 통해 슬라이드와 특정 일에 입력 시간 N분 내에있는 항목 만 포함하는 하나의 창을 슬라이딩 다른이지만, .

예 : 윈도우의 크기는 2 hours이며, 입력 시간 12:00PM 다음 창이 이것은 내가 문제 파악을 데 부분이다 Time

10:00AM 사이 2:00PM 모든 행을 포함해야하는 경우.

편집 : 내 데이터에 구멍이있어 연속적인 두 행이 5 분 이상 떨어져있을 수 있습니다. 데이터는 다음과 같습니다 (매우 확대) enter image description here

창문이 간격을 통해 이동함에 따라 창 내부의 점 개수가 달라집니다. 질문에 표시된 데이터 프레임은 다음 동물원을 만드는 것입니다

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

SET @inc = -1; 
INSERT INTO MetIndListBuys (pTime,ArrayPos,M1,M2,M3,M4) 
SELECT pTime,@inc:[email protected]+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 
; 
+0

이러한 인덱스 값은 적어도 내 시간대의 오후 12시 근처에 있지 않습니다. –

+0

그래, 네가 맞아 ... 나는 단지 무작위로'12:00 PM'을 선택했다. –

답변

2

목표 시간 t0가 epoch 이후의 pTime : 초와 동일한 비율로 있다고 가정 해보십시오. 그런 다음 t0-pTime = (둘 사이의 에포크 이후 일수의 차이) + (남은 초 차이). t0 - pTime %% (1 일당 초 수)를 사용하면 시계 연산에서 초 차이가 남습니다 (차이가 음수 인 경우 줄 바꿈). 이것은 다음과 같은 함수를 제안합니다 :

SecondsPerDay <- 24 * 60 * 60 
within <- function(d, t0Sec, wMin) { 
    diff <- (d$pTime - t0Sec) %% SecondsPerDay 
    wSec <- 60 * wMin 
    return(d[diff < wSec | diff > (SecondsPerDay - wSec), ]) 
} 
+0

이 솔루션을 이해하려고하지만 R에 익숙하지 않습니다.'return' 문에서 무슨 일이 일어나는지 설명해 주시겠습니까? –

+0

부울 x의 벡터에 대해 d [x,]는 x가 TRUE 인 d 행만 가진 새로운 data.frame을 반환합니다. "|" 인수 중 적어도 하나의 i 번째 항목이 TRUE이면 결과에서 i 번째 항목이 TRUE 인 벡터 "OR"연산자입니다. 예를 들어, "diff (SecondsPerDay - wSec)"의 i 번째 항목은 "diff [i] (SecondsPerDay - wSec)"인 경우 TRUE가됩니다. (wSec에는 diff의 길이보다 짧은 길이 1이 있기 때문에 R은 "<"연산을 수행 할 때 diff의 각 값에 대해 하나의 값을 "재사용"합니다 (SecondsPerDay-wSec)과 동일합니다.) 이것이 도움이되기를 바랍니다. . –

+0

그리고 diff> (SecondsPerDay - wSec)는 diff가 실제로 "음수"였지만 시계 연산으로 둘러 쌓인 경우를 처리합니다. –

2

1)DF 경우 다음

내가 R에 (같은 테이블 구조를) 수행 할 작업을 수행 나의 MySQL의 코드 당신이 한대로 그것으로부터 객체를 가져와 zs을주는 요일로 나눕니다. 그런 다음 함수 f을 각 구성 요소 (예 : 매일)에 각각 w 점을 연속적으로 설정합니다. 예를 들어, 한 번에 2 시간 분량의 데이터에 함수를 적용하고 데이터가 5 분 간격의 데이터로 일정 간격으로 배치 된 경우 w = 24입니다 (2 시간 내에 24 시간의 5 분 간격이 있으므로). 이 경우 f은 호출 될 때마다 24 행의 데이터를 매트릭스로 전달합니다. 또한 align 아래 "right"로 설정되어 있지만 교대 align="center"로 설정 될 수 있고 ix을주는 조건은 더욱에 rollapply 참조 등 양면으로 변경 될 수있다 다음의 데이터 프레임을 이용 ?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 

그런데 반드시 this post을 읽으십시오.

2)이 교대로 할 수있는 wf 위와 같이 어디 다음 필요한 경우

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

lapply으로 sapply를 교체합니다. 또한 첫 번째 솔루션보다 짧아 보이지만 fw (두 번째는 아니지만 첫 번째에 표시됨)을 정의하는 코드를 추가하면 크게 다르지 않습니다.

하루 동안 구멍이없고 일 사이의 구멍 만 있으면 이러한 솔루션을 단순화 할 수 있습니다.

+0

답변을 주셔서 감사합니다 (그리고 링크!) 문제는 제 데이터가 정기적으로 간격을 두지 않아서 구멍이있을 수 있다는 것입니다. 처음에는 명확하게하지 않으신 것에 대해 사과드립니다. 나는 그것을 표현하기 위해 내 게시물을 편집했습니다. –

+0

구멍은 며칠 사이의 시간일까요, 아니면 일 안에 구멍이 있습니까? 그래프에서 볼 때 구멍은 며칠 사이 인 것으로 보이며, 그렇다면 위의 코드가 작동해야합니다. –

+0

또한 하루 동안 구멍이 있더라도 작동하도록 솔루션을 수정했습니다. –

관련 문제