Как рассчитать инвестиционную стоимость нескольких акций с помощью tidyquant?

#r #tidyquant

Вопрос:

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

 library(tidyquant)
library(dplyr)
data(FANG)
monthly_returns_stocks <- FANG %>%
  group_by(symbol) %>%
  tq_transmute(adjusted, periodReturn, period = "monthly")

weights <- c(0.50, 0.25, 0.25, 0)

monthly_returns_stocks %>%
  tq_portfolio(assets_col   = symbol,
               returns_col  = monthly.returns, 
               weights = weights,
               col_rename   = "investment.growth",
               wealth.index = TRUE) %>%
mutate(investment.growth = investment.growth*100)
 

Что я делаю не так?

Я хочу получить инвестиционные значения с течением времени по каждому символу, предполагая, скажем, инвестиции в размере 100 долларов в момент времени 0. Таким образом, желаемый результат будет выглядеть примерно так…

 desired_output <-
  tibble::tribble(
    ~symbol,       ~date, ~investment.growth,
       "FB", "1/31/2013",               100L,
       "FB", "2/28/2013",               103L,
       "FB", "3/28/2013",               106L,
       "FB", "4/30/2013",               101L,
       "FB", "5/31/2013",                99L,
     "AMZN", "1/31/2013",               100L,
     "AMZN", "2/28/2013",               105L,
     "AMZN", "3/28/2013",               109L,
     "AMZN", "4/30/2013",               123L,
     "AMZN", "5/31/2013",               112L,
     "GOOG", "1/31/2013",               100L,
     "GOOG", "2/28/2013",                98L,
     "GOOG", "3/28/2013",                96L,
     "GOOG", "4/30/2013",               102L,
     "GOOG", "5/31/2013",               106L)
 

Комментарии:

1. Будет group_by(symbol) ли снова работать перед вычислением инвестиционной стоимости?

2. Вы получаете (взвешенную) доходность портфеля, вот о чем вы просите. Чего вы, собственно, ожидаете? Потому что у вас уже есть индивидуальные ежемесячные доходы с первыми строками кода. Если это не то, что вы хотите, покажите пример того, какой результат вы ожидаете.

3. @RuiBarradas, нет, это не сработало!

4. @phiver, просто обновил вопрос, чтобы отразить это.

Ответ №1:

Если посмотреть на ожидаемый результат, то следующие строки кода приведут вас туда. Отправной точкой является ваш фрейм данных monthly_returns_stocks. В основном совокупная сумма ежемесячной прибыли 1, умноженная на инвестиции в размере 100 долларов. Измените 100 на 1000, если вы хотите увидеть рост инвестиций в 1000 долларов на каждую акцию.

 monthly_returns_stocks %>% 
  mutate(investment.growth = 100 * (1   cumsum(monthly.returns)))

# A tibble: 192 x 4
# Groups:   symbol [4]
   symbol date       monthly.returns investment.growth
   <chr>  <date>               <dbl>             <dbl>
 1 FB     2013-01-31        0.106                111. 
 2 FB     2013-02-28       -0.120                 98.6
 3 FB     2013-03-28       -0.0613                92.5
 4 FB     2013-04-30        0.0856               101. 
 5 FB     2013-05-31       -0.123                 88.7
 6 FB     2013-06-28        0.0218                90.9
 7 FB     2013-07-31        0.479                139. 
 8 FB     2013-08-30        0.122                151. 
 9 FB     2013-09-30        0.217                173. 
10 FB     2013-10-31       -0.000398             173. 
# ... with 182 more rows
 

И в качестве дополнительного: взвешенная доходность портфеля в долларах:

 monthly_returns_stocks %>% 
  mutate(investment.growth = 100 * (1   cumsum(monthly.returns))) %>% 
  # get the last records per symbol
  filter(row_number() == max(row_number())) %>%  
  ungroup() %>% 
  # weigths in order of the stock order: FB, AMZN, NFLX, GOOG
  summarise(portfolio_return = sum(investment.growth * weights)) 

# A tibble: 1 x 1
  portfolio_return
             <dbl>
1            2111.