2016-08-16 8 views
0

Я хочу привязывать ежедневные и еженедельные данные непрерывно (без NA) Я использую этот код для этой цели, но у меня есть две проблемы.Непрерывные cbind-ed ежедневные и еженедельные данные с R?

library(quantmod) 
aapl=getSymbols("AAPL",from="2015-01-01",auto.assign=F) 
d_aapl=Cl(aapl)/Op(aapl) 
head(d_aapl) 
w_aapl=to.weekly(d_aapl) 

head(w_aapl) 
res=cbind(d_aapl,Cl(w_aapl)) 
head(res,8) 

первая проблема с w_aapl=to.weekly(d_aapl) логически она должна выполнять только функцию to.weekly только d_aapl переменным, но ее выполнение его все столбцы, кроме объема и регулируется рядом. что здесь происходит?

  d_aapl.Open d_aapl.High d_aapl.Low d_aapl.Close 
2015-01-02 0.9815064 0.9815064 0.9815064 0.9815064 
2015-01-09 0.9811617 1.0243522 0.9811617 0.9941422 
2015-01-16 0.9702487 1.0069699 0.9702487 0.9902831 
2015-01-23 1.0081603 1.0194087 1.0055072 1.0060552 
2015-01-30 0.9943731 1.0221802 0.9708237 0.9895270 
2015-02-06 1.0049131 1.0089451 0.9909182 0.9909182 

Вторая проблема заключается в выходе res. После колонки связывания я ожидал несколько дней будет заполняться NA но вместо NA я хочу использовать предыдущие данные

curren result 
      AAPL.Close d_aapl.Close 
2015-01-02 0.9815064 0.9815064 
2015-01-05 0.9811617   NA 
2015-01-06 0.9973719   NA 
2015-01-07 1.0051306   NA 
2015-01-08 1.0243522   NA 
2015-01-09 0.9941422 0.9941422 
2015-01-12 0.9702487   NA 
2015-01-13 0.9891412   NA 

wanted 

      AAPL.Close d_aapl.Close 
2015-01-02 0.9815064 0.9815064 
2015-01-05 0.9811617 0.9815064 
2015-01-06 0.9973719 0.9815064 
2015-01-07 1.0051306 0.9815064 
2015-01-08 1.0243522 0.9815064 
2015-01-09 0.9941422 0.9941422 
2015-01-12 0.9702487 0.9941422 
2015-01-13 0.9891412 0.9941422 

Как это сделать?

+2

Использование 'зоопарку :: na.locf() 'или' tidyr :: fill() 'для вашей второй проблемы. – Psidom

+1

Задайте аргумент OHLC для вашей первой проблемы: 'to.weekly (d_aapl, OHLC = FALSE)'. См. '? To.weekly'. –

ответ

1

Фактический ответ на первую задачу, в которой вы спрашиваете, что происходит: w_aapl=to.weekly(d_aapl) просто возвращение OHLC ваших ежедневного d_aapl временных рядов (что является одномерные ряды) в недельном масштабе, хотя первые несколько строк (и последние несколько) еженедельных данных могут не сделать это настолько ясным. (Это не имеет ничего общего с коррекцией цен или объемами в контексте вашего вопроса.)

Метки времени в w_aapl соответствует последнему доступному дню в каждом еженедельном агрегирования по умолчанию (прочитать о ?to.period «s indexAt аргумента, если вы хотите измените временную метку на начало недели, но это побочный пункт для ответа на ваш вопрос), который работает с понедельника по воскресенье каждую неделю (данные для понедельника - первый день следующей недели).

Поскольку у вас нет данных о выходных, ваша временная метка будет последней пятницей в каждую неделю (но было бы воскресенье, если бы были включены данные в воскресенье). Может быть, это поможет в том, что происходит:

class(coredata(d_aapl)) <- "character" 
v <- xts(order.by = index(d_aapl), x = weekdays(index(d_aapl)), dimnames = list(NULL, "Weekday")) 
head(merge(d_aapl, v), 20) 

#    AAPL.Close   Weekday  
# 2015-01-02 "0.981506445654964" "Friday" 
# 2015-01-05 "0.981161686386908" "Monday" 
# 2015-01-06 "0.997371888517253" "Tuesday" 
# 2015-01-07 "1.00513062514358" "Wednesday" 
# 2015-01-08 "1.02435224688221" "Thursday" 
# 2015-01-09 "0.994142220540378" "Friday" 
# 2015-01-12 "0.970248685084346" "Monday" 
# 2015-01-13 "0.989141173831105" "Tuesday" 
# 2015-01-14 "1.00696993757364" "Wednesday" 
# 2015-01-15 "0.971090909090909" "Thursday" 
# 2015-01-16 "0.990283088762806" "Friday" 
# 2015-01-20 "1.00816028405639" "Tuesday" 
# 2015-01-21 "1.00550716857753" "Wednesday" 
# 2015-01-22 "1.01940867006333" "Thursday" 
# 2015-01-23 "1.00605520909915" "Friday" 
# 2015-01-26 "0.994373131604943" "Monday" 
# 2015-01-27 "0.97082370522725" "Tuesday" 
# 2015-01-28 "0.980277148183554" "Wednesday" 
# 2015-01-29 "1.02218020976616" "Thursday" 
# 2015-01-30 "0.989527044095827" "Friday" 

Специально для ваших данных, каждая строка будет принимать данные с понедельника по пятницу, и назначить пятницу отметку времени:

  • Первый раз в неделю данные запись 2015-01-02 - это особый случай, который принимает значения от 2014-12-29 (в понедельник) до 2015-01-04 (воскресенье), что является одним из значений в пятницу на 2015-01-02 (именно поэтому OHLC = C для первого недельного бара).
  • Данные для 2015-01-09 строки взяты из d_aapl между 2015-01-05 по 2015-01-11. Вы можете видеть, что высокий уровень был явно от 2015-01-08, низкий на 2015-01-05, первый - в первом значении в диапазоне 2015-01-05, закрытие значения для 2015-01-09.
  • данные для строки 2015-01-16 будут взяты из d_aapl между 2015-01-12 по 2015-01-18 и т. Д.

Что касается вашего второго вопроса, то другие ответы уже обеспечили работу хорошо, но вы могли бы также рассмотреть видя ?merge.xts и его fill аргумент, который является более кратким в определенных ситуациях: res=merge(d_aapl,Cl(w_aapl), fill = na.locf)

1

Просто добавьте следующую строку:

res$d_aapl.Close <- na.locf(res$d_aapl.Close) 

> res 
      AAPL.Close d_aapl.Close 
2015-01-02 0.9815064 0.9815064 
2015-01-05 0.9811617 0.9815064 
2015-01-06 0.9973719 0.9815064 
2015-01-07 1.0051306 0.9815064 
2015-01-08 1.0243522 0.9815064 
2015-01-09 0.9941422 0.9941422 
2015-01-12 0.9702487 0.9941422 
2015-01-13 0.9891412 0.9891412