Расчет цены возвращает в df со многими тикерами с dplyr - PullRequest
1 голос
/ 01 октября 2019

У меня есть датафрейм с 3 столбцами: Даты, Тикеры (т.е. финансовые инструменты) и Цены. Я просто хочу рассчитать доходность для каждого тикера.

Некоторые данные для игры:

AsofDate = as.Date(c("2018-01-01","2018-01-02","2018-01-03","2018-01-04","2018-01-05",
                     "2018-01-01","2018-01-02","2018-01-03","2018-01-04","2018-01-05",
                     "2018-01-01","2018-01-02","2018-01-03","2018-01-04","2018-01-05"))
Tickers = c("Ticker1", "Ticker1", "Ticker1", "Ticker1", "Ticker1",
            "Ticker2", "Ticker2", "Ticker2", "Ticker2", "Ticker2",
            "Ticker3", "Ticker3", "Ticker3", "Ticker3", "Ticker3")

Prices =c(1,2,7,4,2,
          6,5,7,9,12,
          11,11,16,14,15)

df = data.frame(AsofDate, Tickers, Prices)

Моя первая идея состояла в том, чтобы просто упорядочить цены по (тикерским ценам), а затем рассчитать длявсе вектора и установить в NA в первый день ...

TTR::ROC(x=Prices)

Это работает в Excel, но я хочу что-то более красивое

Так что я попробовал что-то вроде этого:

require(dplyr)
ret = df %>% 
  select(Tickers,Prices) %>% 
  group_by(Tickers) %>% 
  do(data.frame(LogReturns=TTR::ROC(x=Prices)))

df$LogReturns = ret$LogReturns

Но здесь я получаю слишком много значений, кажется, что расчет не сделан Тикерсом.

Можете ли вы дать мне подсказку?

Спасибо !!

Ответы [ 3 ]

1 голос
/ 01 октября 2019

Спасибо! Ваше решение идеально:

df %>%
  group_by(Tickers) %>%
  mutate(returns = (Prices - lag(Prices))/Prices)
1 голос
/ 01 октября 2019

В dplyr мы можем использовать lag, чтобы получить предыдущее Prices

library(dplyr)
df %>%
  group_by(Tickers) %>%
  mutate(returns = (Prices - lag(Prices))/Prices)

# AsofDate   Tickers Prices returns
#   <date>     <fct>    <dbl>   <dbl>
# 1 2018-01-01 Ticker1      1 NA     
# 2 2018-01-02 Ticker1      2  0.5   
# 3 2018-01-03 Ticker1      7  0.714 
# 4 2018-01-04 Ticker1      4 -0.75  
# 5 2018-01-05 Ticker1      2 -1     
# 6 2018-01-01 Ticker2      6 NA     
# 7 2018-01-02 Ticker2      5 -0.2   
# 8 2018-01-03 Ticker2      7  0.286 
# 9 2018-01-04 Ticker2      9  0.222 
#10 2018-01-05 Ticker2     12  0.25  
#11 2018-01-01 Ticker3     11 NA     
#12 2018-01-02 Ticker3     11  0     
#13 2018-01-03 Ticker3     16  0.312 
#14 2018-01-04 Ticker3     14 -0.143 
#15 2018-01-05 Ticker3     15  0.0667

В базе R мы можем использовать ave с diff

df$returns <- with(df, ave(Prices, Tickers,FUN = function(x) c(NA,diff(x)))/Prices)
0 голосов
/ 01 октября 2019

Мы можем использовать data.table

library(data.table)
setDT(df)[, returns := (Prices - shift(Prices))/Prices, by = Tickers]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...