# Load packages

# Core
library(tidyverse)
library(tidyquant)

1 Import stock prices

symbols <- c("NFLX", "MSFT", "NVDA", "AMZN")
prices <- tq_get(x = symbols,
                 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

#symbols
symbols <- asset_returns_tbl %>% distinct (asset) %>% pull()
symbols
## [1] "AMZN" "MSFT" "NFLX" "NVDA"
#weights
weight <- c(0.25,0.25,0.2,0.3)
weight
## [1] 0.25 0.25 0.20 0.30
w_tbl <- tibble(symbols,weight)
w_tbl
## # A tibble: 4 × 2
##   symbols weight
##   <chr>    <dbl>
## 1 AMZN      0.25
## 2 MSFT      0.25
## 3 NFLX      0.2 
## 4 NVDA      0.3

4 Build a portfolio

#?tq_portfolio
portfolio_returns_tbl <- asset_returns_tbl %>%
    tq_portfolio(assets_col = asset,
                 returns_col = returns,
                 weights = w_tbl,
                 rebalance_on = "months", col_rename = "returns")
portfolio_returns_tbl
## # A tibble: 60 × 2
##    date       returns
##    <date>       <dbl>
##  1 2013-01-31  0.137 
##  2 2013-02-28  0.0414
##  3 2013-03-28  0.0145
##  4 2013-04-30  0.0719
##  5 2013-05-31  0.0553
##  6 2013-06-28 -0.0178
##  7 2013-07-31  0.0378
##  8 2013-08-30  0.0341
##  9 2013-09-30  0.0589
## 10 2013-10-31  0.0547
## # ℹ 50 more rows

5 Calculate Skew

portfolio_skew <- portfolio_returns_tbl %>%
    tq_performance(Ra = returns, 
                   performance_fun = table.Stats) %>%
    select(Skewness) 
portfolio_skew
## # A tibble: 1 × 1
##   Skewness
##      <dbl>
## 1   0.0437

6 Plot

Histogram

sd_portfolio <- sd(portfolio_returns_tbl$returns)
mean_portfolio <- mean(portfolio_returns_tbl$returns)


portfolio_returns_tbl %>%
    
    
    #Add a new variable
    mutate(extreme_neg= ifelse(returns < mean_portfolio - 2 * sd_portfolio, "ext_neg","not_ext_neg" )) %>%
    
    ggplot(aes(x=returns)) +
    geom_histogram(binwidth = 0.003) +
    
    scale_x_continuous(breaks = seq(-0.06, 0.06, 0.02)) +
    labs(x="monthly returns")

Scatter Plot of Skewness

# Calculate Skewness
 skew_tbl <- asset_returns_tbl %>%
    
    group_by(asset) %>%
    summarise(skew = skewness(returns)) %>%
    ungroup() %>%
    
    # add portfolio skewness
     add_row(tibble(asset = "Portfolio",
                    skew = skewness(portfolio_returns_tbl$returns)))

# Plot Skewness
skew_tbl %>%
    ggplot(aes(x=asset,y=skew,color=asset)) +
    geom_point() +

    ggrepel :: geom_text_repel(aes(label=asset),
                               data = skew_tbl %>%
                                   filter(asset == "Portfolio")) +
    labs(y = "skewness") 

Conclusion

When analyzing the scatterplot, it is clear that both Netflix and Nvidia are much more likely to produce a large gain during a given month than the overall portfolio. They also both have much higher skew than Amazon and Microsoft, which given the data available, do not exhibit the same large single month gains. This does not mean that Netlfix and Nvidia are more likely to have long term success than the others, but does suggest a higher beta and potential for higher short term growth.