# Load packages
library(tidyquant)
## Loading required package: lubridate
## 
## Attaching package: 'lubridate'
## The following object is masked from 'package:base':
## 
##     date
## Loading required package: PerformanceAnalytics
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
## Loading required package: quantmod
## Loading required package: TTR
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
## Version 0.4-0 included new data defaults. See ?getSymbols.
## ══ Need to Learn tidyquant? ════════════════════════════════════════════════════════════════════════
## Business Science offers a 1-hour course - Learning Lab #9: Performance Analysis & Portfolio Optimization with tidyquant!
## </> Learn more at: https://university.business-science.io/p/learning-labs-pro </>
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.2.1     ✓ purrr   0.3.3
## ✓ tibble  2.1.3     ✓ dplyr   0.8.4
## ✓ tidyr   1.0.2     ✓ stringr 1.4.0
## ✓ readr   1.3.1     ✓ forcats 0.4.0
## ── Conflicts ────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
## x lubridate::as.difftime() masks base::as.difftime()
## x lubridate::date()        masks base::date()
## x dplyr::filter()          masks stats::filter()
## x dplyr::first()           masks xts::first()
## x lubridate::intersect()   masks base::intersect()
## x dplyr::lag()             masks stats::lag()
## x dplyr::last()            masks xts::last()
## x lubridate::setdiff()     masks base::setdiff()
## x lubridate::union()       masks base::union()
# Import stock prices
stock_prices <- tq_get(c("WMT", "TGT", "AMZN"), get  = "stock.prices", from = "2020-01-01")

# Calculate daily returns
stock_returns <-
  stock_prices  %>%
    group_by(symbol) %>%
    tq_mutate(select = adjusted, mutate_fun = periodReturn, period = "daily") 
stock_returns
## # A tibble: 123 x 9
## # Groups:   symbol [3]
##    symbol date        open  high   low close  volume adjusted daily.returns
##    <chr>  <date>     <dbl> <dbl> <dbl> <dbl>   <dbl>    <dbl>         <dbl>
##  1 WMT    2020-01-02  119.  120.  119.  119. 6764900     119.       0      
##  2 WMT    2020-01-03  118.  119.  118.  118. 5399200     118.      -0.00883
##  3 WMT    2020-01-06  117.  118.  117.  118. 6445500     118.      -0.00204
##  4 WMT    2020-01-07  117.  118.  116.  117. 6846900     117.      -0.00926
##  5 WMT    2020-01-08  116.  117.  116.  116. 5875800     116.      -0.00343
##  6 WMT    2020-01-09  116.  117.  116.  117. 5563700     117.       0.0103 
##  7 WMT    2020-01-10  117.  117.  116.  116. 6054800     116.      -0.00835
##  8 WMT    2020-01-13  116.  117.  115.  116. 6112600     116.      -0.00430
##  9 WMT    2020-01-14  115.  116.  115.  116. 6585800     116.       0.00259
## 10 WMT    2020-01-15  115.  116.  115.  115. 7454200     115.      -0.00775
## # … with 113 more rows

Q1 filter Select stock returns of January 31, 2020.

filter(stock_returns, date == "2020-01-31")
## # A tibble: 3 x 9
## # Groups:   symbol [3]
##   symbol date        open  high   low close   volume adjusted daily.returns
##   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>    <dbl>    <dbl>         <dbl>
## 1 WMT    2020-01-31  116.  116.  114.  114.  7775800     114.       -0.0179
## 2 TGT    2020-01-31  113.  114.  110.  111.  6961900     110.       -0.0343
## 3 AMZN   2020-01-31 2051. 2056. 2002. 2009. 15567300    2009.        0.0738

Q2 Which of the three stocks performed best on January 31, 2020?

According to all of the data, Amazon performed the best out of the 3 because it is the only company with a positive daily return.

Q3 Plot the distribution of daily returns by stock using boxplots.

ggplot(stock_returns,
       aes(x = symbol,
           y = daily.returns)) +
  geom_boxplot() +
  labs(title = "Distribution of Daily Returns", x = "Symbol", y = "Daily Returns")

Q4 Based on the boxplot above, which of the three stocks performed best this year?

Based on the boxplot, Amazon has performed the best this year, with the highest 25%ile and 75%ile, the best median return and the only positive outlier.

Q5 Calculate mean daily returns for each stock.

avgreturns <- stock_returns %>%
  group_by(symbol) %>%
  summarize(mean_returns = mean(daily.returns))
avgreturns
## # A tibble: 3 x 2
##   symbol mean_returns
##   <chr>         <dbl>
## 1 AMZN       0.000895
## 2 TGT       -0.00320 
## 3 WMT       -0.000511

Q6 Plot mean daily returns using bar charts.

ggplot(avgreturns,
       aes(x = symbol, 
           y = mean_returns)) +
  geom_bar(stat = "identity") +
  labs(title = "Mean Daily Returns", x = "Symbol", y = "Mean Returns")

Q7 Create the line plot of stock prices for all three stocks in one graph.

ggplot(stock_prices, aes(x = date, y = adjusted, group = symbol)) + 
  geom_line(aes(color = symbol)) + 
  scale_color_manual(values = c("goldenrod", "darkred", "steelblue")) +
  labs(y = "Adjusted Stock Price", x = "Date", title = "Daily Stock Prices")

Q7.a filter Create the same line plot as in Q7, but without Amazon.

stock_prices2 <- tq_get(c("WMT", "TGT"), get  = "stock.prices", from = "2020-01-01")
ggplot(stock_prices2, aes(x = date, y = adjusted, group = symbol)) + 
  geom_line(aes(color = symbol)) + 
  scale_color_manual(values = c("darkred", "steelblue")) +
  labs(y = "Adjusted Stock Price", x = "Date", title = "Daily Stock Prices for Target vs. Walmart")

Q8 Hide the messages, but display the code and its results on the webpage.