# Volatility Check in Returns charts

Hi All! In our previous tutorial, we had introduced stylized facts, what the five stylized facts are and had also covered stylized fact 1 – Distribution of returns – Is it non-Gaussian? In this tutorial, we will be covering stylized fact 2 – “Are Volatility clusters formed in returns chart?” and do Volatility Check in Returns charts using Python. New to this series? – Go to part 1 of Financial Analytics series to develop a good understanding on this.

### Stylized Fact 2: Volatility Check in Returns charts

Let’s choose MSFT stock for our analysis. We’ll use yfinance to fetch stock data of MSFT.

In [1]:
```# Importing the libraries
import pandas as pd
import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt
```
In [2]:
```# Downloading MSFT data from yfinance from 1st January 2010 to 31st March 2020
start = '2010-01-01',
end = '2020-03-31',
progress = False)
```
In [3]:
```# Checking what's in there the dataframe by loading first 5 rows
```
Out[3]:
Open High Low Close Adj Close Volume
Date
2009-12-31 30.980000 30.990000 30.480000 30.480000 23.925440 31929700
2010-01-04 30.620001 31.100000 30.590000 30.950001 24.294369 38409100
2010-01-05 30.850000 31.100000 30.639999 30.959999 24.302216 49749600
2010-01-06 30.879999 31.080000 30.520000 30.770000 24.153070 58182400
2010-01-07 30.629999 30.700001 30.190001 30.450001 23.901886 50559700
In [4]:
```# Checking what's in there the dataframe by loading last 5 rows
msftStockData.tail()
```
Out[4]:
Open High Low Close Adj Close Volume
Date
2020-03-24 143.750000 149.600006 141.270004 148.339996 148.339996 82516700
2020-03-25 148.910004 154.330002 144.440002 146.919998 146.919998 75638200
2020-03-26 148.399994 156.660004 148.369995 156.110001 156.110001 64568100
2020-03-27 151.750000 154.889999 149.199997 149.699997 149.699997 57042300
2020-03-30 152.440002 160.600006 150.009995 160.229996 160.229996 63420300
In [5]:
```# Calculating log returns and obtaining column to contain it
```
In [6]:
```# Checking what's in there the dataframe by loading first 5 rows
```
Out[6]:
Open High Low Close Adj Close Volume Log Returns
Date
2009-12-31 30.980000 30.990000 30.480000 30.480000 23.925440 31929700 NaN
2010-01-04 30.620001 31.100000 30.590000 30.950001 24.294369 38409100 0.015302
2010-01-05 30.850000 31.100000 30.639999 30.959999 24.302216 49749600 0.000323
2010-01-06 30.879999 31.080000 30.520000 30.770000 24.153070 58182400 -0.006156
2010-01-07 30.629999 30.700001 30.190001 30.450001 23.901886 50559700 -0.010454
In [7]:
```# Using back fill method to replace NaN values
msftStockData['Log Returns'] = msftStockData['Log Returns'].fillna(method = 'bfill')
```
Out[7]:
Open High Low Close Adj Close Volume Log Returns
Date
2009-12-31 30.980000 30.990000 30.480000 30.480000 23.925440 31929700 0.015302
2010-01-04 30.620001 31.100000 30.590000 30.950001 24.294369 38409100 0.015302
2010-01-05 30.850000 31.100000 30.639999 30.959999 24.302216 49749600 0.000323
2010-01-06 30.879999 31.080000 30.520000 30.770000 24.153070 58182400 -0.006156
2010-01-07 30.629999 30.700001 30.190001 30.450001 23.901886 50559700 -0.010454
In [8]:
```# Line chart of log return series
msftStockData['Log Returns'].plot(title = 'Daily log returns of MSFT', figsize = (14,10))
```
Out[8]:
`<matplotlib.axes._subplots.AxesSubplot at 0x1fde5a46708>`

Thus, we can see that volatility clusters are formed in the line chart – there are some periods having higher returns and some periods have lower returns and they alternate forming a cycle of high-low-high. Thus, volatility doesn’t remain the same always.

So guys, we have just now explored Stylized fact 2 in this tutorial. In the next tutorial, we will explore stylized fact 3. Stay tuned! And don’t forget to subscribe to our YouTube channel.