Suppose that you consider investing in two stocks: Microsoft and General Electric. As a prudent investor, you analyze the historical performance of the stocks during the period of 1990-01-01 to 2017-12-31.
library(tidyquant)
library(tidyverse)
Hint: Add group_by(symbol) at the end of the code so that calculations below will be done per stock.
from = today() - years(20)
Stocks <- tq_get(c("MSFT", "GE"), get = "stock.prices", from = from) %>%
group_by(symbol)
Stocks
## # A tibble: 10,066 x 8
## # Groups: symbol [2]
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 MSFT 1999-04-05 47.2 47.5 46.8 47.5 39848600 34.3
## 2 MSFT 1999-04-06 47.6 47.8 46.6 47.0 39674800 34.0
## 3 MSFT 1999-04-07 47.4 47.5 45.6 46.7 46910200 33.7
## 4 MSFT 1999-04-08 46.6 47.3 45.5 47.3 38637000 34.2
## 5 MSFT 1999-04-09 47.1 47.5 46.5 47.1 31816800 34.1
## 6 MSFT 1999-04-12 45.8 46.8 45.7 46.5 37858800 33.6
## 7 MSFT 1999-04-13 46.6 46.6 44.6 45.1 46746800 32.6
## 8 MSFT 1999-04-14 45.4 45.6 42.9 42.9 52944000 31.0
## 9 MSFT 1999-04-15 43.7 44.9 41.9 44.4 72594600 32.1
## 10 MSFT 1999-04-16 44.5 44.6 42.9 43.3 44774000 31.3
## # … with 10,056 more rows
Hint: Take the adjusted variable from Stocks, and calculate quarterly returns using tq_transmute(), instead of tq_mutate(), which is used when periodicity changes. Another difference between the two is that tq_transmute() returns only newly-created columns while tq_mutate() adds new columns to existing variables.
Note that there are a variety of functions available with the mutate_fun argument: See above for the result of tq_transmute_fun_options(). Note that tq_mutate allows to calculate returns using quantmod::periodReturn. Google the quantmod package manual for more information on the periodReturn function.
returns_quarterly <-
Stocks %>%
tq_transmute(select = adjusted, mutate_fun = periodReturn, period = "quarterly")
returns_quarterly
## # A tibble: 162 x 3
## # Groups: symbol [2]
## symbol date quarterly.returns
## <chr> <date> <dbl>
## 1 MSFT 1999-06-30 -0.0500
## 2 MSFT 1999-09-30 0.00416
## 3 MSFT 1999-12-31 0.289
## 4 MSFT 2000-03-31 -0.0899
## 5 MSFT 2000-06-30 -0.247
## 6 MSFT 2000-09-29 -0.246
## 7 MSFT 2000-12-29 -0.281
## 8 MSFT 2001-03-30 0.261
## 9 MSFT 2001-06-29 0.335
## 10 MSFT 2001-09-28 -0.299
## # … with 152 more rows
Hint: Refer to the ggplot2 cheatsheet. Look for geom_density under One Variable. Use the fill argument to create the plot per each stock.
returns_quarterly %>%
ggplot(aes(x=quarterly.returns, fill= symbol)) +
geom_density(alpha = 0.3)
Hint: Risk is measured by the extent of volatility in returns. It has little to do with how high or low of returns are expected.
Microsoft has a higher risk due to having a shorter, wider density plot. This means the standard deviation is larger which means it has a higer voltality than GE so it is risker.
Hint: Returns adjusted to risk is reflected in Sharpe Ratio. Use tidyquant:: tq_performance to compute Sharpe Ratio. The function returns Sharpe Ratios adjusted to three different types of risks: 1) standard deviation, 2) expected shortfall (5% worst loss), and 3) value at risk (the largest loss at the 95% confidence level).
returns_quarterly %>%
tq_performance(Ra = quarterly.returns, performance_fun = SharpeRatio)
## # A tibble: 2 x 4
## # Groups: symbol [2]
## symbol `ESSharpe(Rf=0%,p=95… `StdDevSharpe(Rf=0%,p=… `VaRSharpe(Rf=0%,p=…
## <chr> <dbl> <dbl> <dbl>
## 1 MSFT 0.0954 0.180 0.122
## 2 GE 0.01000 0.0221 0.0135
Column 1 - expected risk column 2 - standard deviation column 3 - measure of risk
When looking at Sharpe Ratio the higher percentage is better.