How to calculate beta for Indian stocks using python and jugaad-data

What is Beta in finance

Beta is measure of risk/volatility of a stock. The fundamental assumption is that returns of a stock are linearly co-related to returns of an index, which means they can be defined by a linear equation like y = mx + c.

Mathematically β can be defined as slope of line defining relation between stock and index ie-

return_stock = β x return_index + α + e

β can be calculated by regression with below formula

β = Cov(return_stock, return_index)/Var(return_market)

You can read more about it here-

There are readymade filters online based on beta like topstockreasearch.com, but if you want to know how to calculate it by yourself, read on-

How to interprete it

As mentioned earlier, it is measure of volatility.

Value of beta Interpretation
> 1 Stock is more volatile than the index but moves in same direction, ie. if stock has a beta of 1.2, when the NIFTY moves by +1%, the stock is likely to move by +1.2%, but similarly when index falls by -1% stock will likely fall by -1.2%
< 1 Stock is less volatile than the index and moves in same direction slower than index, ie. if stock has a beta of 0.5, when the NIFTY moves by +1% stock is likely to move by +0.5%, but similarly when index falls by -0.5% stock will likely fall by -0.5%
< 0 Negative beta means stock moves in opposite direction of the index. if stock has a beta of -1.2, when the nifty moves by +1%, the stock will likely fall -1.2% and vice-verca

Hope this gives you a good idea. Please do read more about it on investopedia Beta is also used in Modern Portfolio Theory and for calculating Equity risk premium in CAPM

Now that we have understood the finance concepts, let us now look at the code

Download required historical data

Hope you have installed jugaad-data and pandas using pip. If not, just run pip install jugaad-data pandas to install it.

We will download last six months data.

from datetime import date
import pandas as pd
from jugaad_data.nse import index_df, stock_df
idx = index_df("NIFTY 50", date(2020,1,1), date(2020,6,1) )
stk = stock_df("RELIANCE", date(2020,1,1), date(2020,6,1))
print(idx.head())
print(stk.head())
  Index Name INDEX_NAME HistoricalDate     OPEN     HIGH      LOW    CLOSE
0   Nifty 50   NIFTY 50     2020-06-01  9726.85  9931.60  9706.95  9826.15
1   Nifty 50   NIFTY 50     2020-05-29  9422.20  9598.85  9376.90  9580.30
2   Nifty 50   NIFTY 50     2020-05-28  9364.95  9511.25  9336.50  9490.10
3   Nifty 50   NIFTY 50     2020-05-27  9082.20  9334.00  9004.25  9314.95
4   Nifty 50   NIFTY 50     2020-05-26  9099.75  9161.65  8996.65  9029.05
        DATE SERIES     OPEN     HIGH      LOW  ...   52W L    VOLUME         VALUE  NO OF TRADES    SYMBOL
0 2020-06-01     EQ  1480.00  1538.35  1475.95  ...  875.65  18434065  2.789048e+10        354436  RELIANCE
1 2020-05-29     EQ  1468.00  1472.00  1452.65  ...  875.65  18471770  2.702029e+10        300018  RELIANCE
2 2020-05-28     EQ  1455.00  1479.75  1449.00  ...  875.65  18519252  2.717698e+10        405603  RELIANCE
3 2020-05-27     EQ  1431.00  1454.00  1412.00  ...  875.65  16460764  2.354223e+10        348477  RELIANCE
4 2020-05-26     EQ  1448.15  1449.70  1416.30  ...  875.65  15330793  2.190317e+10        341795  RELIANCE

[5 rows x 15 columns]

You can read more on jugaad-data capabilities in the documentation

Transformation and clean up

Basic clean-up

idx['DATE'] = idx['HistoricalDate']
df = idx[["DATE", 'CLOSE']]
df.columns = ['DATE', "NIFTY"]
df = pd.merge(df, stk[['DATE', 'CLOSE']], how='inner', on='DATE')
df.columns = ['DATE', 'NIFTY', 'STK']

Calculate returns for both stock and nifty

Now you can calculate beta on daily, weekly or monthly returns depending on your use case, we are going to calculate beta on daily returns here, you can shift by 5 if you want a weekly return.

df['STK_PREV'] = df['STK'].shift(1)
df['NIFTY_PREV'] = df['NIFTY'].shift(1)
df['NIFTY_CHG'] = (df['NIFTY']-df['NIFTY_PREV'])/df['NIFTY_PREV']
df['STK_CHG'] = (df['STK']-df['STK_PREV'])/df['STK_PREV']
df.dropna(inplace=True)
print(df.head())
        DATE    NIFTY      STK  STK_PREV  NIFTY_PREV  NIFTY_CHG   STK_CHG
2 2020-05-28  9490.10  1472.25   1464.40     9580.30  -0.009415  0.005361
3 2020-05-27  9314.95  1445.55   1472.25     9490.10  -0.018456 -0.018136
4 2020-05-26  9029.05  1424.05   1445.55     9314.95  -0.030693 -0.014873
5 2020-05-22  9039.25  1431.55   1424.05     9029.05   0.001130  0.005267
6 2020-05-21  9106.25  1441.25   1431.55     9039.25   0.007412  0.006776

Calculate Covariance, Variance and ultimately the Beta

Numpy provides you readymade functions to calculate Covariance and Variance of a series.

A note on np.cov function, it returns a covariance matrix, eg

np.cov(a,b) returns-

[
    [cov(a,a), cov(a,b)],
    [cov(b,a), cov(b,b)]
]

So either select [1,0] or [0,1]

import numpy as np

cov = np.cov(df['STK_CHG'], df['NIFTY_CHG'])
var = np.var(df['NIFTY_CHG'])
print(cov)
[[0.00156533 0.00096934]
 [0.00096934 0.0008748 ]]
print(cov[1,0]/var)
1.119145517341673

Conclusion

In this article we learnt

You can download the ipython notebook here

Hope you learnt something interesting