1

I want to get the investment values for each stock, but I am getting, I think, for the overall dataset.

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)

What am I doing wrong?

I want to get the investment values over time by each symbol assuming, say, $100 investment at time 0. So the desired output would look something like...

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)
Geet
  • 2,515
  • 2
  • 19
  • 42
  • Will `group_by(symbol)` again before computing the investment values work? – Rui Barradas Oct 04 '21 at 15:51
  • You are getting the (weighted) portfolio return, that is what you are asking. What are you exaclty expecting? Because you already have the individual monthly returns with the first lines of code. If that is not what you want, show an example of what output you are expecting. – phiver Oct 04 '21 at 17:40
  • @RuiBarradas, no it did not work! – Geet Oct 05 '21 at 10:55
  • @phiver, just updated the question to reflect that. – Geet Oct 05 '21 at 11:07

1 Answers1

0

Looking at your expected output, the following lines of code get you there. STarting point is your monthly_returns_stocks data.frame. Basically a cumulative sum of the montly returns + 1 times the investment of $100. Change the 100 into 1000 if you want to see the growth of a $1000 investment for each stock.

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

And as an extra: the weighted portfolio return in dollars:

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.
phiver
  • 23,048
  • 14
  • 44
  • 56