# Auto-correlation in Squared Returns

Hi All! In our previous tutorial, we had covered Stylized fact 3: Is auto-correlation absent in returns?. In this tutorial, we’ll continue exploring stylized fact and will go through Stylized fact 4: Decreasing auto-correlation trend in squared returns or absolute returns and will see if there is decreasing auto-correlation trend in squared/absolute returns using Python. If you want to learn what are stylized facts, please go here. If you’re new to Financial Analytics, I suggest you start from here.

### Stylized fact 4: Decreasing auto-correlation in squared returns or absolute returns

We had gone through the basics of auto-correlation in our previous post. If you’re hearing about this for the first time, please go to Financial Analytics: Part 10 to learn more about it. Let’s go ahead by importing MSFT stock data via Python.

```
# Importing libraries
import pandas as pd
import yfinance as yf
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import scipy.stats as scs
import statsmodels.api as sm
import statsmodels.tsa.api as smt
```

```
# Downloading MSFT data from yfinance from 1st January 2010 to 31st March 2020
msftStockData = yf.download( 'MSFT',
start = '2010-01-01',
end = '2020-03-31',
progress = False)
```

```
# Checking what's in there the dataframe by loading first 5 rows
msftStockData.head()
```

```
# Checking what's in there the dataframe by loading last 5 rows
msftStockData.tail()
```

```
# Calculating log returns and obtaining column to contain it
msftStockData['Log Returns'] = np.log(msftStockData['Adj Close']/msftStockData['Adj Close'].shift(1))
```

```
# Checking what's in there the dataframe by loading first 5 rows
msftStockData.head()
```

```
# Using back fill method to replace NaN values
msftStockData['Log Returns'] = msftStockData['Log Returns'].fillna(method = 'bfill')
msftStockData.head()
```

```
# Creating the acf plots for squared and absolute returns
fig, ax = plt.subplots(2, 1, figsize=(14, 10))
# Using statsmodels library to obtain acf plot for squared returns
smt.graphics.plot_acf(msftStockData['Log Returns'] ** 2, lags=35, alpha=0.05, ax = ax[0])
# Setting title, y-axis labels and x-axis labels of first subplot
ax[0].set(title='Autocorrelation plots of sqaured log returns', ylabel='Squared Log Returns', xlabel='Lag')
# Obtaining acf plot of absolute returns using abs function of numpy library
smt.graphics.plot_acf(np.abs(msftStockData['Log Returns']), lags=35, alpha=0.05, ax = ax[1])
# Setting title, y-axis labels and x-axis labels of second subplot
ax[1].set(title='Autocorrelation plots of absolute log returns', ylabel='Absolute Log Returns', xlabel='Lag')
```

As can be seen from above,

- In the first sub-plot, the auto-correlation for lags up to 12 crosses the blue shaded area (confidence interval), after that it’s inside that area and is decreasing also.
- In the second sub-plot, the auto-correlation for lags up to 18 crosses the said area and after that lies within the area (except for lag 25 and 30.

Thus, we have established and verified fourth stylized fact here, i.e., there is decreasing auto-correlation for squared and absolute log returns.

With this, we conclude our tutorial. In the next tutorial, we will learn about Stylized fact 5: Leverage effect. Don’t forget to subscribe to our YouTube channel where we explain all this by means of videos. Stay tuned!