2015-02-03 1 views
4

Я, похоже, не могу получить to.weekly и endpoints (который используется to.weekly) в xts, чтобы дать мне правильные дни конца недель для большинства типов данных даты. Я столкнулся с этой проблемой как с версиями XAN, так и с CRAN и R-Forge.xts to.weekly возвращает как по пятницам, так и по понедельникам в конце недели

Кажется, что это похоже, но не идентично обсуждаемой здесь проблеме: 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, моя система часовой пояс по Гринвичу и мой местный часовой пояс , и воссоздание объекта xts с использованием исходных дат, преобразованных в POSIXct. Ни одна из моих попыток не была успешной.

Единственный способ, которым я нашел, чтобы получить поведение, которое я ожидаю от 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.

------ Edit ------

Как 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 года.

+0

Это, по-видимому, проблема с часовым поясом. Ваша фактическая проблема с данными, возвращаемыми 'getSymbols'? –

+0

Другая проблема заключается в том, что 1970-01-01 используется как начало POSIXct раз. xts использует POSIX.ct и поэтому, похоже, имеет определенную чувствительность к этой дате. Если вы переместите свои даты на период в или после 1970 года, похоже, все работает. – WaltS

+0

Данные от getSymbols кажутся прекрасными. Проблема, с которой я сталкиваюсь, что я не уверен, как принудить индекс объекта xts, предоставленный 'getSymbols', в форму, которую' endpoints' или 'to.weekly' могут использовать для точного вывода в конце недели , –

ответ

2

Я согласен, что данные Quantmod кажутся прекрасными. Также кажется, что to.weekly() работает с объектами xts, такими как GSPC. Проблема, с которой вы сталкиваетесь, кажется состоящей в том, что 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 недель, Fridays приведены для 1970 дат. Вероятно, проблема связана с конечными точками() для on = «недель» и, возможно, другими периодами. Нужно ли вам работать с данными до 1970 года?

----------- обновление --------------

Я думаю, что проблема больше с конечными точками() или функции, которую он использует довольно чем что-то более основное. В любом случае, функция to.weekly.df() ниже является альтернативой to.weekly(), которая преобразует данные квантового объекта из объекта 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) 
} 

Это, кажется, дают те же результаты, как to.weekly() на пост 1970-01-01 данных и правильные результаты для периодов до этого. Дайте знать, если у вас появятся вопросы.

+0

Это замечательное наблюдение. Я редактировал свой оригинальный вопрос, чтобы отразить собственное тестирование вашего предложения, и кажется, что вы правы в отношении работы с значениями времени POSIX до 1970 года. К сожалению, мне необходимо работать с данными до начала POSIX , но я переложу свои усилия на работу с другим методом, чтобы найти еженедельные конечные точки. Я уверен, что смогу что-то понять, но любые предложения будут оценены. –

+0

Молодцы, я ценю это. Это будет очень хорошо работать для моих целей. Я отмечаю это как ответ. –

Смежные вопросы