2012-07-21 3 views
2

내 데이터는 현재 행당 일별 주가의 xts 또는 zoo 개체이며 각 열은 다른 회사입니다.xts에 적용 함수

library(quantmod) 
getSymbols("AAPL;MSFT;YHOO") 
closePrices <- merge(Cl(AAPL),Cl(MSFT),Cl(YHOO)) 

저는 아직 R에 익숙하지 않으며 이것을 재생하는 데 도움이 필요합니다. Excel function. 각 부분에 대한 값은 정확했지만, denomJ에 대한 잘못된 날짜로 정렬되어 있기 때문에

dailyDiff <- abs(diff(closePrices,1)) 
numerJ <- diff(closePrices,10) 
denomJ <- as.xts(rollapply(dailyDiff,11, sum)) 
idx <- abs(numerJ/denomJ) 

이 좋았어요 : 내 첫번째 생각은 분자와 분모로 기능을 분리 한 다음 인덱스를 계산하는 것이다. 예를 들어, numerJ의 꼬리는 2012 년 6 월 21 일로, denomJ의 꼬리는 2012 년 6 월 14 일으로 이동합니다.

내가 찾고 있어요 출력은 다음과 같습니다

  • 2012년 6월 21일 = 0.11
  • 2012년 6월 20일 = 0.27
  • 6/19/2012 = 0.46
  • 2012년 6월 18일 = 0.39
  • 2012년 6월 15일 = 0.22
+1

이제 예제를 재현 할 수있게되었으므로 질문을 다시 방문하여 예상되는 결과를 제공 할 수 있습니까? 또한 "날짜가 잘못되었습니다"및 "idx에 잘못된 값이 있습니다"라는 의미를 설명하십시오. –

+0

감사합니다. 수정되었습니다. 이 두 xts/zoo 객체 인 numerJ와 denomJ가 정확한 숫자 (numerJ @ 6/21 = 5.95 및 denomJ @ 6/21 = 53.25)를 생성하고 있음을 알기를 바랍니다. 아직 rollapply 함수의 결과로, 내가 원하지 않는 날짜 값에 정렬합니다. – jonnie

+0

나는 당신의 질문을 전혀 이해하지 못합니다. Excel 기능을 사용하면 라벨이 잘못 붙여져있어 혼란 스럽습니다. 다시 : 귀하의 최근 코멘트, 어디서나 53.25 번호를 볼 수 없습니다. 즉, 날짜 정렬에 대한 불만을 토대로,'rollapply' 호출에서'align = right'를 사용해야하거나 ('rollapplyr' 래퍼를 사용하는 것) 거의 확실합니다. '? rollapply'을보십시오 – GSee

답변

2

그것은 당신의 문제는 정확한 날엔없이 정확히 얘기하기 어렵다 그러나 문제는 rollapply 인 것으로 보입니다. rollapplypartial 인수가 TRUE으로 설정되지 않은 경우에만 전체 간격에 함수를 적용합니다. 당신이 할하려는 (에 lag 인수의 사용에주의 당신은 diff 및 중 runSum 또는 rollapplyr 나는이 생각

#Get the data 
library(quantmod) 
getSymbols("AAPL") 

의 조합을 사용할 수 있습니다

require(zoo) 
#make up some data 
mat <- matrix(1:100,ncol=2) 
colnames(mat) <- c("x1","x2") 
dates <- seq.Date(from=as.Date("2010-01-01"),length.out=50,by="1 day") 
zoo.obj <- zoo(mat,dates) 
#apply the funcitons 
numerJ <- diff(zoo.obj,10) #dates okay 
denomJ <- rollapply(zoo.obj,11, sum,partial=TRUE) #right dates 
denomJ2 <- rollapply(zoo.obj,11,sum) #wrong dates 
index <- abs(numerJ/denomJ) #right dates 
+0

감사합니다. 나는 문제가 rollapply와 함께 있다고 생각한다. 나는 가장 적합한 해결책이 (x, y)를 받아들이는 함수의 형태로 올 것이라고 생각하지만 여전히 확실하지 않다. – jonnie

2

다음 예를 고려해야 diff.xtsrunSumn 인수)

out <- diff(Cl(AAPL), lag=10)/runSum(abs(diff(Cl(AAPL))), n=11) 
tail(out['/2012-06-21']) 
#   AAPL.Close 
#2012-06-14 -0.1047297 
#2012-06-15 0.2176938 
#2012-06-18 0.3888185 
#2012-06-19 0.4585821 
#2012-06-20 0.2653782 
#2012-06-21 0.1117371 
rollapplyr 당신이 찾고있는 답없는 이유를 질문의 가까운 검토시

편집

, 이해가 안 돼요. 내가 정확히을 rollapplyr으로 변경하는 것을 제외하고는 코드를 그대로 사용하면 찾고있는 결과물처럼 보입니다. 또한

dailyDiff <- abs(diff(closePrices,1)) 
numerJ <- diff(closePrices,10) 
denomJ <- as.xts(rollapplyr(dailyDiff,11, sum)) 
idx <- abs(numerJ/denomJ) 
#   AAPL.Close MSFT.Close YHOO.Close 
#2012-06-14 0.1047297 0.03826531 0.06936416 
#2012-06-15 0.2176938 0.35280899 0.25581395 
#2012-06-18 0.3888185 0.33161954 0.31372549 
#2012-06-19 0.4585821 0.47096774 0.34375000 
#2012-06-20 0.2653782 0.32644628 0.23750000 
#2012-06-21 0.1117371 0.18997912 0.10256410 

는주의 모두 numerJdenomJ 당신이 (align="right"으로 rollapply을 사용하는 것과 동일하다) rollapplyr를 사용하는 경우 같은 날짜에 모두 끝

end(numerJ); end(denomJ) 
#[1] "2012-07-20" 
#[1] "2012-07-20" 

야후 버그 그

어쩌면 당신이보고있는 문제는 때로는 - 예를 들어, 지금 - 야후가 마지막 (chron ologically 말하기) 행. 그렇다면 계산을 위해 데이터를 사용하기 전에 중복 행을 삭제하십시오.

tidx <- tail(index(closePrices), 2) 
if(tidx[1] == tidx[2]) { 
    closePrices <- closePrices[-NROW(closePrices), ] 
}