【发布时间】:2015-04-03 07:51:24
【问题描述】:
我似乎无法在 xts 中获得 to.weekly 和 endpoints(由 to.weekly 使用)函数来为大多数类型的日期数据提供正确的星期结束天数。 xts 包的 CRAN 和 R-Forge 版本都存在这个问题。
这似乎与此处讨论的问题相似但不完全相同:XTS to.weekly returns different weekly endpoints。
对于我拥有的示例数据,to.weekly 函数为不同周的周五和周一,默认为indexAt="endof",周二为indexAt="startof"。
我使用的是标准普尔 500 指数的每日回报率:
library(quantmod)
getSymbols("^GSPC", from="1961-12-15", to="1962-01-15", src="yahoo")
weekdays(index(to.weekly(GSPC))) # Fridays and mondays
[1] "Monday" "Friday" "Friday" "Monday" "Monday"
我尝试将对象的时区从我的时区更改为 UTC,将我的系统时区更改为 UTC 和我的本地时区,并使用转换为 POSIXct 的原始日期重新创建 xts 对象。我的尝试都没有成功。
我发现从to.weekly 获得我期望的行为的唯一方法是创建一个日期向量作为字符串,然后将它们转换为 POSIXct 而不是 Date 以用作新 xts 的索引目的。不幸的是,我无法让它与我的实际数据一起使用。
dates <-
c("1961-12-15","1961-12-18","1961-12-19","1961-12-20","1961-12-21","1961-12-22",
"1961-12-26","1961-12-27","1961-12-28","1961-12-29","1962-01-02","1962-01-03",
"1962-01-04","1962-01-05","1962-01-08","1962-01-09","1962-01-10","1962-01-11",
"1962-01-12","1962-01-15")
data <- rep(1, length(dates))
p <- xts(data, order.by=as.POSIXct(dates))
d <- xts(data, order.by=as.Date(dates))
# Last day in the week, as expected
weekdays(index(to.weekly(p)))
# [1] "Friday" "Friday" "Friday" "Friday" "Friday" "Monday"
# First day in the week, as expected
weekdays(index(to.weekly(p, indexAt="startof")))
# [1] "Friday" "Monday" "Tuesday" "Tuesday" "Monday" "Monday"
# Mix of first and last days, not expected
weekdays(index(to.weekly(d)))
# [1] "Monday" "Friday" "Friday" "Monday" "Monday"
由于对日期使用 POSIXct 值似乎适用于字符值,我想我会尝试使用价格数据。
GSPCp <- xts(coredata(GSPC), order.by=as.POSIXct(index(GSPC)))
weekdays(index(to.weekly(GSPCp))) # Not as expected
[1] "Monday" "Friday" "Friday" "Monday" "Monday"
我怀疑问题出在时区(和缺乏经验)问题上,但我已经用尽了所有我能想到的方法来让它返回这个数据系列中每周结束的值。
我目前正在运行 xts_0.9.874。
-----编辑------
正如 WaltS 在下面指出的那样,POSIXct 使用 Unix 时间(从 1970-01-01 开始)这一事实似乎是个问题。在此之前的日期可能会出现奇怪的行为。
我今天做了一些实验,添加了 17 年和 4 个闰日,将指数改为 1978-1979 年,这与 1961-1962 年的同一天数相同。果然,to.weekly 可以很好地处理转移到 1970 年之后某个点的相同数据。
d <- GSPC
index(d) <- index(d)+365*17+4 # 1978-1979
weekdays(index(to.weekly(d)))
[1] "Friday" "Friday" "Friday" "Friday" "Friday" "Monday"
由于这似乎是使用 POSIX 时间的内在品质,我认为这不再是我使用 to.weekly 或 endpoints 的问题,而是时间格式的结构性问题.我需要找到一种不同的方法来识别 1970 年之前日期的周端点。
【问题讨论】:
-
这似乎是一个时区问题。
getSymbols返回的数据是你的实际问题吗? -
另一个问题似乎是1970-01-01被用作POSIXct时代的起源。 xts 使用 POSIX.ct,因此似乎对这个日期有些敏感。如果您将日期移至 1970 年或之后的某个时期,则似乎可行。
-
getSymbols 的数据似乎没问题。我遇到的问题是我不确定如何将
getSymbols提供的xts 对象的索引强制转换为endpoints或to.weekly可以用来在几周结束时提供准确输出的形式。