Introduction: load the libraries

library(tidyverse)
library(TTR)
library(quantmod)
library(PerformanceAnalytics)
library(RColorBrewer)
library(tseries)
library(lubridate)
library(Quandl)
Quandl.api_key("zrcB2Ejv9UmvhPCUsy2_")
options("getSymbols.yahoo.warning"=FALSE)

Capture some data for a stock

MSFT <- getSymbols("MSFT", auto.assign = FALSE)
## 'getSymbols' currently uses auto.assign=TRUE by default, but will
## use auto.assign=FALSE in 0.5-0. You will still be able to use
## 'loadSymbols' to automatically load data. getOption("getSymbols.env")
## and getOption("getSymbols.auto.assign") will still be checked for
## alternate defaults.
## 
## This message is shown once per session and may be disabled by setting 
## options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
head(MSFT)
##            MSFT.Open MSFT.High MSFT.Low MSFT.Close MSFT.Volume MSFT.Adjusted
## 2007-01-03     29.91     30.25    29.40      29.86    76935100      22.12369
## 2007-01-04     29.70     29.97    29.44      29.81    45774500      22.08664
## 2007-01-05     29.63     29.75    29.45      29.64    44607200      21.96068
## 2007-01-08     29.65     30.10    29.53      29.93    50220200      22.17555
## 2007-01-09     30.00     30.18    29.73      29.96    44636600      22.19778
## 2007-01-10     29.80     29.89    29.43      29.66    55017400      21.97551
dim(MSFT)
## [1] 3423    6

Download daily returns for a new Stock.

new <- MSFT[1:30,1:3]
MSFT["2007-01-03", "MSFT.Open"]
##            MSFT.Open
## 2007-01-03     29.91

Look at the Head and Tail of the Df

head(MSFT)
##            MSFT.Open MSFT.High MSFT.Low MSFT.Close MSFT.Volume MSFT.Adjusted
## 2007-01-03     29.91     30.25    29.40      29.86    76935100      22.12369
## 2007-01-04     29.70     29.97    29.44      29.81    45774500      22.08664
## 2007-01-05     29.63     29.75    29.45      29.64    44607200      21.96068
## 2007-01-08     29.65     30.10    29.53      29.93    50220200      22.17555
## 2007-01-09     30.00     30.18    29.73      29.96    44636600      22.19778
## 2007-01-10     29.80     29.89    29.43      29.66    55017400      21.97551
tail(MSFT)
##            MSFT.Open MSFT.High MSFT.Low MSFT.Close MSFT.Volume MSFT.Adjusted
## 2020-07-30    201.00    204.46   199.57     203.90    25079600        203.90
## 2020-07-31    204.40    205.10   199.01     205.01    51248000        205.01
## 2020-08-03    211.52    217.64   210.44     216.54    78983000        216.54
## 2020-08-04    214.17    214.77   210.31     213.29    49280100        213.29
## 2020-08-05    214.90    215.00   211.57     212.94    28858600        212.94
## 2020-08-06    212.34    216.37   211.55     216.35    32619400        216.35
dim(MSFT)
## [1] 3423    6
str(MSFT)
## An 'xts' object on 2007-01-03/2020-08-06 containing:
##   Data: num [1:3423, 1:6] 29.9 29.7 29.6 29.6 30 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : NULL
##   ..$ : chr [1:6] "MSFT.Open" "MSFT.High" "MSFT.Low" "MSFT.Close" ...
##   Indexed by objects of class: [Date] TZ: UTC
##   xts Attributes:  
## List of 2
##  $ src    : chr "yahoo"
##  $ updated: POSIXct[1:1], format: "2020-08-07 12:04:22"

Subsetting by row/column reference or by row/column name

df <- as.data.frame(MSFT)
class(df)
## [1] "data.frame"
head(df)
##            MSFT.Open MSFT.High MSFT.Low MSFT.Close MSFT.Volume MSFT.Adjusted
## 2007-01-03     29.91     30.25    29.40      29.86    76935100      22.12369
## 2007-01-04     29.70     29.97    29.44      29.81    45774500      22.08664
## 2007-01-05     29.63     29.75    29.45      29.64    44607200      21.96068
## 2007-01-08     29.65     30.10    29.53      29.93    50220200      22.17555
## 2007-01-09     30.00     30.18    29.73      29.96    44636600      22.19778
## 2007-01-10     29.80     29.89    29.43      29.66    55017400      21.97551
df <- as.xts(df)
class(df)
## [1] "xts" "zoo"
write.csv(df, "newdatamsft.csv")

Create a Daily Return and then Chart the data for one stock.

options(scipen=9999)
tsla <- getSymbols("TSLA", auto.assign=F)
head(tsla, 20)
##            TSLA.Open TSLA.High TSLA.Low TSLA.Close TSLA.Volume TSLA.Adjusted
## 2010-06-29     19.00     25.00    17.54      23.89    18766300         23.89
## 2010-06-30     25.79     30.42    23.30      23.83    17187100         23.83
## 2010-07-01     25.00     25.92    20.27      21.96     8218800         21.96
## 2010-07-02     23.00     23.10    18.71      19.20     5139800         19.20
## 2010-07-06     20.00     20.00    15.83      16.11     6866900         16.11
## 2010-07-07     16.40     16.63    14.98      15.80     6921700         15.80
## 2010-07-08     16.14     17.52    15.57      17.46     7711400         17.46
## 2010-07-09     17.58     17.90    16.55      17.40     4050600         17.40
## 2010-07-12     17.95     18.07    17.00      17.05     2202500         17.05
## 2010-07-13     17.39     18.64    16.90      18.14     2680100         18.14
## 2010-07-14     17.94     20.15    17.76      19.84     4195200         19.84
## 2010-07-15     19.94     21.50    19.00      19.89     3739800         19.89
## 2010-07-16     20.70     21.30    20.05      20.64     2621300         20.64
## 2010-07-19     21.37     22.25    20.92      21.91     2486500         21.91
## 2010-07-20     21.85     21.85    20.05      20.30     1825300         20.30
## 2010-07-21     20.66     20.90    19.50      20.22     1252500         20.22
## 2010-07-22     20.50     21.25    20.37      21.00      957800         21.00
## 2010-07-23     21.19     21.56    21.06      21.29      653600         21.29
## 2010-07-26     21.50     21.50    20.30      20.95      922200         20.95
## 2010-07-27     20.91     21.18    20.26      20.55      619700         20.55
head(dailyReturn(tsla$TSLA.Adjusted))
##            daily.returns
## 2010-06-29   0.000000000
## 2010-06-30  -0.002511469
## 2010-07-01  -0.078472556
## 2010-07-02  -0.125682975
## 2010-07-06  -0.160937492
## 2010-07-07  -0.019242767
plot(dailyReturn(tsla$TSLA.Adjusted), type = "l")

More data analytics and comparing multiple stocks against each other.

msft <- getSymbols("MSFT", auto.assign = F)
dim(msft)
## [1] 3423    6
msft_Ad <- Ad(msft)
head(msft_Ad)
##            MSFT.Adjusted
## 2007-01-03      22.12369
## 2007-01-04      22.08664
## 2007-01-05      21.96068
## 2007-01-08      22.17555
## 2007-01-09      22.19778
## 2007-01-10      21.97551
msft_daily <- dailyReturn(msft_Ad)
head(msft_daily)
##            daily.returns
## 2007-01-03   0.000000000
## 2007-01-04  -0.001674766
## 2007-01-05  -0.005702859
## 2007-01-08   0.009783985
## 2007-01-09   0.001002771
## 2007-01-10  -0.010013432
new_msft <- dailyReturn(Ad(getSymbols("MSFT", auto.assign = F)))
head(new_msft)
##            daily.returns
## 2007-01-03   0.000000000
## 2007-01-04  -0.001674766
## 2007-01-05  -0.005702859
## 2007-01-08   0.009783985
## 2007-01-09   0.001002771
## 2007-01-10  -0.010013432
fb <- getSymbols("FB", auto.assign = F)
fb_ad <- Ad(fb)
fb_daily <- dailyReturn(fb_ad)

dim(fb_daily)
## [1] 2068    1
new_fb <- dailyReturn(Ad(getSymbols("FB", auto.assign = F)))

comb <- merge(new_msft, new_fb)

head(comb)
##            daily.returns daily.returns.1
## 2007-01-03   0.000000000              NA
## 2007-01-04  -0.001674766              NA
## 2007-01-05  -0.005702859              NA
## 2007-01-08   0.009783985              NA
## 2007-01-09   0.001002771              NA
## 2007-01-10  -0.010013432              NA
comb_traded <- merge(new_msft, new_fb, all=F)

head(comb_traded)
##            daily.returns daily.returns.1
## 2012-05-18 -0.0151410936      0.00000000
## 2012-05-21  0.0163992312     -0.10986139
## 2012-05-22  0.0003357195     -0.08903906
## 2012-05-23 -0.0218411670      0.03225806
## 2012-05-24 -0.0013741794      0.03218747
## 2012-05-25 -0.0003442763     -0.03390854
dim(comb_traded)
## [1] 2068    2
charts.PerformanceSummary(comb_traded, main="FB vs MSFT")

table.AnnualizedReturns(comb_traded, scale=252, Rf=.004/252)
##                             daily.returns daily.returns.1
## Annualized Return                  0.3027          0.2662
## Annualized Std Dev                 0.2596          0.3739
## Annualized Sharpe (Rf=0.4%)        1.1458          0.6986