# How to find the beta of Indian stocks using Python?

## How to find the beta of Indian stocks using Python?

Beta is a coefficient is a measure of its volatility over time compared to a market benchmark. Market benchmark has a beta of 1. Shortly, if volatility is 1.5 it means it is 50% more volatile than the market.

• A stock that swings more than the market over time has a beta greater than 1.0.
• If a stock moves less than the market, the stock’s beta is less than 1.0.

## Finding beta of a stock using formula

• Get the Historical Price of the Stock or Index.
• Get the Historical Price of the other Stock or Index against which You are trying to benchmark.
• Calculate the Percentage Change for the same period for both the stock/index and the benchmark.
• Calculate the covariance of the stock/index to the benchmark.
• Calculate the Variance of the benchmark.

Now,

Beta = Covariance/Variance

In simple terms,

• Covariance is the measure of a stock/index’s return relative to the market.
• Variance is the measure of how the market moves relative to its mean.

## Python Code

This python code patch is written for NSEPython Library first time.  We shall use `Daily` as period and `NIFTY 50` as default benchmark.

### Part 1 - Get the Historical Price of the Stock or Index

We are using the `equity_history()` function. We are building Pandas Dataframe over last `10` days’ data of `SBIN`

```				```
symbol = "SBIN"
days = 10
end_date = datetime.datetime.now().strftime("%d-%m-%Y")
end_date = str(end_date)

start_date = (datetime.datetime.now()- datetime.timedelta(days=days)).strftime("%d-%m-%Y")
start_date = str(start_date)

df = equity_history(symbol,"EQ",start_date,end_date)

df["daily_change"]=df["CH_CLOSING_PRICE"].pct_change()
df=df[['CH_TIMESTAMP','daily_change']]
df = df.iloc[1: , :] #thispointer.com/drop-first-row-of-pandas-dataframe-3-ways/
print(df)

```
```

### Part 2 - Get the Historical Price of the Benchmark

We are using the `index_history()` function. We are building Pandas Dataframe over the last `10` days’ data of `NIFTY 50` similarly as We did for `SBIN`

```				```
symbol = "NIFTY 50"
days = 10
end_date = datetime.datetime.now().strftime("%d-%b-%Y")
end_date = str(end_date)

start_date = (datetime.datetime.now()- datetime.timedelta(days=days)).strftime("%d-%b-%Y")
start_date = str(start_date)

df2=index_history("NIFTY 50",start_date,end_date)
df2["daily_change"]=df2["CLOSE"].astype(float).pct_change()
df2=df2[['HistoricalDate','daily_change']]
df2 = df2.iloc[1: , :]
print(df2)
```
```

### Output of Part 1

```				```
CH_TIMESTAMP  daily_change
1   2021-06-11     -0.001743
2   2021-06-10      0.006169
3   2021-06-09     -0.024986
4   2021-06-08      0.013643
5   2021-06-07      0.011821
```
```

### Output of Part 2

```				```
HistoricalDate  daily_change
1    11 Jun 2021     -0.000791
2    10 Jun 2021     -0.003899
3    09 Jun 2021     -0.006507
4    08 Jun 2021      0.006700
5    07 Jun 2021      0.000734
```
```

There is no need for `Part 3` as We have already calculated the Percentage Change using `pct_change()` function of `Pandas`.

### Part 4 - Calculate the covariance of the stock/index to the benchmark

First We shall convert the `daily_change` column of both the Pandas Dataframe to `List` for our ease of Calculation. Even When in our first article, `CoVariance` applied on Google Sheets was done Series only. You can revisit clicking here.

```				```
x=df["daily_change"].tolist()
y=df2["daily_change"].tolist()

print("List of x:")
print(x)
print("List of y:")
print(y)

#stackoverflow.com/questions/42670055/is-there-any-better-way-to-calculate-the-covariance-of-two-lists-than-this
mean_x = sum(x) / len(x)
mean_y = sum(y) / len(y)

covariance = sum((a - mean_x) * (b - mean_y) for (a,b) in zip(x,y)) / len(x)
print(covariance)
```
```

### Output

```				```
List of x:
[-0.0017427675148135036, 0.006168528864059608, -0.02498554077501447, 0.013643374065725578, 0.011821161048689133]
List of y:
[-0.0007905463307582572, -0.003898894574776879, -0.0065066480278311856, 0.006699562209992127, 0.0007337945756380471]
4.873388157877867e-05
```
```

### Part 5 - Calculate the Variance of the benchmark

```				```
mean = sum(y) / len(y)
variance = sum((i - mean) ** 2 for i in y) / len(y)
print(variance)
```
```

### Output

```				```
2.0150753721209677e-05

```
```

### Part 6 - Getting The Beta

```				```
beta = covariance/variance
print(beta)
```
```

### Output

```				```
2.418464453142704

```
```

So, That’s How You calculate the Beta of stock in the Indian Share Market in Python.

### Wrapping Up

Here goes the final version of the `get_beta()` function. It has more brevity and it also fixes the mess of various types of timestamps across the `equity_history()` and `index_history()` function.

```				```
def get_beta_df_maker(symbol,days):
if("NIFTY" in symbol):
end_date = datetime.datetime.now().strftime("%d-%b-%Y")
end_date = str(end_date)

start_date = (datetime.datetime.now()- datetime.timedelta(days=days)).strftime("%d-%b-%Y")
start_date = str(start_date)

df2=index_history(symbol,start_date,end_date)
df2["daily_change"]=df2["CLOSE"].astype(float).pct_change()
df2=df2[['HistoricalDate','daily_change']]
df2 = df2.iloc[1: , :]
return df2
else:
end_date = datetime.datetime.now().strftime("%d-%m-%Y")
end_date = str(end_date)

start_date = (datetime.datetime.now()- datetime.timedelta(days=days)).strftime("%d-%m-%Y")
start_date = str(start_date)

df = equity_history(symbol,"EQ",start_date,end_date)

df["daily_change"]=df["CH_CLOSING_PRICE"].pct_change()
df=df[['CH_TIMESTAMP','daily_change']]
df = df.iloc[1: , :] #thispointer.com/drop-first-row-of-pandas-dataframe-3-ways/
return df

def get_beta(symbol,days,symbol2="NIFTY 50"):
df = get_beta_df_maker(symbol,days)
df2 = get_beta_df_maker(symbol2,days)

x=df["daily_change"].tolist()
y=df2["daily_change"].tolist()
#stackoverflow.com/questions/42670055/is-there-any-better-way-to-calculate-the-covariance-of-two-lists-than-this
mean_x = sum(x) / len(x)
mean_y = sum(y) / len(y)
covariance = sum((a - mean_x) * (b - mean_y) for (a,b) in zip(x,y)) / len(x)

mean = sum(y) / len(y)
variance = sum((i - mean) ** 2 for i in y) / len(y)

beta = covariance/variance
return round(beta,3)

for x in fnolist():
try:
print(x+" : "+str(get_beta(x,255)))
break
except:
pass

#NIFTY Against NIFTY Bank
x = "NIFTY 50"
print(x+" : "+str(get_beta(x,255,"NIFTY BANK")))

#NIFTY Bank Against NIFTY
x = "NIFTY BANK"
print(x+" : "+str(get_beta(x,255)))
```
```

### Output

```				```
TORNTPHARM : -0.168
NIFTY 50 : 0.55
NIFTY BANK : 1.395
```
```

If You remove the `break` command in the `Line 49` as highlighted here, You will get the list of entire stocks of `FNO` and their `Beta`s.

Note – We used `255` as `Number of Days` because it is globally assumed that, there are `255` trading days. For near-term correlation, feel free to change the values.

×Close