You are considering three index funds that follow the three major market indexes: the Dow Jones Industrial Average, the S&P 500, and the NASDAQ Compsite Index.
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(30)
Stocks <-
tq_get(c("^DJI", "^GSPC", "^IXIC"), get = "stock.prices", from = from) %>%
group_by(symbol)
Stocks
## # A tibble: 22,677 x 8
## # Groups: symbol [3]
## symbol date open high low close volume adjusted
## <chr> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 ^DJI 1989-04-17 2332. 2348. 2324. 2338. 13760000 2338.
## 2 ^DJI 1989-04-18 2357. 2386 2351. 2379. 25240000 2379.
## 3 ^DJI 1989-04-19 2377. 2398. 2370. 2387. 21700000 2387.
## 4 ^DJI 1989-04-20 2390. 2399. 2357. 2377. 21410000 2377.
## 5 ^DJI 1989-04-21 2383. 2413. 2373. 2409. 27210000 2409.
## 6 ^DJI 1989-04-24 2397. 2416. 2385. 2403. 18550000 2403.
## 7 ^DJI 1989-04-25 2408. 2422. 2379. 2387. 21850000 2387.
## 8 ^DJI 1989-04-26 2393. 2404. 2374. 2389. 17050000 2389.
## 9 ^DJI 1989-04-27 2393. 2433. 2388. 2419. 25780000 2419.
## 10 ^DJI 1989-04-28 2420. 2430. 2404. 2419. 17410000 2419.
## # ... with 22,667 more rows
Hint: Take Stocks and pipe it to tidyquant::tq_transmute. Assign the result to returns_yearly.
returns_yearly <-
Stocks %>%
tq_transmute(select = adjusted, mutate_fun = periodReturn, period = "yearly")
returns_yearly
## # A tibble: 93 x 3
## # Groups: symbol [3]
## symbol date yearly.returns
## <chr> <date> <dbl>
## 1 ^DJI 1989-12-29 0.178
## 2 ^DJI 1990-12-31 -0.0434
## 3 ^DJI 1991-12-31 0.203
## 4 ^DJI 1992-12-31 0.0417
## 5 ^DJI 1993-12-31 0.137
## 6 ^DJI 1994-12-30 0.0214
## 7 ^DJI 1995-12-29 0.335
## 8 ^DJI 1996-12-31 0.260
## 9 ^DJI 1997-12-31 0.226
## 10 ^DJI 1998-12-31 0.161
## # ... with 83 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_yearly %>%
ggplot(aes(x = yearly.returns, fill = symbol)) +
geom_density(alpha = 0.3)
Hint: Take returns_yearly and pipe it to summarise. Calculate the mean yearly returns.
returns_yearly %>%
summarise(returns_avg = mean(yearly.returns))
## # A tibble: 3 x 2
## symbol returns_avg
## <chr> <dbl>
## 1 ^DJI 0.0917
## 2 ^GSPC 0.0895
## 3 ^IXIC 0.134
Hint: Discuss your answer in terms of standard deviation. Take returns_yearly and pipe it to tidyquant::tq_performance. Use the performance_fun argument to compute sd (standard deviation).
According to standard deviation NASDAQ index fund is the riskiest for investors.
returns_yearly %>%
tq_performance(Ra = yearly.returns,
Rb = NULL, # Calculataing downside risk measures doesn't require Rb
performance_fun = sd)
## # A tibble: 3 x 2
## # Groups: symbol [3]
## symbol sd.1
## <chr> <dbl>
## 1 ^DJI 0.146
## 2 ^GSPC 0.165
## 3 ^IXIC 0.276
Hint: Discuss your answer in terms of whether the returns are normally distributed. The normality of the distribution may be measured by skewness and kurtosis. To compute the metrics, take returns_yearly and pipe it to tidyquant::tq_performance. Use the performance_fun argument to compute skewness. Do the same for kurtosis.
For these three considered index funds, standard deviation is not an appropriate measure of risk.
returns_yearly %>%
tq_performance(Ra = yearly.returns,
Rb = NULL, # Calculataing downside risk measures doesn't require Rb
performance_fun = kurtosis)
## # A tibble: 3 x 2
## # Groups: symbol [3]
## symbol kurtosis.1
## <chr> <dbl>
## 1 ^DJI 0.750
## 2 ^GSPC 0.631
## 3 ^IXIC 0.435
Hint: Discuss your answer in terms of HistoricalES(95%), HistoricalVaR(95%), and SemiDeviation. To compute the metrics, take returns_yearly and pipe it to tidyquant::tq_performance. Use the performance_fun argument to compute table.DownsideRisk.
Dow Jones index fund poses as the greatest downside risk investment.
returns_yearly %>%
tq_performance(Ra = yearly.returns,
Rb = NULL, # Calculataing downside risk measures doesn't require Rb
performance_fun = table.DownsideRisk) %>% t()
## [,1] [,2] [,3]
## symbol "^DJI" "^GSPC" "^IXIC"
## DownsideDeviation(0%) "0.0712" "0.0877" "0.1266"
## DownsideDeviation(MAR=0.833333333333333%) "0.0741" "0.0908" "0.1300"
## DownsideDeviation(Rf=0%) "0.0712" "0.0877" "0.1266"
## GainDeviation "0.0888" "0.0928" "0.2028"
## HistoricalES(95%) "-0.2530" "-0.3093" "-0.3991"
## HistoricalVaR(95%) "-0.1193" "-0.1820" "-0.3541"
## LossDeviation "0.1092" "0.1261" "0.1606"
## MaximumDrawdown "0.3384" "0.4012" "0.6718"
## ModifiedES(95%) "-0.2584" "-0.3013" "-0.4083"
## ModifiedVaR(95%) "-0.1718" "-0.2116" "-0.2957"
## SemiDeviation "0.1105" "0.1268" "0.1883"
Hint: Discuss your answer in terms of Sharpe Ratio. Take returns_yearly and pipe it to tidyquant:: tq_performance. Use the performance_fun argument to compute SharpeRatio. 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).
If I was a risk-averse investor I would choose to invest in S&P 500 because they have lower returns with known risks rather than higher returns with unknown risks.
returns_yearly %>%
tq_performance(Ra = yearly.returns,
Rb = NULL, # Calculataing downside risk measures doesn't require Rb
performance_fun = SharpeRatio)
## # A tibble: 3 x 4
## # Groups: symbol [3]
## symbol `ESSharpe(Rf=0%,p=95~ `StdDevSharpe(Rf=0%,p=~ `VaRSharpe(Rf=0%,p=~
## <chr> <dbl> <dbl> <dbl>
## 1 ^DJI 0.355 0.630 0.534
## 2 ^GSPC 0.297 0.542 0.423
## 3 ^IXIC 0.328 0.486 0.454