我刚刚花了一天时间调试一些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"
>
能有人告诉我我的方法错误,不过,这样我就可以继续前进?谢谢!
这可能会有帮助:http://stackoverflow.com/a/13220346/967840 – GSee
谢谢。我在想,我可以处理实际错误日期的方法是创建一个MySQL数据库,该数据库对具有错误数据的符号具有“修补程序”,其中修补程序包含预先和后期数据以进行比较。我认为你的链接可能会有帮助。干杯! – LGTrader