# Load packages

# Core
library(tidyverse)
library(tidyquant)

Goal

Collect individual returns into a portfolio by assigning a weight to each stock

five stocks: “SPY”, “EFA”, “IJS”, “EEM”, “AGG”

from 2012-12-31 to 2017-12-31

1 Import stock prices

# Choose stocks

symbols <- c("SPY", "NVDA", "VOOG")


prices <- tq_get(x = symbols,
                 get = "stock.prices",
                 from = "2012-12-31",
                 to = "2017-12-31")

2 Convert prices to returns

 asset_returns_tbl <- prices %>%

   
    group_by(symbol) %>%
    tq_transmute(select = adjusted,
                 mutate_fun = periodReturn,
                 period = "monthly",
                 type = "log") %>%
    slice(-1) %>%
    ungroup() %>%
    
    set_names(c("asset", "date", "returns"))

3 Assign a weight to each asset

3 Assign a weight to each asset

# symbols
symbols <- asset_returns_tbl %>% distinct(asset) %>% pull()

weights <- c (.25, .50, .25)
weights
## [1] 0.25 0.50 0.25
weights_tbl <- tibble(symbols, weights)
weights_tbl
## # A tibble: 3 × 2
##   symbols weights
##   <chr>     <dbl>
## 1 NVDA       0.25
## 2 SPY        0.5 
## 3 VOOG       0.25

4 Build a portfolio

portfolio_returns_tbl <- asset_returns_tbl %>%
    
    tq_portfolio(assets_col   = asset,
                 returns_col  = returns,
                 weights      = weights_tbl,
                 col_rename   = "returns",
                 rebalance_on = "months")

portfolio_returns_tbl
## # A tibble: 60 × 2
##    date       returns
##    <date>       <dbl>
##  1 2013-01-31  0.0347
##  2 2013-02-28  0.0193
##  3 2013-03-28  0.0310
##  4 2013-04-30  0.0322
##  5 2013-05-31  0.0311
##  6 2013-06-28 -0.0173
##  7 2013-07-31  0.0436
##  8 2013-08-30 -0.0150
##  9 2013-09-30  0.0384
## 10 2013-10-31  0.0286
## # ℹ 50 more rows

5 Calculate Kurtosis

portfolio_skew_tidyquant_building_percent <- portfolio_returns_tbl  %>%

    tq_performance(Ra = returns,
                   performance_fun = table.Stats) %>%
    select(Kurtosis)
portfolio_skew_tidyquant_building_percent
## # A tibble: 1 × 1
##   Kurtosis
##      <dbl>
## 1  -0.0101

6 plot

Distibution of portfolio returns

portfolio_returns_tbl %>%
    
    ggplot(aes(x = returns)) +
    geom_histogram()

excpected returns vs Downside risk

 #transform data
 mean_kurt_tbl<-asset_returns_tbl %>%
    
    
    #calculate Mean return
    group_by(asset) %>%
    summarise(mean = mean(returns),
              kurt = kurtosis(returns)) %>%
    ungroup()
 #add portfolio stats
add_row(portfolio_returns_tbl %>%
    summarise(mean = mean(returns),
              kurt = kurtosis(returns)) %>%
    mutate(asset = "portfolio"))
## # A tibble: 2 × 3
##      mean    kurt asset    
##     <dbl>   <dbl> <chr>    
## 1  0.0211 -0.0101 portfolio
## 2 NA      NA      <NA>
 #plot
mean_kurt_tbl %>%
    
    ggplot(aes(x = kurt, y = mean)) +
    geom_point() +
    ggrepel::geom_text_repel(aes(label = asset, color = asset)) +
    
    #formatting
    theme(legend.position = "none") +
    scale_y_continuous(labels = scales :: percent_format(accuracy = 0.1))+
    #labeling
    labs(x = "kurtosis",
         y = "Expected Returns")

### Rolling 24 month Kurtosis

 #assign a value for window
window = 12



 #transform data:: calc 24 month rolling kurt
rolling_kurt_tbl <- portfolio_returns_tbl %>%
    
    tq_mutate(select     = returns,
              mutate_fun = rollapply,
              width      = window,
              FUN        = kurtosis,
              col_rename = "kurt") %>%
    na.omit() %>%
    select(-returns)

 #plot
rolling_kurt_tbl %>%
    
    ggplot(aes(x = date, y = kurt)) +
    geom_line(color = "cornflowerblue") +
    
    #formating
    scale_y_continuous(breaks = seq(-1,4,0.5)) +
    scale_x_continuous(breaks = scales::pretty_breaks(n = 7)) +
    theme(plot.title = element_text(hjust = 0.5)) +
    
    #Labeling
    labs(x = NULL,
         y = "Kurtosis",
         title = paste0("Rolling", window, "Month Kurtosis")) +
        annotate(geom = "text",
                 x = as.Date("2016-07-01"),y = 3,
                 size = 5, color = "red" , 
                 label = str_glue("downside Risk skyrocketed 
                                  toward the end of 2017"))

Has the downside risk of your portfolio increased or decreased overtime? explain using the plot you created. You may also refer to the skewness of the returns of distribution you plotted in the previous assignment.

Anwser: the downside risk of my portfolio has increased during this time period.This is because the risk level increased a decent amount because the kurtosis levels are begining to rise from the start date.When you look at the skewness of the previous assignment it was a negative skewed number, and shows no signs of this changing.