2011-09-30 10 views
3

나는 quantmod를 통해 약간의 yahoo finance 데이터를 연구 중이다.Rollapply & xts. 창에서 최대 값 시간을 출력 할 수 있습니까?

데이터의 롤링 기간에 대한 Max 및 Min 가격뿐만 아니라 그 최고치 및 최저치의 정확한 Timestamp도 어떻게 결정합니까? 나는 rollapply로 which.max()를 시도했다. 그러나 이는 롤링 윈도우 자체의 값의 seq만을보고하고 타임 스탬프를 보유하는 행의 .index()는보고하지 않는다.

누구든지 해결책을 제안 할 수 있습니까?

재현 예를 들어 아래이며, 일부 샘플 출력은 내가 가지고 싶습니다 ...

> library(quantmod) 
> getSymbols("BET.L") 
xmin <- rollapply(BET.L$BET.L.Close,10,min, ascending = TRUE) 
names(xmin) <- "MinClose" 

xmax <- rollapply(BET.L$BET.L.Close,10,max, ascending = TRUE) 
names(xmax) <- "MaxClose" 

head(cbind(BET.L$BET.L.Close, as.xts(xmax), as.xts(xmin)),15) 
      BET.L.Close MaxClose MinClose 
2010-10-22  1550.00  NA  NA 
2010-10-25  1546.57  NA  NA 
2010-10-26  1545.00  NA  NA 
2010-10-27  1511.26  NA  NA 
2010-10-28  1490.00 1550.00  1395 
2010-10-29  1435.00 1546.57  1381 
2010-11-01  1447.00 1545.00  1347 
2010-11-02  1420.00 1511.26  1347 
2010-11-03  1407.00 1490.00  1347 
2010-11-04  1395.00 1447.00  1347 
2010-11-05  1381.00 1447.00  1347 
2010-11-08  1347.00 1490.00  1347 
2010-11-09  1415.00 1490.00  1347 
2010-11-10  1426.00 1490.00  1347 
2010-11-11  1430.00 1490.00  1347 

과 나는 같은 것을 보일 것 생성하려는 출력 유형 :

  BET.L.Close MaxClose MinClose MaxDate MinDate 
2010-10-22  1550.00  NA  NA  NA  NA 
2010-10-25  1546.57  NA  NA  NA  NA 
2010-10-26  1545.00  NA  NA  NA  NA 
2010-10-27  1511.26  NA  NA  NA  NA 
2010-10-28  1490.00 1550.00  1395 2010-10-22 2010-11-04 
2010-10-29  1435.00 1546.57  1381 2010-10-25 2010-11-05 

필자가 취하는 모든 접근법은 가격이 중복되는 사실을 고려해야하며,이 경우에는 창에서 최대 값의 첫 번째 값과 마지막 최소 값을 취하도록 지시합니다.

답변

3

이 계획에는 큰 문제가 있습니다. coredata 요소는 행렬이므로 모든 요소는 클래스가없고 동일한 모드 여야합니다. xts 객체에 Date 클래스의 객체를 가질 수는 없으며 문자 클래스를 고수하면 다른 모든 요소도 강제로 문자가됩니다. 그래서 그걸 이해하면 which.max 결과를 계산하고, which.max- 값이 오프셋 인 행 번호를 생성하고 마지막으로 그 결과를 객체의 index에 대한 색인으로 사용하여 무언가를 수행 할 수 있습니다. (의 이중 용도 죄송합니다 "하는"과 "인덱스". 의미는 코드에서 분명하다 바랍니다.)

xmin <- rollapply(BET.L$BET.L.Close,10,min) 
names(xmin) <- "MinClose" 

xmax <- rollapply(BET.L$BET.L.Close,10,max, ascending = TRUE) 
names(xmax) <- "MaxClose" 
head(dat <- cbind(BET.L$BET.L.Close, as.xts(xmax), as.xts(xmin)),15)) 

w.MaxDate <- rollapply(BET.L$BET.L.Close,10, which.max) 
names(w.MaxDate) <- "w.maxdt" 
dat <- cbind(dat, as.xts(w.MaxDate)) 
dat<-cbind(dat,as.xts(seq.int(236), order.by=index(dat))) 
> head(dat) 
      BET.L.Close MaxClose MinClose  w.maxdt ..2 
2010-10-22  1550.00  NA  NA   NA 1 
2010-10-25  1546.57  NA  NA   NA 2 
2010-10-26  1545.00  NA  NA   NA 3 
2010-10-27  1511.26  NA  NA   NA 4 
2010-10-28  1490.00 1550.00  1395    1 5 
2010-10-29  1435.00 1546.57  1381    1 6 
dat$maxdate <- xts(index(dat)[dat$..2-5+dat$BET.L.Close.1], order.by=index(dat)) 
> head(dat) 
      BET.L.Close MaxClose MinClose  w.maxdt ..2 maxdate 
2010-10-22  1550.00  NA  NA   NA 1  NA 
2010-10-25  1546.57  NA  NA   NA 2  NA 
2010-10-26  1545.00  NA  NA   NA 3  NA 
2010-10-27  1511.26  NA  NA   NA 4  NA 
2010-10-28  1490.00 1550.00  1395    1 5 14904 
2010-10-29  1435.00 1546.57  1381    1 6 14907 

그래서 나는 당신에게 날짜의 정수 표현을 얻었다. 당신은 그들이 바로 입력 벡터의 머리를보고 올바른 값을 것을 볼 수 있습니다

> head(index(dat)[dat$..2-5+dat$w.maxdt]) 
[1] NA   NA   NA   NA   "2010-10-22" "2010-10-25" 
+0

안녕 DWIN, 정말 너무 감사합니다, XTS 객체의 날짜 클래스 개체를 가지고 있지에 대한 점을 인정하지 않았다 그걸 지적 해 주려고. 나는 상쇄 접근법을 좋아하고 이것이 내가가는 길이라고 생각한다. 도와 줘서 고마워. – Minkymorgan

0

당신이 객체 원래 XTS에 또 하나의 숫자 열 나타내는 날짜를 추가 한 다음 rollapply 사용할 수 있다고 생각합니다.

require(quantmod) 
getSymbols("BET.L") 

## add Date as numeric 
BET.L$dt <- as.numeric(format(index(BET.L), "%Y%m%d")) 
xmin <- rollapply(BET.L, 10, align='r', by.column = FALSE, 
    FUN = function(dw) 
     return(dw[which.min(dw[,'BET.L.Close']), c('BET.L.Close', 'dt')]) 
    ) 
xmax <- rollapply(BET.L, 10, align='r', by.column = FALSE, 
    FUN = function(dw) 
     return(dw[which.max(dw[,'BET.L.Close']), c('BET.L.Close', 'dt')]) 
    ) 

xminmax <- cbind(xmin, xmax) 
## to get back to dates use: 
## as.Date(as.character(as.integer(xminmax$dt.xmin)), format = "%Y%m%d") 

## left edge of data window 
x_ldt <- rollapply(BET.L$dt, 10, align='r', function(dw) return(dw[1])) 

결과 : 아래의 예에서 xminmax

head(xminmax) 
      BET.L.Close.xmin dt.xmin BET.L.Close.xmax dt.xmax 
2010-11-04    1395 20101104   1550.00 20101022 
2010-11-05    1381 20101105   1546.57 20101025 
2010-11-08    1347 20101108   1545.00 20101026 
2010-11-09    1347 20101108   1511.26 20101027 
2010-11-10    1347 20101108   1490.00 20101028 
2010-11-11    1347 20101108   1447.00 20101101 
+0

감사합니다. Andrei! 나는 이것을 시험 할 것이다. – Minkymorgan