Prices are subject to analysis in different fields such as agriculture, labor, housing, and many others. The financial market is not an exception, and consequently, the prices of the assets involved in its world such as stocks and bonds are needed for many purposes in economics and finance. In this article, I explain how to get prices for several stocks using R package quantmod
and plot them using ggplot2
.
quantmod
has its own plotting tools that are useful for algorithmic trading and technical analysis (for advanced visualizations on algorithmic trading you can see Visualizations for Algorithmic Trading in R). Nevertheless, if you just want to plot time series with no extra information ggplot2
provides easier and flexible options for formatting. This exercise consists of 1) getting stock prices for 3 top US banks from the beginning of February to the end of March and 2) plotting the time series including the following details:
- Title and subtitle
- x and y labels
- Caption
- Colors according to each bank
Loading required Packages
library(quantmod) library(ggplot2) library(magrittr) library(broom)
First, let’s set the dates for the period to plot
start = as.Date("2020-02-01") end = as.Date("2020-03-31")
Getting data
Now I request quantmod
to get the stock prices for Citibank (C), JP Morgan Chase (JPM), and Wells Fargo (WFC).
The function getSymbols
will get the data for you using 3 main arguments: the ticker of the companies, the source of the data, and the period.
Now provide to getSymbols
the inputs for the arguments. If you want more than one company you can add using the vector command c()
.
getSymbols(c("JPM", "C", "WFC"), src = "yahoo", from = start, to = end)
getSymbols
generate 3 xts
objects with an index column to reference the date, and 6 additional columns with the following information: open, high, low, close, volume, and adjusted. You can see the first lines of the object using the following command:
head(WFC) WFC.Open WFC.High WFC.Low WFC.Close WFC.Volume WFC.Adjusted 2020-02-03 47.24 47.72 47.03 47.12 15472000 46.62256 2020-02-04 47.70 47.84 47.25 47.26 14973300 46.76108 2020-02-05 47.90 48.40 47.78 48.31 20141800 47.80000 2020-02-06 48.44 48.50 47.85 47.98 18259200 47.98000 2020-02-07 47.73 48.00 47.48 47.84 13174600 47.84000 2020-02-10 47.67 47.86 47.42 47.77 18124800 47.77000
The next step is to create a data frame that captures all rows with just the adjusted price column of each bank. The adjusted price is used to account for dividend payments. This data frame is transformed into a time series object with the function as.xts()
.
stocks = as.xts(data.frame(C = C[, "C.Adjusted"], JPM = JPM[, "JPM.Adjusted"], WFC = WFC[, "WFC.Adjusted"])) Citi JP Morgan Wells Fargo 2020-02-03 75.13 131.9984 46.62256 2020-02-04 76.50 133.8986 46.76108 2020-02-05 78.85 136.1749 47.80000 2020-02-06 78.97 136.1947 47.98000 2020-02-07 78.69 135.7593 47.84000 2020-02-10 78.48 136.3234 47.77000
Stocks is an xts
object with an index column for date reference and 3 columns for adjusted stock prices. Now is required to do two additional transformations to stocks before plotting. 1) Assigning names to the columns given that at this point ggplot2
will read them as 1, 2, and 3. So first I assign the bank name, then 2) define the index column as a date.
names(stocks) = c("Citi", "JP Morgan", "Wells Fargo") index(stocks) = as.Date(index(stocks))
Plotting
Now I can plot using ggplot2
. The 3 main arguments will be the dataset stocks, aes()
which indicate that dates are assigned to x-axis and values to the y-axis, and color that assigns a color to the 3 series. Color is the argument that makes it possible to include more than one time series in the plot.
After providing the 3 main arguments, I add the layer for the shape of the plot. I want a line as it is the most appropriate for time series, so I add the command geom_line()
.
stocks_series = tidy(stocks) %>% ggplot(aes(x=index,y=value, color=series)) + geom_line() stocks_series
This is a basic version, so I include more details with the following commands:
labs()
allows to include title, subtitle, and caption in a single code.
xlab()
and ylab()
, to name axis, I set “Date” for x and “Price” for y.
scale_color_manual()
to change the colors of the lines, I use colors that are representative of each bank.
stocks_series1 = tidy(stocks) %>% ggplot(aes(x=index,y=value, color=series)) + geom_line() + labs(title = "Top US Banks: Daily Stock Prices January 2020 - April 2020", subtitle = "End of Day Adjusted Prices", caption = " Source: Yahoo Finance") + xlab("Date") + ylab("Price") + scale_color_manual(values = c("#003B70", "#000000", "#cd1409")) stocks_series1
I hope this little “how to” is useful for you!!
Cheers!
Andrés