# Load packages
library(tidyquant)
library(tidyverse)
# Import stock prices and calculate returns
returns_yearly <- c("^DJI", "^GSPC", "^IXIC") %>%
tq_get(get = "stock.prices",
from = "1990-01-01",
to = "2020-11-01") %>%
group_by(symbol) %>%
tq_transmute(select = adjusted,
mutate_fun = yearlyReturn)
returns_yearly
## # A tibble: 91 x 3
## # Groups: symbol [3]
## symbol date yearly.returns
## <chr> <date> <dbl>
## 1 ^DJI 1992-12-31 0.0406
## 2 ^DJI 1993-12-31 0.137
## 3 ^DJI 1994-12-30 0.0214
## 4 ^DJI 1995-12-29 0.335
## 5 ^DJI 1996-12-31 0.260
## 6 ^DJI 1997-12-31 0.226
## 7 ^DJI 1998-12-31 0.161
## 8 ^DJI 1999-12-31 0.252
## 9 ^DJI 2000-12-29 -0.0617
## 10 ^DJI 2001-12-31 -0.0710
## # ... with 81 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.
ggplot(returns_yearly, aes(x = yearly.returns, fill = symbol)) +
geom_density(alpha = 0.3)
Hint: Discuss your answer in terms of the mean. Take returns_yearly and pipe it to tidyquant::tq_performance. Use the performance_fun argument to compute the mean.
Based on each stocks mean, the Nasdaq has the highest expected return at 14.3% yearly. Next would be the S&P 500 with a yearly return of 8.8%. The lowest return is from the Dow Jones at 8.71% per year.
returns_yearly %>%
tq_performance(
Ra = yearly.returns,
Rb = NULL,
performance_fun = mean
)
## # A tibble: 3 x 2
## # Groups: symbol [3]
## symbol mean.1
## <chr> <dbl>
## 1 ^DJI 0.0871
## 2 ^GSPC 0.0880
## 3 ^IXIC 0.143
Hint: Discuss your answer in terms of the standard deviation. Take returns_yearly and pipe it to tidyquant::tq_performance. Use the performance_fun argument to compute sd (standard deviation).
Based on each stocks standard deviation, the Nasdaq is the riskiest stock with a sd of 27.9%.The second most risky stock is the s&P 500 with a sd of 16.9%. the least risky is the Dow Jones with a sd of 15.1%,
returns_yearly %>%
tq_performance(
Ra = yearly.returns,
Rb = NULL,
performance_fun = sd
)
## # A tibble: 3 x 2
## # Groups: symbol [3]
## symbol sd.1
## <chr> <dbl>
## 1 ^DJI 0.151
## 2 ^GSPC 0.169
## 3 ^IXIC 0.279
Hint: Discuss your answer in terms of the skewness and the kurtosis. Take returns_yearly and pipe it to tidyquant::tq_performance. Use the performance_fun argument to compute the skewness. Do the same for the kurtosis.
Based on skewness, both the Dow Jones and the S&P 500 have negative skewness. This means that large losses are more common than large gains. The Nasdaq has a positive skewness, so the risk for large losses is not as high. For kurtosis, all of the stocks are under 1, which means they have lighter tails, or less outliers. The Nasdaq has the lowest kurtosis at 0.289, then the S&P 500 with 0.357, and finally the Dow Jones with 0.41. The kurtosis results tell us that the Nasdaq will have lighter tails and less outliers. By looking at both skewness and kurtosis, it is evident that standard deviation is not enough as a risk measure.
returns_yearly %>%
tq_performance(
Ra = yearly.returns,
Rb = NULL,
performance_fun = skewness
)
## # A tibble: 3 x 2
## # Groups: symbol [3]
## symbol skewness.1
## <chr> <dbl>
## 1 ^DJI -0.669
## 2 ^GSPC -0.700
## 3 ^IXIC 0.0914
returns_yearly %>%
tq_performance(
Ra = yearly.returns,
Rb = NULL,
performance_fun = kurtosis
)
## # A tibble: 3 x 2
## # Groups: symbol [3]
## symbol kurtosis.1
## <chr> <dbl>
## 1 ^DJI 0.410
## 2 ^GSPC 0.357
## 3 ^IXIC 0.289
Hint: Take returns_yearly and pipe it to tidyquant::tq_performance. Use the performance_fun argument to compute table.DownsideRisk.
returns_yearly %>%
tq_performance(
Ra = yearly.returns,
Rb = NULL,
performance_fun = table.DownsideRisk
) %>%
t()
## [,1] [,2] [,3]
## symbol "^DJI" "^GSPC" "^IXIC"
## DownsideDeviation(0%) "0.0743" "0.0882" "0.1270"
## DownsideDeviation(MAR=0.833333333333333%) "0.0775" "0.0913" "0.1304"
## DownsideDeviation(Rf=0%) "0.0743" "0.0882" "0.1270"
## GainDeviation "0.0935" "0.1023" "0.2005"
## HistoricalES(95%) "-0.2530" "-0.3093" "-0.3991"
## HistoricalVaR(95%) "-0.1291" "-0.1820" "-0.3541"
## LossDeviation "0.1078" "0.1254" "0.1605"
## MaximumDrawdown "0.3384" "0.4012" "0.6718"
## ModifiedES(95%) "-0.2632" "-0.3017" "-0.4179"
## ModifiedVaR(95%) "-0.1831" "-0.2161" "-0.2995"
## SemiDeviation "0.1131" "0.1275" "0.1931"
In all three risk measures, the Nasdaq has the highest downside risk. The Nasdaq has the lowest HistoricalES at -0.3991, the lowest HistoricalVaR at -0.3541, and the highest Semi-Deviation at 0.1931, resulting in greater downside risk than the Dow Jones and S&P 500.
Hint: Assume that the risk free rate is zero and 95% confidence level. Note that the Sharpe Ratios are calculated using different risk measures: ES, VaR and semideviation. Make your argument based on all three Sharpe Ratios.
Based on ESSharpeRatio, the Nasdaq is the best stock with the highest ratio of 0.342.
returns_yearly %>%
tq_performance(
Ra = yearly.returns,
Rb = NULL,
performance_fun = SharpeRatio
)
## # A tibble: 3 x 4
## # Groups: symbol [3]
## symbol `ESSharpe(Rf=0%,p=95%~ `StdDevSharpe(Rf=0%,p=95~ `VaRSharpe(Rf=0%,p=95~
## <chr> <dbl> <dbl> <dbl>
## 1 ^DJI 0.331 0.576 0.476
## 2 ^GSPC 0.292 0.520 0.407
## 3 ^IXIC 0.342 0.512 0.477
Hint: Google tq_performance(). Discuss in terms of ES, VaR and semideviation and their differences between 95% and 99%.
With a 99% confidence level, Nasdaq is still the best option. It still has the highest score out of the S&P 500 and Dow Jones but this time with 99% confidence the score is 0.237 for ESSharpeRatio.
returns_yearly %>%
tq_performance(
Ra = yearly.returns,
Rb = NULL,
performance_fun = SharpeRatio,
p = 0.99
)
## # A tibble: 3 x 4
## # Groups: symbol [3]
## symbol `ESSharpe(Rf=0%,p=99%~ `StdDevSharpe(Rf=0%,p=99~ `VaRSharpe(Rf=0%,p=99~
## <chr> <dbl> <dbl> <dbl>
## 1 ^DJI 0.193 0.576 0.271
## 2 ^GSPC 0.169 0.520 0.239
## 3 ^IXIC 0.237 0.512 0.289
Hint: Use message, warning, echo and results in the chunk options. Refer to the RMarkdown Reference Guide.