Создание цикла для индексации значений в R - PullRequest
0 голосов
/ 03 декабря 2018

Я скачал несколько временных рядов через Yahoo-Finance, Reuters и другие источники.

Все они перечислены как отдельные "xts" -объекты, которые содержат соответствующую цену закрытия.Эти векторы доступны для ежедневных и ежемесячных интервалов.

Я хотел бы создать один график, который показывает динамику цен моих акций.На этом графике следует относительное развитие цены по отношению к первому дню:

price of 2005-01-04/price of 2005-01-03 
price of 2005-01-05/price of 2005-01-03

и так далее.

Для этого я попытался создать цикл for:

indexfun <- function(x)
  {
  y <- as.matrix(x)
  z <- rep(NULL, nrow(x))
  for(i in nrow(y)){
  z[i] <- y[i,1]/y[1,1]
    print(z)
  }
}

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

Мой xts-вектор выглядит как

           BA.close
2005-01-03    50.97
2005-01-04    49.98
2005-01-05    50.81
2005-01-06    50.48
2005-01-07    50.31
2005-01-10    50.98

Можете ли вы мне помочь??

Большое спасибо.

1 Ответ

0 голосов
/ 03 декабря 2018

Вот решение, которое работает для xts:

library(xts)

x <- xts(c(50.97, 49.98, 50.81, 50.48, 50.31, 50.98),as.Date("2005-01-03")+0:5)

x / drop(coredata(x['2005-01-03']))


                [,1]
2005-01-03 1.0000000
2005-01-04 0.9805768
2005-01-05 0.9968609
2005-01-06 0.9903865
2005-01-07 0.9870512
2005-01-08 1.0001962

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

сначала преобразуйте в matrix ваши данные и удалите столбец даты (вы вернете его позже), имейте в виду, что мы используем первую строку для деления.

mat <- as.matrix(d[,-1]) # remove the dates

sweep(mat,2,mat[1, ],`/`) # divide by mat[1, ]. i.e. first row
#            aaa      bbb
# [1,] 1.0000000 1.000000
# [2,] 0.9805768 2.090909
# [3,] 0.9968609 4.090909
# [4,] 0.9903865 5.090909
# [5,] 0.9870512 7.818182
# [6,] 1.0001962 3.090909
# now we can trasform back to data.frame and cbind() with the dates.

Используемые данные:

tt <- "date     aaa     bbb
2005-01-03    50.97     11
2005-01-04    49.98     23
2005-01-05    50.81     45
2005-01-06    50.48     56
2005-01-07    50.31     86
2005-01-10    50.98     34"

d <- read.table(text=tt, header=T)
...