Рассчитать доходность данных временного ряда R - PullRequest
2 голосов
/ 01 мая 2019

R не распознает мою таблицу данных как панель, у меня есть цены закрытия и итоговые цены за несколько десятилетий, однако иногда между ними отсутствуют месяцы, поэтому простой расчет доходности с запаздывающими значениями не работает по двум причинам: Требуется возврат по запаздывающим значениям, с интервалом не более 1 месяца, и теперь он возвращает по каждой компании вместо того, чтобы иметь один временной ряд на наблюдение. Мое решение таково:

df1 <- df %>%
  group_by(seriesid) %>%
  mutate(totret <- ifelse(month(date)-month(lag(date))>1,NA,totalreturn/lag(totalreturn)-1))

names(df1) <- c("date","company","totalreturn","close", "seriesid", "ticker","totret") 

df1 <- df1 %>%
group_by(seriesid) %>%
  mutate(closeret <- ifelse(month(date)-month(lag(date))>1,NA,close/lag(close)-1))

names(df1) <- c("date","company","totalreturn","close", "seriesid", "ticker","totret", "closeret")

Это не причудливо, но R не допускает более причудливого решения, потому что не распознает новые столбцы. Мои данные выглядят так:

date company returnprice close seriesid 
1 1888-01-31 x 2.500 2.500 0005 
2 1888-02-04 x 2.750 2.750 0005
3 1888-04-20 x 3.350 3.350 0005 
4 1895-01-30 y 7.500 4.350 0001
5 1895-02-26 y 7.800 4.650 0001

Теперь я могу получить мои данные, например:

date company totalreturn close seriesid totret closeret 
1 1888-01-31 x 2.500 2.500 0005 NA NA
2 1888-02-04 x 2.750 2.750 0005 0.1 0.1
3 1888-04-20 x 3.350 3.350 0005 NA NA
4 1895-01-30 y 7.500 4.350 0001 NA NA
5 1895-02-26 y 7.800 4.650 0001 0.04 0.06897

Ответы [ 2 ]

2 голосов
/ 01 мая 2019
df1 <- df %>%
      group_by(seriesid) %>%
      mutate(totret <- ifelse(month(date)-month(lag(date))>1,NA,totalreturn/lag(totalreturn)-1))

names(df1) <- c("date","company","totalreturn","close", "seriesid", "ticker","totret") 

df1 <- df1 %>%
    group_by(seriesid) %>%
    mutate(closeret <- ifelse(month(date)-month(lag(date))>1,NA,close/lag(close)-1))

names(df1) <- c("date","company","totalreturn","close", "seriesid", "ticker","totret", "closeret")
0 голосов
/ 01 мая 2019

Следуя вашему примеру, я добавил больше дат, чтобы посмотреть, что произойдет, когда более 3 строк должны быть NA, и ваш код работает правильно.Но вы найдете и выдадите, когда начнется новый год, начиная с «Декабрь»> «Январь».

data2 <- data %>% mutate(totret = ifelse(month(date)-month(lag(date))>1,NA,totalreturn/lag(totalreturn)-1),
                               closeret = ifelse(month(date)-month(lag(date))>1,NA,close/lag(close)-1))



        date totalreturn close    totret   closeret
1 1888-01-28         2.5   2.5        NA         NA
2 1888-02-28         2.7   2.7 0.0800000 0.08000000
3 1888-03-28         3.0   3.3 0.1111111 0.22222222
4 1888-05-28         3.5   3.5        NA         NA
5 1888-08-28         2.8   4.0        NA         NA
6 1888-10-28         3.0   4.3        NA         NA
7 1888-12-28         3.2   4.5        NA         NA
8 1889-03-28         3.6   4.6 0.1250000 0.02222222

Я бы предложил использовать difftime() и вменять NA, если разница превышает 31 день.

data3 <- data %>% mutate(totret = ifelse(difftime(date, lag(date), units = 'days')>31, NA, totalreturn/lag(totalreturn)-1),
                               closeret = ifelse(difftime(date, lag(date), units = 'days')>31, NA, close/lag(close)-1))

 date totalreturn close    totret  closeret
1 1888-01-28         2.5   2.5        NA        NA
2 1888-02-28         2.7   2.7 0.0800000 0.0800000
3 1888-03-28         3.0   3.3 0.1111111 0.2222222
4 1888-05-28         3.5   3.5        NA        NA
5 1888-08-28         2.8   4.0        NA        NA
6 1888-10-28         3.0   4.3        NA        NA
7 1888-12-28         3.2   4.5        NA        NA
8 1889-03-28         3.6   4.6        NA        NA

Я также пытался difftime(dates[2], dates[1], units = 'secs') > duration(1, units = 'month'), но он не будет работать с разницей в 31 день, так как "месяц составляет 30,41667 дней"

...