Portfolio Tracker: By Aaron Pike
library(quantmod)
library(PerformanceAnalytics)
library(TTR)
library(dygraphs)
Bring in weekly return data from yahoo finance about the following tickers: Note these tickers can be changed and the graphical output will change.
ticker5 <- c("SPY","QQQ","VOO","VYM","VFH")
Pull data from the internet: Omit everything but the closing prices and generate weekly returns.
#Generate data
getSymbols(ticker5[1], auto.assign = FALSE, from = '2018-01-01') -> pos1
getSymbols(ticker5[2], auto.assign = FALSE, from = '2018-01-01') -> pos2
getSymbols(ticker5[3], auto.assign = FALSE, from = '2018-01-01') -> pos3
getSymbols(ticker5[4], auto.assign = FALSE, from = '2018-01-01') -> pos4
getSymbols(ticker5[5], auto.assign = FALSE, from = '2018-01-01') -> pos5
#Generate weekly return from closing prices
weeklyReturn(pos1[,4]) ->c1
weeklyReturn(pos2[,4]) ->c2
weeklyReturn(pos3[,4]) ->c3
weeklyReturn(pos4[,4]) ->c4
weeklyReturn(pos5[,4]) ->c5
#Bring everything together in one object
cbind(c1,c2,c3,c4,c5)->ticker5returns
#Rename it all again
names(ticker5returns) <- ticker5
cbind(pos1[,4],pos2[,4],pos3[,4],pos4[,4],pos5[,4]) -> ticker5closingprices
Weekly return of 5 tickers compared & visualized. This is by making a correlation matrix where you can look at each stocks individual correlation to one another
#Inspect + visualize
cor(ticker5returns)
SPY QQQ VDC VYM VFH
SPY 1.0000000 0.9283155 0.8540007 0.9581968 0.8945384
QQQ 0.9283155 1.0000000 0.7670752 0.8154305 0.7151962
VDC 0.8540007 0.7670752 1.0000000 0.8684211 0.7217453
VYM 0.9581968 0.8154305 0.8684211 1.0000000 0.9326218
VFH 0.8945384 0.7151962 0.7217453 0.9326218 1.0000000
dygraph(ticker5returns)
Graphical output of each stock ticker
chartSeries(pos1,
type = c("auto", "candlesticks"),
subset = '2020-01::',
show.grid = TRUE, name = ticker5[1],
major.ticks='auto', minor.ticks=TRUE,
TA=c(addMACD(),addVo()))

chartSeries(pos2,
type = c("auto", "candlesticks"),
subset = '2020-01::',
show.grid = TRUE, name = ticker5[2],
major.ticks='auto', minor.ticks=TRUE,
TA=c(addMACD(),addVo()))

chartSeries(pos3,
type = c("auto", "candlesticks"),
subset = '2020-01::',
show.grid = TRUE, name = ticker5[3],
major.ticks='auto', minor.ticks=TRUE,
TA=c(addMACD(),addVo()))

chartSeries(pos4,
type = c("auto", "candlesticks"),
subset = '2020-01::',
show.grid = TRUE, name = ticker5[4],
major.ticks='auto', minor.ticks=TRUE,
TA=c(addMACD(),addVo()))

chartSeries(pos5,
type = c("auto", "candlesticks"),
subset = '2020-01::',
show.grid = TRUE, name = ticker5[5],
major.ticks='auto', minor.ticks=TRUE,
TA=c(addMACD(),addVo()))

This next chart is a part of the Performance Analytics package. This is the relative performance of the 5 stocks in the ticker compared to the benchmark return of a particular stock. In this case it is the first position in the ticker5 vector.

charts.RollingPerformance(ticker5returns, legend.loc = "topleft")

chart.Boxplot(ticker5returns)

chart.RiskReturnScatter(ticker5returns)

LS0tDQp0aXRsZTogIlBvcnRmb2xpbyBUcmFja2VyIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQpQb3J0Zm9saW8gVHJhY2tlcjogQnkgQWFyb24gUGlrZQ0KYGBge3J9DQpsaWJyYXJ5KHF1YW50bW9kKQ0KbGlicmFyeShQZXJmb3JtYW5jZUFuYWx5dGljcykNCmxpYnJhcnkoVFRSKQ0KbGlicmFyeShkeWdyYXBocykNCmBgYA0KQnJpbmcgaW4gd2Vla2x5IHJldHVybiBkYXRhIGZyb20geWFob28gZmluYW5jZSBhYm91dCB0aGUgZm9sbG93aW5nIHRpY2tlcnM6IA0KTm90ZSB0aGVzZSB0aWNrZXJzIGNhbiBiZSBjaGFuZ2VkIGFuZCB0aGUgZ3JhcGhpY2FsIG91dHB1dCB3aWxsIGNoYW5nZS4NCmBgYHtyfQ0KdGlja2VyNSA8LSBjKCJTUFkiLCJRUVEiLCJWREMiLCJWWU0iLCJWRkgiKQ0KYGBgDQpQdWxsIGRhdGEgZnJvbSB0aGUgaW50ZXJuZXQ6IA0KT21pdCBldmVyeXRoaW5nIGJ1dCB0aGUgY2xvc2luZyBwcmljZXMgYW5kIGdlbmVyYXRlIHdlZWtseSByZXR1cm5zLg0KYGBge3J9DQoNCiNHZW5lcmF0ZSBkYXRhDQpnZXRTeW1ib2xzKHRpY2tlcjVbMV0sIGF1dG8uYXNzaWduID0gRkFMU0UsIGZyb20gPSAnMjAxOC0wMS0wMScpIC0+IHBvczENCmdldFN5bWJvbHModGlja2VyNVsyXSwgYXV0by5hc3NpZ24gPSBGQUxTRSwgZnJvbSA9ICcyMDE4LTAxLTAxJykgLT4gcG9zMg0KZ2V0U3ltYm9scyh0aWNrZXI1WzNdLCBhdXRvLmFzc2lnbiA9IEZBTFNFLCBmcm9tID0gJzIwMTgtMDEtMDEnKSAtPiBwb3MzDQpnZXRTeW1ib2xzKHRpY2tlcjVbNF0sIGF1dG8uYXNzaWduID0gRkFMU0UsIGZyb20gPSAnMjAxOC0wMS0wMScpIC0+IHBvczQNCmdldFN5bWJvbHModGlja2VyNVs1XSwgYXV0by5hc3NpZ24gPSBGQUxTRSwgZnJvbSA9ICcyMDE4LTAxLTAxJykgLT4gcG9zNQ0KI0dlbmVyYXRlIHdlZWtseSByZXR1cm4gZnJvbSBjbG9zaW5nIHByaWNlcw0Kd2Vla2x5UmV0dXJuKHBvczFbLDRdKSAtPmMxDQp3ZWVrbHlSZXR1cm4ocG9zMlssNF0pIC0+YzINCndlZWtseVJldHVybihwb3MzWyw0XSkgLT5jMw0Kd2Vla2x5UmV0dXJuKHBvczRbLDRdKSAtPmM0DQp3ZWVrbHlSZXR1cm4ocG9zNVssNF0pIC0+YzUNCiNCcmluZyBldmVyeXRoaW5nIHRvZ2V0aGVyIGluIG9uZSBvYmplY3QNCmNiaW5kKGMxLGMyLGMzLGM0LGM1KS0+dGlja2VyNXJldHVybnMNCiNSZW5hbWUgaXQgYWxsIGFnYWluDQpuYW1lcyh0aWNrZXI1cmV0dXJucykgPC0gdGlja2VyNQ0KY2JpbmQocG9zMVssNF0scG9zMlssNF0scG9zM1ssNF0scG9zNFssNF0scG9zNVssNF0pIC0+IHRpY2tlcjVjbG9zaW5ncHJpY2VzDQoNCg0KYGBgDQpXZWVrbHkgcmV0dXJuIG9mIDUgdGlja2VycyBjb21wYXJlZCAmIHZpc3VhbGl6ZWQuIFRoaXMgaXMgYnkgbWFraW5nIGEgY29ycmVsYXRpb24gbWF0cml4IHdoZXJlIHlvdSBjYW4gbG9vayBhdCBlYWNoIHN0b2NrcyBpbmRpdmlkdWFsIGNvcnJlbGF0aW9uIHRvIG9uZSBhbm90aGVyDQpgYGB7cn0NCiNJbnNwZWN0ICsgdmlzdWFsaXplDQpjb3IodGlja2VyNXJldHVybnMpDQpkeWdyYXBoKHRpY2tlcjVyZXR1cm5zKQ0KYGBgDQpHcmFwaGljYWwgb3V0cHV0IG9mIGVhY2ggc3RvY2sgdGlja2VyDQpgYGB7cn0NCmNoYXJ0U2VyaWVzKHBvczEsIA0KICAgICAgICAgICAgdHlwZSA9IGMoImF1dG8iLCAiY2FuZGxlc3RpY2tzIiksIA0KICAgICAgICAgICAgc3Vic2V0ID0gJzIwMjAtMDE6OicsDQogICAgICAgICAgICBzaG93LmdyaWQgPSBUUlVFLCBuYW1lID0gdGlja2VyNVsxXSwNCiAgICAgICAgICAgIG1ham9yLnRpY2tzPSdhdXRvJywgbWlub3IudGlja3M9VFJVRSwNCiAgICAgICAgICAgIFRBPWMoYWRkTUFDRCgpLGFkZFZvKCkpKQ0KY2hhcnRTZXJpZXMocG9zMiwgDQogICAgICAgICAgICB0eXBlID0gYygiYXV0byIsICJjYW5kbGVzdGlja3MiKSwgDQogICAgICAgICAgICBzdWJzZXQgPSAnMjAyMC0wMTo6JywNCiAgICAgICAgICAgIHNob3cuZ3JpZCA9IFRSVUUsIG5hbWUgPSB0aWNrZXI1WzJdLA0KICAgICAgICAgICAgbWFqb3IudGlja3M9J2F1dG8nLCBtaW5vci50aWNrcz1UUlVFLA0KICAgICAgICAgICAgVEE9YyhhZGRNQUNEKCksYWRkVm8oKSkpDQpjaGFydFNlcmllcyhwb3MzLCANCiAgICAgICAgICAgIHR5cGUgPSBjKCJhdXRvIiwgImNhbmRsZXN0aWNrcyIpLCANCiAgICAgICAgICAgIHN1YnNldCA9ICcyMDIwLTAxOjonLA0KICAgICAgICAgICAgc2hvdy5ncmlkID0gVFJVRSwgbmFtZSA9IHRpY2tlcjVbM10sDQogICAgICAgICAgICBtYWpvci50aWNrcz0nYXV0bycsIG1pbm9yLnRpY2tzPVRSVUUsDQogICAgICAgICAgICBUQT1jKGFkZE1BQ0QoKSxhZGRWbygpKSkNCmNoYXJ0U2VyaWVzKHBvczQsIA0KICAgICAgICAgICAgdHlwZSA9IGMoImF1dG8iLCAiY2FuZGxlc3RpY2tzIiksIA0KICAgICAgICAgICAgc3Vic2V0ID0gJzIwMjAtMDE6OicsDQogICAgICAgICAgICBzaG93LmdyaWQgPSBUUlVFLCBuYW1lID0gdGlja2VyNVs0XSwNCiAgICAgICAgICAgIG1ham9yLnRpY2tzPSdhdXRvJywgbWlub3IudGlja3M9VFJVRSwNCiAgICAgICAgICAgIFRBPWMoYWRkTUFDRCgpLGFkZFZvKCkpKQ0KY2hhcnRTZXJpZXMocG9zNSwgDQogICAgICAgICAgICB0eXBlID0gYygiYXV0byIsICJjYW5kbGVzdGlja3MiKSwgDQogICAgICAgICAgICBzdWJzZXQgPSAnMjAyMC0wMTo6JywNCiAgICAgICAgICAgIHNob3cuZ3JpZCA9IFRSVUUsIG5hbWUgPSB0aWNrZXI1WzVdLA0KICAgICAgICAgICAgbWFqb3IudGlja3M9J2F1dG8nLCBtaW5vci50aWNrcz1UUlVFLA0KICAgICAgICAgICAgVEE9YyhhZGRNQUNEKCksYWRkVm8oKSkpDQpgYGANClRoaXMgbmV4dCBjaGFydCBpcyBhIHBhcnQgb2YgdGhlIFBlcmZvcm1hbmNlIEFuYWx5dGljcyBwYWNrYWdlLiBUaGlzIGlzIHRoZSByZWxhdGl2ZSBwZXJmb3JtYW5jZSBvZiB0aGUgNSBzdG9ja3MgaW4gdGhlIHRpY2tlciBjb21wYXJlZCB0byB0aGUgYmVuY2htYXJrIHJldHVybiBvZiBhIHBhcnRpY3VsYXIgc3RvY2suIEluIHRoaXMgY2FzZSBpdCBpcyB0aGUgZmlyc3QgcG9zaXRpb24gaW4gdGhlIHRpY2tlcjUgdmVjdG9yLg0KYGBge3J9DQoNCg0KDQpjaGFydC5SZWxhdGl2ZVBlcmZvcm1hbmNlKHRpY2tlcjVyZXR1cm5zLGMxLG1haW4gPSAiUmVsYXRpdmUgUGVyZm9ybWFuY2UiLHhheGlzID0gVFJVRSxsZWdlbmQubG9jID0gInRvcGxlZnQiKQ0KYGBgDQoNCmBgYHtyfQ0KDQpjaGFydHMuUm9sbGluZ1BlcmZvcm1hbmNlKHRpY2tlcjVyZXR1cm5zLCBsZWdlbmQubG9jID0gInRvcGxlZnQiKQ0KY2hhcnQuQm94cGxvdCh0aWNrZXI1cmV0dXJucykNCmNoYXJ0LlJpc2tSZXR1cm5TY2F0dGVyKHRpY2tlcjVyZXR1cm5zKQ0KYGBgDQoNCg==