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.
Now,
Beta = Covariance/Variance
In simple terms,
This python code patch is written for NSEPython Library first time. We shall use Daily
as period and NIFTY 50
as default benchmark.
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)
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)
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
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
.
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)
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
mean = sum(y) / len(y)
variance = sum((i - mean) ** 2 for i in y) / len(y)
print(variance)
2.0150753721209677e-05
beta = covariance/variance
print(beta)
2.418464453142704
So, That’s How You calculate the Beta of stock in the Indian Share Market in Python.
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)))
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.