# 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.