从头开始创建交易日历

时间:2014-01-21 16:18:50

标签: r xts

我只花了一天调试一些R代码才发现我遇到的问题是由Yahoo使用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 个答案:

答案 0 :(得分:2)

您需要将TradingCal转换为Date

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))]