2014-01-21 126 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" 
> 

能有人告诉我我的方法错误,不过,这样我就可以继续前进?谢谢!

+1

这可能会有帮助:http://stackoverflow.com/a/13220346/967840 – GSee

+0

谢谢。我在想,我可以处理实际错误日期的方法是创建一个MySQL数据库,该数据库对具有错误数据的符号具有“修补程序”,其中修补程序包含预先和后期数据以进行比较。我认为你的链接可能会有帮助。干杯! – LGTrader

回答

2

你需要转换TradingCalDate

TradingDates <- as.Date(TradingCal) 

而这里的另一种方式找到TradingDates索引值不在你testData指数。

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

谢谢约书亚。这似乎让我非常接近。干杯!另外,感谢指向开始和结束函数的指针。阅读更清洁。 – LGTrader

+0

另一个发现。我需要修改我的holidayNYSE电话以包含多年的查看,ala:TradingCal = DayCal [isBizday(DayCal,holidayNYSE(YearStart:YearEnd))] – LGTrader