STRATxAI
April 2023 · 5 min readWe discussed in previous posts both the value factor and quality factor and what fundamental data we use to construct metrics that help us find the stocks with those properties. Now we move to another popular factor that is called the low-volatility factor, which is based on very different data.
What does an example of a low-volatility factor represent ?
The low-volatility factor identifies the stocks that have the lowest historical volatility and forms portfolios based on those stocks
Volatility was discussed previously in this post and this post but we will briefly mention it for this article. Volatility is the variation of the underlying data around its average value over some historical period. It measures the dispersion of the data around the average value. For stocks, volatility is usually referenced when we are discussing the stocks returns and higher dispersion means higher volatility, which typically means higher risk. The important concept now for this topic is to discuss and dive deep to explain exactly how we construct volatility from our data.
A question that is often asked is, what is the volatility of the S+P 500 ? To answer this question fully, we need just a little bit of extra information, which relates to the historical period we want to use to analyze the S+P. Essentially we have two options, we could:
The benefit of method 1 is that it gives an investor a really clear cut, single number to summarize the volatility. This number for our S+P 500 example was 15.6%. The downside of method 1 is that it shows no time-variation of the volatility so you cannot plot or graph the volatility to see how it changes. For example, you cannot answer the question "what was the maximum volatility during 2020-2022", all you have to go on is the 15.6%.
The benefit of method 2, as we can see from the graph, is that we can see how the 1y rolling volatility changes and we can identify spikes and troughs in volatility. The downside is that we need to agree on some method to simplify this data down to either a single number or a small set of numbers that are easily interpretable. Obviously, combining the two methods is a viable option and used by many in this way.
We do not use any balance sheet or fundamental data for the construction of the low-volatility factor. Instead we use purely the price data for all stocks and use this price data to then construct the stock returns. If we take all the stocks in our universe and calculate their return volatilities, then a very simple low-volatility factor would be to rank the stocks in volatility ascending order and invest in the first 15-20 stocks (i.e these are the stocks with the lowest volatilities).
This is just one method to simply rank stocks, we can of course start to add complexity and start to have multiple volatility metrics over different historical timeframes. Then we can average our volatility scores to construct a final low-volatility portfolio.
A portfolio can then be formed based on an equal weight of the three volatility metrics, where the model is trying to for example pick up a trend and rely on more recent information by using 6 month and 3 month data.
Alternatively, a more sophisticated investor may not want to just focus on historical volatility but instead look at forecasting future volatility. Similar to the previous method, a final low-volatility portfolio could then be formed by weighting equally stocks returned from the usual historical volatility method and the stocks returned from the new forecasted volatility model. This type of method is beyond the scope of this article but we can devote a follow-up article to volatility forecasting if users prefer, please contact us.
Easy python code to construct volatility
1# Import libraries
2import pandas as pd
3import numpy as np
4
5# Calculate the volatility of stock returns over 1y
6# stock_returns is a pandas dataframe that stores our stock price daily returns
7stock_1y_vol = stock_returns.rolling(window=252, min_periods=252).std()
8
9# Annualise the volatility
10stock_1y_vol = np.sqrt(252) * stock_1y_vol