xts to.weekly返回星期五和星期一作为一周结束

我似乎无法在xts中获取to.weekly和endpoints(由to.weekly使用)函数,以便为大多数类型的日期数据提供正确的周末数.我对xts包的CRAN和R-Forge版本都有这个问题.

它似乎与此处讨论的问题相似但不完全相同:XTS to.weekly returns different weekly endpoints.

对于我的样本数据,to.weekly函数星期五和星期一不同的星期,默认indexAt =“endof”,星期二,indexAt =“startof”.

我正在使用S& P 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对象.我的尝试都没有成功.

我发现获得我期望的行为的唯一方法就是创建一个日期为矢量的字符串,然后将它们转换为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年同期相同.果然,对于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或端点的问题,而是时间格式的结构问题.我需要找到一种不同的方法来确定1970年之前的几周的终点.

最佳答案 我同意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 =“周”,可能还有其他时期.您是否有必要在1970年之前处理数据?

———–更新————–

我认为问题更多的是endpoints()或它使用的函数而不是更基本的东西.无论如何,下面的to.weekly.df()函数是to.weekly()的替代方法,它将quantmod数据从xts对象转换为数据框,日期为列.它还添加了一个列,其中包含从1970-01-01开始计算周数的周数,并将星期日作为一周的第一天.它使用周数将数据帧拆分为几周,然后激发每周获取摘要数据并将其作为数据框返回.还有一个小的辅助函数可以将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()的结果相同.如果您有任何疑问,请告诉我.

点赞