2014-01-21 1 views
3

일부 R 코드를 디버깅하는 데 드는 시간은 단지 getSymbol을 사용하여 야후가 반환 한 데이터의 누락 날짜로 인해 발생했음을 알았습니다. 내가 이것을 쓸 때 야후는 이것을 돌려 보내고있다 :처음부터 거래일 달력 만들기

  QQQ.Open QQQ.High QQQ.Low QQQ.Close QQQ.Volume QQQ.Adjusted 
2014-01-03 87.27 87.35 86.62  86.64 35723700  86.64 
2014-01-06 86.66 86.76 86.00  86.32 32073100  86.32 
2014-01-07 86.72 87.25 86.56  87.12 25860600  87.12 
2014-01-08 87.14 87.55 86.95  87.31 27197400  87.31 
2014-01-09 87.63 87.64 86.72  87.02 23674700  87.02 
2014-01-13 87.18 87.48 85.68  86.01 48842300  86.01 
2014-01-14 86.30 87.72 86.30  87.65 37178900  87.65 
2014-01-15 88.03 88.54 87.94  88.37 39835600  88.37 
2014-01-16 88.30 88.51 88.16  88.38 31630100  88.38 
2014-01-17 88.11 88.37 87.67  87.88 36895800  87.88 

누락 된 부분은 2014-01-10이다. 이 날짜는 다른 ETF의 경우 반환됩니다. 필자는 야후가 요즘 데이터를 고칠 것이라고 예상한다. (데이터는 구글에있다.)하지만 지금은 내 코드가 어떤 문제를 일으키는 것은 잘못된 것이다.

이 문제를 해결하기 위해 시장이 공개 된 모든 날짜의 데이터가 있는지 확인하기 위해 데이터를 확인하고 싶습니다. 어떤 패키지에서 이것을 수행 할 수있는 방법이 있다면, 그 정보에 감사 하겠지만, 결국에는 timeDate 패키지를 사용하여 코드를 작성하기 시작했습니다. 그러나 나는 이해하지 못하는 xts 인덱스 질문으로 끝났습니다. 코드는 다음과 같습니다.

library(timeDate) 
library(quantmod) 

MyZone = "UTC" 
Sys.setenv(TZ = MyZone) 

YearStart = "1990" 
YearEnd = "2014" 
currentYear = getRmetricsOptions("currentYear") 

dateStart = paste0(YearStart, "-01-01") 
dateEnd = paste0(YearEnd, "-12-31") 

DayCal = timeSequence(from = dateStart, to = dateEnd, by="day", zone = MyZone) 

TradingCal = DayCal[isBizday(DayCal, holidayNYSE())] 

testSym = "QQQ" 
getSymbols(testSym, src="yahoo", from = dateStart, to = dateEnd) 

testData = get(testSym) 

head(testData) 
tail(testData, n=10) 

#Save date range of data being checked 
firstIndex = index(testData)[1] 
lastIndex = index(testData)[nrow(testData)] 

#Create an xts series covering all dates 
AllDates = xts(x=rep(1, length.out=length(TradingCal)), 
      order.by=TradingCal, tzone = MyZone) 

head(AllDates) 
tail(AllDates) 

index(AllDates)[1:20] 
index(testData)[1:20] 

tzone(AllDates) 
tzone(testData) 

#Create an xts object that has all dates covered 
#by testSym but using calendar I created 
CheckData = subset(AllDates, ((index(AllDates)>=firstIndex) && 
           (index(AllDates)<=lastIndex)) 
       ) 

class(index(AllDates)) 
class(index(testData)) 

여기서 목표는 간단한 xts 개체를 만드는 데 사용할 수있는 '알려진 좋은 일정'을 만드는 것이 었습니다. 그런 다음 해당 개체의 모든 인덱스가 테스트중인 데이터에 해당 인덱스를 가지고 있는지 확인합니다. 그러나 내 인덱스가 호환되지 않는 것처럼 보일 정도로 멀지는 않습니다. 코드를 실행하면 다음과 같이 끝납니다.

> CheckData = subset(AllDates, ((index(AllDates)>=firstIndex) && (index(AllDates)<=lastIndex)) 
+) 
Error in `>=.default`(index(AllDates), firstIndex) : 
    comparison (5) is possible only for atomic and list types 
> class(index(AllDates)) 
[1] "timeDate" 
attr(,"package") 
[1] "timeDate" 
> class(index(testData)) 
[1] "Date" 
> 

누군가 내 길을 잘못 표시하여 앞으로 나아갈 수 있습니까? 감사!

TradingDates <- as.Date(TradingCal) 

그리고 여기 당신의 testData 인덱스에없는 그 TradingDates에 인덱스 값을 찾을 수있는 또 다른 방법 :

+1

유용한 정보 : http://stackoverflow.com/a/13220346/967840 – GSee

+0

감사합니다. 실제로 나쁜 날짜를 수정하는 것을 처리 할 수있는 방법은 잘못된 데이터가있는 심볼에 '패치'가있는 MySQL 데이터베이스를 만드는 것입니다. 여기서 패치는 비교할 사전 및 사후 데이터가 있습니다. 귀하의 링크가 도움이 될 것 같아요. 건배! – LGTrader

답변

2

당신은 TradingCalDate에 변환해야합니다.

AllDates <- xts(,TradingDates) 
testSubset <- paste(start(testData), end(testData), sep="/") 
CheckData <- merge(AllDates, testData)[testSubset] 
BadDates <- CheckData[is.na(rowSums(CheckData))] 
+0

감사합니다. Joshua. 이것은 나를 매우 가깝게하는 것처럼 보입니다. 건배! 또한 시작 및 끝 기능에 대한 포인터를 주셔서 감사합니다. 읽을 때 훨씬 더 깨끗합니다. – LGTrader

+0

다른 하나의 발견. 나는 holidayNYSE 콜을 수정하여, 몇 년 동안 보았는지를 포함시켜야한다고 주장했다. TradingCal = DayCal [isBizday (DayCal, holidayNYSE (YearStart : YearEnd))] – LGTrader