Core Functions

##Prerequisites

# Load the tidyquant package to get started.
#Loads tidyquant, lubridate, xts, quantmod, TTR 
library(tidyverse)
library(tidyquant)
#Stock Indexes
tq_index_options()
#Set x as one of the options in the list of options above to get the desired stock index / exchange.
tq_index("SP500")

Get Quantitative Data

tq_get_options()
#yahoo finance
aapl_prices  <- tq_get("AAPL", get = "stock.prices", from = " 1990-01-01")
aapl_prices 
x8411T <- tq_get("8411.T", get = "stock.prices.japan", from = "2016-01-01", to  = "2016-12-31")
#FRED Economic Data
wti_price_usd <- tq_get("DCOILWTICO", get = "economic.data")
wti_price_usd 

##Quandl API

quandl_api_key("<your-api-key>")

#Mutate Quantitative Data

data("FANG")
FANG

##Transmute Quantitative Data, tq_transmute

FANG %>%
    group_by(symbol) %>%
    tq_transmute(select = adjusted, mutate_fun = to.monthly, indexAt = "lastof")

##Mutate Quantitative Data, tq_mutate

FANG %>%
    group_by(symbol) %>%
    tq_mutate(select     = close, 
              mutate_fun = MACD, 
              col_rename = c("MACD", "Signal"))

#Quantitative Analysis Package Integrations in tidyquant ##Getting and Charting Annual Returns

FANG_annual_returns <- FANG %>%
    group_by(symbol) %>%
    tq_transmute(select     = adjusted, 
                 mutate_fun = periodReturn, 
                 period     = "yearly", 
                 type       = "arithmetic")
FANG_annual_returns
###Charting annual returns is just a quick use of the ggplot2 package.
FANG_annual_returns %>%
    ggplot(aes(x = date, y = yearly.returns, fill = symbol)) +
    geom_col() +
    geom_hline(yintercept = 0, color = palette_light()[[1]]) +
    scale_y_continuous(labels = scales::percent) +
    labs(title = "FANG: Annual Returns",
         subtitle = "Get annual returns quickly with tq_transmute!",
         y = "Annual Returns", x = "") + 
    facet_wrap(~ symbol, ncol = 2, scales = "free_y") +
    theme_tq() + 
    scale_fill_tq()

##Getting Daily Log Returns

FANG_daily_log_returns <- FANG %>%
    group_by(symbol) %>%
    tq_transmute(select     = adjusted, 
                 mutate_fun = periodReturn, 
                 period     = "daily", 
                 type       = "log",
                 col_rename = "monthly.returns")
FANG_daily_log_returns %>%
    ggplot(aes(x = monthly.returns, fill = symbol)) +
    geom_density(alpha = 0.5) +
    labs(title = "FANG: Charting the Daily Log Returns",
         x = "Monthly Returns", y = "Density") +
    theme_tq() +
    scale_fill_tq() + 
    facet_wrap(~ symbol, ncol = 2)

##Use xts to.period to Change the Periodicity from Daily to Monthly

FANG %>%
    group_by(symbol) %>%
    tq_transmute(select     = open:volume, 
                 mutate_fun = to.period, 
                 period     = "months")
FANG_daily <- FANG %>%
    group_by(symbol)

FANG_daily %>%
    ggplot(aes(x = date, y = adjusted, color = symbol)) +
    geom_line(size = 1) +
    labs(title = "Daily Stock Prices",
         x = "", y = "Adjusted Prices", color = "") +
    facet_wrap(~ symbol, ncol = 2, scales = "free_y") +
    scale_y_continuous(labels = scales::dollar) +
    theme_tq() + 
    scale_color_tq()

#Scaling and Modeling with tidyquant ##Scaling the Mutation of Financial Data

data("FANG")
FANG
FANG_returns_yearly <- FANG %>%
    group_by(symbol) %>%
    tq_transmute(select     = adjusted, 
                 mutate_fun = periodReturn, 
                 period     = "yearly", 
                 col_rename = "yearly.returns") 
FANG_returns_yearly %>%
    ggplot(aes(x = year(date), y = yearly.returns, fill = symbol)) +
    geom_bar(position = "dodge", stat = "identity") +
    labs(title = "FANG: Annual Returns", 
         subtitle = "Mutating at scale is quick and easy!",
         y = "Returns", x = "", color = "Blue") +
    scale_y_continuous(labels = scales::percent) +
    coord_flip() +
    theme_tq() +
    scale_fill_tq()

#Charting with tidyquant ##Line Chart

#Use FANG data set
data("FANG") 
# Get AAPL and AMZN Stock Prices
AAPL <- tq_get("AAPL", get = "stock.prices", from = "2016-09-01", to = "2017-12-31")
AMZN <- tq_get("AMZN", get = "stock.prices", from = "2001-01-01", to = "2017-12-31")
AAPL %>%
    ggplot(aes(x = date, y = close)) +
    geom_line() +
    labs(title = "AAPL Line Chart", y = "Closing Price", x = "") + 
    theme_tq()

end <- as_date("2016-12-31")
AAPL %>%
    ggplot(aes(x = date, y = close)) +
    geom_barchart(aes(open = open, high = high, low = low, close = close)) +
    labs(title = "AAPL Bar Chart", y = "Closing Price", x = "") + 
    theme_tq()

##Charting Multiple Securities

start <- end - weeks(6)
FANG %>%
    filter(date >= start - days(2 * 15)) %>%
    ggplot(aes(x = date, y = close, group = symbol)) +
    geom_candlestick(aes(open = open, high = high, low = low, close = close)) +
    labs(title = "FANG Candlestick Chart", 
         subtitle = "Experimenting with Mulitple Stocks",
         y = "Closing Price", x = "") + 
    coord_x_date(xlim = c(start, end)) +
    facet_wrap(~ symbol, ncol = 2, scale = "free_y") + 
    theme_tq()

##Adding BBands to multiple stocks

start <- end - weeks(24)
FANG %>%
    filter(date >= start - days(2 * 20)) %>%
    ggplot(aes(x = date, y = close, 
               open = open, high = high, low = low, close = close, 
               group = symbol)) +
    geom_barchart() +
    geom_bbands(ma_fun = SMA, sd = 2, n = 20, linetype = 5) +
    labs(title = "FANG Bar Chart", 
         subtitle = "BBands with SMA Applied, Experimenting with Multiple Stocks", 
         y = "Closing Price", x = "") + 
    coord_x_date(xlim = c(start, end)) +
    facet_wrap(~ symbol, ncol = 2, scales = "free_y") + 
    theme_tq()

LS0tCnRpdGxlOiAiRGF0YSBIb21ld29yazogVGlkeVF1YW50IFR1dG9yaWFscyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBDb3JlIEZ1bmN0aW9ucwojI1ByZXJlcXVpc2l0ZXMKYGBge3J9CiMgTG9hZCB0aGUgdGlkeXF1YW50IHBhY2thZ2UgdG8gZ2V0IHN0YXJ0ZWQuCiNMb2FkcyB0aWR5cXVhbnQsIGx1YnJpZGF0ZSwgeHRzLCBxdWFudG1vZCwgVFRSIApsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0aWR5cXVhbnQpCmBgYAoKYGBge3J9CiNTdG9jayBJbmRleGVzCnRxX2luZGV4X29wdGlvbnMoKQojU2V0IHggYXMgb25lIG9mIHRoZSBvcHRpb25zIGluIHRoZSBsaXN0IG9mIG9wdGlvbnMgYWJvdmUgdG8gZ2V0IHRoZSBkZXNpcmVkIHN0b2NrIGluZGV4IC8gZXhjaGFuZ2UuCnRxX2luZGV4KCJTUDUwMCIpCmBgYAojIyBHZXQgUXVhbnRpdGF0aXZlIERhdGEKYGBge3J9CnRxX2dldF9vcHRpb25zKCkKI3lhaG9vIGZpbmFuY2UKYWFwbF9wcmljZXMgIDwtIHRxX2dldCgiQUFQTCIsIGdldCA9ICJzdG9jay5wcmljZXMiLCBmcm9tID0gIiAxOTkwLTAxLTAxIikKYWFwbF9wcmljZXMgCng4NDExVCA8LSB0cV9nZXQoIjg0MTEuVCIsIGdldCA9ICJzdG9jay5wcmljZXMuamFwYW4iLCBmcm9tID0gIjIwMTYtMDEtMDEiLCB0byAgPSAiMjAxNi0xMi0zMSIpCiNGUkVEIEVjb25vbWljIERhdGEKd3RpX3ByaWNlX3VzZCA8LSB0cV9nZXQoIkRDT0lMV1RJQ08iLCBnZXQgPSAiZWNvbm9taWMuZGF0YSIpCnd0aV9wcmljZV91c2QgCmBgYAojI1F1YW5kbCBBUEkKYGBge3J9CnF1YW5kbF9hcGlfa2V5KCI8eW91ci1hcGkta2V5PiIpCmBgYAoKI011dGF0ZSBRdWFudGl0YXRpdmUgRGF0YQpgYGB7cn0KZGF0YSgiRkFORyIpCkZBTkcKYGBgCiMjVHJhbnNtdXRlIFF1YW50aXRhdGl2ZSBEYXRhLCB0cV90cmFuc211dGUKYGBge3J9CkZBTkcgJT4lCiAgICBncm91cF9ieShzeW1ib2wpICU+JQogICAgdHFfdHJhbnNtdXRlKHNlbGVjdCA9IGFkanVzdGVkLCBtdXRhdGVfZnVuID0gdG8ubW9udGhseSwgaW5kZXhBdCA9ICJsYXN0b2YiKQpgYGAKIyNNdXRhdGUgUXVhbnRpdGF0aXZlIERhdGEsIHRxX211dGF0ZQpgYGB7cn0KRkFORyAlPiUKICAgIGdyb3VwX2J5KHN5bWJvbCkgJT4lCiAgICB0cV9tdXRhdGUoc2VsZWN0ICAgICA9IGNsb3NlLCAKICAgICAgICAgICAgICBtdXRhdGVfZnVuID0gTUFDRCwgCiAgICAgICAgICAgICAgY29sX3JlbmFtZSA9IGMoIk1BQ0QiLCAiU2lnbmFsIikpCmBgYAoKI1F1YW50aXRhdGl2ZSBBbmFseXNpcyBQYWNrYWdlIEludGVncmF0aW9ucyBpbiB0aWR5cXVhbnQKIyNHZXR0aW5nIGFuZCBDaGFydGluZyBBbm51YWwgUmV0dXJucwpgYGB7cn0KRkFOR19hbm51YWxfcmV0dXJucyA8LSBGQU5HICU+JQogICAgZ3JvdXBfYnkoc3ltYm9sKSAlPiUKICAgIHRxX3RyYW5zbXV0ZShzZWxlY3QgICAgID0gYWRqdXN0ZWQsIAogICAgICAgICAgICAgICAgIG11dGF0ZV9mdW4gPSBwZXJpb2RSZXR1cm4sIAogICAgICAgICAgICAgICAgIHBlcmlvZCAgICAgPSAieWVhcmx5IiwgCiAgICAgICAgICAgICAgICAgdHlwZSAgICAgICA9ICJhcml0aG1ldGljIikKRkFOR19hbm51YWxfcmV0dXJucwojIyNDaGFydGluZyBhbm51YWwgcmV0dXJucyBpcyBqdXN0IGEgcXVpY2sgdXNlIG9mIHRoZSBnZ3Bsb3QyIHBhY2thZ2UuCkZBTkdfYW5udWFsX3JldHVybnMgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0geWVhcmx5LnJldHVybnMsIGZpbGwgPSBzeW1ib2wpKSArCiAgICBnZW9tX2NvbCgpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gcGFsZXR0ZV9saWdodCgpW1sxXV0pICsKICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICAgIGxhYnModGl0bGUgPSAiRkFORzogQW5udWFsIFJldHVybnMiLAogICAgICAgICBzdWJ0aXRsZSA9ICJHZXQgYW5udWFsIHJldHVybnMgcXVpY2tseSB3aXRoIHRxX3RyYW5zbXV0ZSEiLAogICAgICAgICB5ID0gIkFubnVhbCBSZXR1cm5zIiwgeCA9ICIiKSArIAogICAgZmFjZXRfd3JhcCh+IHN5bWJvbCwgbmNvbCA9IDIsIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgICB0aGVtZV90cSgpICsgCiAgICBzY2FsZV9maWxsX3RxKCkKYGBgCiMjR2V0dGluZyBEYWlseSBMb2cgUmV0dXJucwpgYGB7cn0KRkFOR19kYWlseV9sb2dfcmV0dXJucyA8LSBGQU5HICU+JQogICAgZ3JvdXBfYnkoc3ltYm9sKSAlPiUKICAgIHRxX3RyYW5zbXV0ZShzZWxlY3QgICAgID0gYWRqdXN0ZWQsIAogICAgICAgICAgICAgICAgIG11dGF0ZV9mdW4gPSBwZXJpb2RSZXR1cm4sIAogICAgICAgICAgICAgICAgIHBlcmlvZCAgICAgPSAiZGFpbHkiLCAKICAgICAgICAgICAgICAgICB0eXBlICAgICAgID0gImxvZyIsCiAgICAgICAgICAgICAgICAgY29sX3JlbmFtZSA9ICJtb250aGx5LnJldHVybnMiKQpGQU5HX2RhaWx5X2xvZ19yZXR1cm5zICU+JQogICAgZ2dwbG90KGFlcyh4ID0gbW9udGhseS5yZXR1cm5zLCBmaWxsID0gc3ltYm9sKSkgKwogICAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC41KSArCiAgICBsYWJzKHRpdGxlID0gIkZBTkc6IENoYXJ0aW5nIHRoZSBEYWlseSBMb2cgUmV0dXJucyIsCiAgICAgICAgIHggPSAiTW9udGhseSBSZXR1cm5zIiwgeSA9ICJEZW5zaXR5IikgKwogICAgdGhlbWVfdHEoKSArCiAgICBzY2FsZV9maWxsX3RxKCkgKyAKICAgIGZhY2V0X3dyYXAofiBzeW1ib2wsIG5jb2wgPSAyKQpgYGAKIyNVc2UgeHRzIHRvLnBlcmlvZCB0byBDaGFuZ2UgdGhlIFBlcmlvZGljaXR5IGZyb20gRGFpbHkgdG8gTW9udGhseQpgYGB7cn0KRkFORyAlPiUKICAgIGdyb3VwX2J5KHN5bWJvbCkgJT4lCiAgICB0cV90cmFuc211dGUoc2VsZWN0ICAgICA9IG9wZW46dm9sdW1lLCAKICAgICAgICAgICAgICAgICBtdXRhdGVfZnVuID0gdG8ucGVyaW9kLCAKICAgICAgICAgICAgICAgICBwZXJpb2QgICAgID0gIm1vbnRocyIpCkZBTkdfZGFpbHkgPC0gRkFORyAlPiUKICAgIGdyb3VwX2J5KHN5bWJvbCkKCkZBTkdfZGFpbHkgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gYWRqdXN0ZWQsIGNvbG9yID0gc3ltYm9sKSkgKwogICAgZ2VvbV9saW5lKHNpemUgPSAxKSArCiAgICBsYWJzKHRpdGxlID0gIkRhaWx5IFN0b2NrIFByaWNlcyIsCiAgICAgICAgIHggPSAiIiwgeSA9ICJBZGp1c3RlZCBQcmljZXMiLCBjb2xvciA9ICIiKSArCiAgICBmYWNldF93cmFwKH4gc3ltYm9sLCBuY29sID0gMiwgc2NhbGVzID0gImZyZWVfeSIpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmRvbGxhcikgKwogICAgdGhlbWVfdHEoKSArIAogICAgc2NhbGVfY29sb3JfdHEoKQpgYGAKCiNTY2FsaW5nIGFuZCBNb2RlbGluZyB3aXRoIHRpZHlxdWFudAojI1NjYWxpbmcgdGhlIE11dGF0aW9uIG9mIEZpbmFuY2lhbCBEYXRhCmBgYHtyfQpkYXRhKCJGQU5HIikKRkFORwpGQU5HX3JldHVybnNfeWVhcmx5IDwtIEZBTkcgJT4lCiAgICBncm91cF9ieShzeW1ib2wpICU+JQogICAgdHFfdHJhbnNtdXRlKHNlbGVjdCAgICAgPSBhZGp1c3RlZCwgCiAgICAgICAgICAgICAgICAgbXV0YXRlX2Z1biA9IHBlcmlvZFJldHVybiwgCiAgICAgICAgICAgICAgICAgcGVyaW9kICAgICA9ICJ5ZWFybHkiLCAKICAgICAgICAgICAgICAgICBjb2xfcmVuYW1lID0gInllYXJseS5yZXR1cm5zIikgCkZBTkdfcmV0dXJuc195ZWFybHkgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSB5ZWFyKGRhdGUpLCB5ID0geWVhcmx5LnJldHVybnMsIGZpbGwgPSBzeW1ib2wpKSArCiAgICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgICBsYWJzKHRpdGxlID0gIkZBTkc6IEFubnVhbCBSZXR1cm5zIiwgCiAgICAgICAgIHN1YnRpdGxlID0gIk11dGF0aW5nIGF0IHNjYWxlIGlzIHF1aWNrIGFuZCBlYXN5ISIsCiAgICAgICAgIHkgPSAiUmV0dXJucyIsIHggPSAiIiwgY29sb3IgPSAiQmx1ZSIpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICB0aGVtZV90cSgpICsKICAgIHNjYWxlX2ZpbGxfdHEoKQpgYGAKI0NoYXJ0aW5nIHdpdGggdGlkeXF1YW50CiMjTGluZSBDaGFydApgYGB7cn0KI1VzZSBGQU5HIGRhdGEgc2V0CmRhdGEoIkZBTkciKSAKIyBHZXQgQUFQTCBhbmQgQU1aTiBTdG9jayBQcmljZXMKQUFQTCA8LSB0cV9nZXQoIkFBUEwiLCBnZXQgPSAic3RvY2sucHJpY2VzIiwgZnJvbSA9ICIyMDE2LTA5LTAxIiwgdG8gPSAiMjAxNy0xMi0zMSIpCkFNWk4gPC0gdHFfZ2V0KCJBTVpOIiwgZ2V0ID0gInN0b2NrLnByaWNlcyIsIGZyb20gPSAiMjAwMS0wMS0wMSIsIHRvID0gIjIwMTctMTItMzEiKQpBQVBMICU+JQogICAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGNsb3NlKSkgKwogICAgZ2VvbV9saW5lKCkgKwogICAgbGFicyh0aXRsZSA9ICJBQVBMIExpbmUgQ2hhcnQiLCB5ID0gIkNsb3NpbmcgUHJpY2UiLCB4ID0gIiIpICsgCiAgICB0aGVtZV90cSgpCmVuZCA8LSBhc19kYXRlKCIyMDE2LTEyLTMxIikKYGBgCgoKYGBge3J9CkFBUEwgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gY2xvc2UpKSArCiAgICBnZW9tX2JhcmNoYXJ0KGFlcyhvcGVuID0gb3BlbiwgaGlnaCA9IGhpZ2gsIGxvdyA9IGxvdywgY2xvc2UgPSBjbG9zZSkpICsKICAgIGxhYnModGl0bGUgPSAiQUFQTCBCYXIgQ2hhcnQiLCB5ID0gIkNsb3NpbmcgUHJpY2UiLCB4ID0gIiIpICsgCiAgICB0aGVtZV90cSgpCmBgYAoKIyNDaGFydGluZyBNdWx0aXBsZSBTZWN1cml0aWVzCmBgYHtyfQpzdGFydCA8LSBlbmQgLSB3ZWVrcyg2KQpGQU5HICU+JQogICAgZmlsdGVyKGRhdGUgPj0gc3RhcnQgLSBkYXlzKDIgKiAxNSkpICU+JQogICAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGNsb3NlLCBncm91cCA9IHN5bWJvbCkpICsKICAgIGdlb21fY2FuZGxlc3RpY2soYWVzKG9wZW4gPSBvcGVuLCBoaWdoID0gaGlnaCwgbG93ID0gbG93LCBjbG9zZSA9IGNsb3NlKSkgKwogICAgbGFicyh0aXRsZSA9ICJGQU5HIENhbmRsZXN0aWNrIENoYXJ0IiwgCiAgICAgICAgIHN1YnRpdGxlID0gIkV4cGVyaW1lbnRpbmcgd2l0aCBNdWxpdHBsZSBTdG9ja3MiLAogICAgICAgICB5ID0gIkNsb3NpbmcgUHJpY2UiLCB4ID0gIiIpICsgCiAgICBjb29yZF94X2RhdGUoeGxpbSA9IGMoc3RhcnQsIGVuZCkpICsKICAgIGZhY2V0X3dyYXAofiBzeW1ib2wsIG5jb2wgPSAyLCBzY2FsZSA9ICJmcmVlX3kiKSArIAogICAgdGhlbWVfdHEoKQpgYGAKCiMjQWRkaW5nIEJCYW5kcyB0byBtdWx0aXBsZSBzdG9ja3MKYGBge3J9CnN0YXJ0IDwtIGVuZCAtIHdlZWtzKDI0KQpGQU5HICU+JQogICAgZmlsdGVyKGRhdGUgPj0gc3RhcnQgLSBkYXlzKDIgKiAyMCkpICU+JQogICAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGNsb3NlLCAKICAgICAgICAgICAgICAgb3BlbiA9IG9wZW4sIGhpZ2ggPSBoaWdoLCBsb3cgPSBsb3csIGNsb3NlID0gY2xvc2UsIAogICAgICAgICAgICAgICBncm91cCA9IHN5bWJvbCkpICsKICAgIGdlb21fYmFyY2hhcnQoKSArCiAgICBnZW9tX2JiYW5kcyhtYV9mdW4gPSBTTUEsIHNkID0gMiwgbiA9IDIwLCBsaW5ldHlwZSA9IDUpICsKICAgIGxhYnModGl0bGUgPSAiRkFORyBCYXIgQ2hhcnQiLCAKICAgICAgICAgc3VidGl0bGUgPSAiQkJhbmRzIHdpdGggU01BIEFwcGxpZWQsIEV4cGVyaW1lbnRpbmcgd2l0aCBNdWx0aXBsZSBTdG9ja3MiLCAKICAgICAgICAgeSA9ICJDbG9zaW5nIFByaWNlIiwgeCA9ICIiKSArIAogICAgY29vcmRfeF9kYXRlKHhsaW0gPSBjKHN0YXJ0LCBlbmQpKSArCiAgICBmYWNldF93cmFwKH4gc3ltYm9sLCBuY29sID0gMiwgc2NhbGVzID0gImZyZWVfeSIpICsgCiAgICB0aGVtZV90cSgpCmBgYA==