【问题标题】:xts to.weekly returns both Fridays and Mondays as the end of the weekxts to.weekly 返回周五和周一作为一周的结束
【发布时间】:2015-04-03 07:51:24
【问题描述】:

我似乎无法在 xts 中获得 to.weeklyendpoints(由 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.weeklyendpoints 的问题,而是时间格式的结构性问题.我需要找到一种不同的方法来识别 1970 年之前日期的周端点。

【问题讨论】:

  • 这似乎是一个时区问题。 getSymbols返回的数据是你的实际问题吗?
  • 另一个问题似乎是1970-01-01被用作POSIXct时代的起源。 xts 使用 POSIX.ct,因此似乎对这个日期有些敏感。如果您将日期移至 1970 年或之后的某个时期,则似乎可行。
  • getSymbols 的数据似乎没问题。我遇到的问题是我不确定如何将getSymbols 提供的xts 对象的索引强制转换为endpointsto.weekly 可以用来在几周结束时提供准确输出的形式。

标签: r xts quantmod posixct


【解决方案1】:

我同意 Quantmod 数据看起来不错。似乎 to.weekly() 也适用于像 GSPC 这样的 xts 对象。你遇到的问题似乎 即 1970-01-01 被用作 POSIXct 时代的起源。为了更好地说明这一点,请考虑示例

GSPC1970 <- getSymbols("^GSPC", from="1970-12-15", to="1971-03-19", src="yahoo", auto.assign=FALSE)
to.weekly(GSPC1970)
weekdays(index(to.weekly(GSPC1970)))
 [1] "Friday"   "Thursday" "Thursday" "Friday"   "Friday"   "Friday"   "Friday"   "Friday"   "Friday"   "Friday"   "Friday"   "Friday"  
[13] "Friday"   "Friday" 

输出如预期的那样。特别是,将 1969 年跨入 1970 年的时期

GSPC1969 <- getSymbols("^GSPC", from="1969-11-15", to="1970-03-20", src="yahoo", auto.assign=FALSE)
to.weekly(GSPC1969)
weekdays(index(to.weekly(GSPC1969)))
 [1] "Monday" "Monday" "Monday" "Monday" "Monday" "Monday" "Friday" "Friday" "Friday" "Friday" "Friday" "Friday" "Friday" "Friday"
[15] "Friday" "Friday" "Friday" "Friday"

星期一作为 1969 周的周结束返回,而星期五则作为 1970 日期的日期返回。问题可能出在 on = "weeks" 和其他时间段的 endpoints() 上。您是否有必要使用 1970 年之前的数据?

-----------更新--------------

我认为问题更多在于 endpoints() 或其使用的函数,而不是更基本的东西。无论如何,下面的函数 to.weekly.df() 是 to.weekly() 的替代方法,它将 quantmod 数据从 xts 对象转换为以日期为列的数据框。它还添加了一列,其中包含从 1970 年 1 月 1 日开始计算周数的周数,并将星期日作为一周的第一天。它使用周数将数据框拆分为周,然后 sapply 获取每周的摘要数据并将其作为数据框返回。还有一个小辅助函数可以将 xts 数据转换为 data.frame。

xts2df <- function(xts_data) data.frame(date=index(xts_data),coredata(cbind(xts_data, week=(as.numeric(index(xts_data))+5)%/%7)))

to.weekly.df <- function(xts_data) {
  df <- xts2df(xts_data)

  weekly <- t(sapply(split(df, df$week), 
                 function(x) c(date=tail(x$date,1), Open=x[1,2], High=max(x[,3]), 
                               Low=min(x[,4]), Close=tail(x[,5], 1),
                               Volume=sum(x[,6]), Adjusted=tail(x[,7],1) ) ) )
 weekly <- data.frame(date=as.Date(weekly[,1]), weekly[,-1])
 return(weekly)
}

对于 1970-01-01 之后的数据,这似乎与 to.weekly() 给出了相同的结果,并且在此之前的时期给出了正确的结果。如果您有任何问题,请告诉我。

【讨论】:

  • 这是一个很好的观察。我编辑了我的原始问题以反映我自己对您的建议的测试,看来您在使用 1970 年之前的 POSIX 时间值方面是正确的。不幸的是,我有必要使用 POSIX 时间开始之前的数据,但我将努力寻找另一种方法来查找每周端点。我相信我能想出办法,但任何建议都将不胜感激。
  • 干得好,我很感激。这将非常适合我的目的。我将此标记为答案。
猜你喜欢
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
相关资源
最近更新 更多