How to Create a Covariance Matrix in R
In this article, we will learn how to create a covariance matrix in R. As we know, covariance measures the comovement between two variables i.e. the amount by which the two random variables show movement or change together. In other words, it represents the degree to which two variables are linearly associated.
A covariance matrix becomes useful when we have many variables in a dataset, and we want to know the covariance between each of those variables. It’s a square matrix that shows covariances between different variables.
Let’s learn about how to create a Covariance Matrix in R and interpret the results.
For our example, we will create the covariance matrix for three stock indices, namely, S&P 500, Dow Jones, and NASDAQ. We will fetch the historical data for these three indices from a package called
qrmdata. In the process of creating covariance matrix, we will also show some important data manipulations that we need to perform to get the right results.
Steps to Calculate Covariance Matrix
Step 1: Install and Load Packages
The first step is to install and load the two packages,
# Install and load the necessary packages install.packages(c("qrmdata", "xts")) library(qrmdata) library(xts)
Step 2: Load the stock index data
We will now load the stock index data for the three indices from the
# Load the stock index data data("SP500") data("DJ") data("NASDAQ")
Step 3: Prepare the data
The data for each index will be loaded in R as
xts objects. We need to do a few things to make it ready for creating covariance matrix. The first thing we do is convert each xts object into a dataframe. Next we merge all dataframes into a single dataframe. We update the column names to be SP500, DJ, and NASDAQ. We then clean this data by omitting rows containing NA values.
# Convert to data frames and add Date as a column SP500_df <- data.frame(Date = index(SP500), SP500 = coredata(SP500)) DJ_df <- data.frame(Date = index(DJ), DJ = coredata(DJ)) NASDAQ_df <- data.frame(Date = index(NASDAQ), NASDAQ = coredata(NASDAQ)) # Merge all dataframes by Date merged_data <- merge(SP500_df, DJ_df, by = "Date", all = TRUE) merged_data <- merge(merged_data, NASDAQ_df, by = "Date", all = TRUE) # Rename columns colnames(merged_data) <- c("Date", "SP500", "DJ", "NASDAQ") # Remove rows with NA values (i.e., dates where one or more indices didn't have data) clean_data <- na.omit(merged_data)
Step 4: Calculate daily returns
What we have in this data is the daily index values. Covariance is generally calculated on the returns (percentage changes) rather than absolute values. This is important because returns standardize the values and make them comparable. So, our next step is to calculate daily returns on each index.
# Calculate daily returns clean_data$SP500_Returns <- c(NA, diff(log(clean_data$SP500))) * 100 clean_data$DJ_Returns <- c(NA, diff(log(clean_data$DJ))) * 100 clean_data$NASDAQ_Returns <- c(NA, diff(log(clean_data$NASDAQ))) * 100 # Remove the first row (which will have NA values for the returns) clean_data <- clean_data[-1, ] # Select returns data returns <- clean_data[, c("SP500_Returns", "DJ_Returns", "NASDAQ_Returns")]
Step 5: Calculate Covariance Matrix
The final step is to create the covariance matrix. We will use the
cov() function for this.
# Calculate the covariance matrix cov_mat <- cov(returns, use = "complete.obs") # Print the covariance matrix print(cov_mat)
In our example, the resulting covariance matrix is as follows:
> print(cov_mat) SP500_Returns DJ_Returns NASDAQ_Returns SP500_Returns 1.351521 1.273071 1.613118 DJ_Returns 1.273071 1.285778 1.412438 NASDAQ_Returns 1.613118 1.412438 2.877315
The numbers on the diagonals are the variances of each index.
1.351521is the variance of the returns for the SP500 index
1.285778is the variance of the returns for the DJ index
2.877315is the variance of the returns for the NASDAQ index
The non-diagonal numbers represent the covariances between different indexes.
1.273071is the covariance between the returns of the SP500 and DJ indices
1.613118is the covariance between the returns of the SP500 and NASDAQ indices
1.412438is the covariance between the returns of the DJ and NASDAQ indices
Remember that a positive covariance indicates that the two indices increase/decrease simultaneously, while a negative number indicates that they move inversely (when one increases, the other decreases).