本文包含用Python计算股票beta系数并对其进行排序存入Excel的完整详细流程
一、Beta系数介绍
β系数也称为贝塔系数(Beta coefficient),是一种风险指数,用来衡量个别股票或股票基金相对于整个股市的价格波动情况。β系数是一种评估证券系统性风险的工具,用以度量一种证券或一个投资证券组合相对总体市场的波动性,在股票、基金等投资术语中常见。
贝塔系数是统计学上的概念,它所反映的是某一投资对象相对于大盘的表现情况。其绝对值越大,显示其收益变化幅度相对于大盘的变化幅度越大;绝对值越小,显示其变化幅度相对于大盘越小。如果是负值,则显示其变化的方向与大盘的变化方向相反;大盘涨的时候它跌,大盘跌的时候它涨。由于我们投资于投资基金是为了取得专家理财的服务,以取得优于被动投资于大盘的表现情况,这一指标可以作为考察基金经理降低投资波动性风险的能力。
二、Beta系数计算公式
其中,rm为该股票所在市场整体的涨跌幅,ra为该支股票自身的涨跌幅,Cov(ra,rm)为两者的协方差。
分母部分则为该支股票自身涨跌幅的标准差。
三、协方差的意义和计算公式
协方差(Covariance)在概率论和统计学中用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。
所以协方差的计算公式可以由方差的计算公式来推出。
方差计算公式为:
由此推知协方差计算公式为:
由于Python中并没有直接计算协方差的公式,所以我们可以对协方差公式进行一定的转化。
我们可以发现X,Y的协方差恰好等于X,Y的标准差的乘积,而Python当中正好有直接计算标准差的方法。
四、代码实现(完整代码在最后)
首先,为了抓取股票的数据,我们需要先引入一个非常好用的免费的tushare库(详细操作步骤参见我上一篇文章)
官网网址:https://tushare.pro/register?reg=427001
import tushare as ts
ts.set_token('你在官网个人中心中拿到的token')
pro = ts.pro_api()
抓取所有股票的基本信息并设定基本的输入参数:
stock_info = pro.stock_basic()
startdate: str = input('请输入开始日期\n')
enddate: str = input('请输入结束日期\n')
抓取上证指数和深证指数的数据
SH_code = '000001.SH'
SZ_code = '399300.SZ'
SH = pro.index_daily(ts_code=SH_code,start_date=startdate,end_date=enddate)
SZ = pro.index_daily(ts_code=SH_code,start_date=startdate,end_date=enddate)
分别计算它们涨跌幅的标准差和方差
SH_std = SH.std()
SH_var = SH.var()
SZ_std = SZ.std()
SZ_var = SZ.var()
遍历所有股票并提取出每只股票的日线行情
for i in range(0,len(stock_info)):
if i > 0 and i % 120 == 0:
time.sleep(60)
code = stock_info.at[i,'ts_code']
change = pro.daily(ts_code=code,start_date=startdate,end_date=enddate)
提取出每只股票涨跌幅的标准差,根据它们的股票代码判断它们所在的市场,然后运用beta系数的公式计算出每只股票的beta系数
if change.empty == False:
std = change.std()
change_std = std.pct_chg
if code[7:] == 'SH':
cov = SH_std.pct_chg * change_std
beta = cov / SH_var.pct_chg
elif code[7:] == 'SZ':
cov = SZ_std.pct_chg * change_std
beta = cov / SZ_var.pct_chg
beta_value[stock_info.at[i,'ts_code']] = (beta,stock_info.at[i,'name'])
else:
continue
这里需要注意一点,由于个别股票的日线行情有可能提取不到,所以这里需要加一个if进行判断
最后对beta系数进行从高到低排序,存入excel表中
rank = sorted(beta_value.items(),key=lambda x:x[1],reverse=True)
for i in range(0,len(rank)):
rank_code.append(rank[i][0])
rank_name.append(rank[i][1][1])
rank_beta.append(rank[i][1][0])
data={
'股票代码':rank_code,
'股票名称':rank_name,
'beta':rank_beta,
}
df = DataFrame(data)
df.to_excel('贝塔系数.xlsx')
完整代码如下:
import tushare as ts
from pandas import DataFrame
import time
ts.set_token('你的token')
pro = ts.pro_api()
stock_info = pro.stock_basic()
startdate: str = input('请输入开始日期\n')
enddate: str = input('请输入结束日期\n')
SH_code = '000001.SH'
SZ_code = '399300.SZ'
SH = pro.index_daily(ts_code=SH_code,start_date=startdate,end_date=enddate)
#print(SH)
SH_std = SH.std()
SH_var = SH.var()
#print(SH_std.pct_chg)
SZ = pro.index_daily(ts_code=SH_code,start_date=startdate,end_date=enddate)
SZ_std = SZ.std()
SZ_var = SZ.var()
beta_value = {}
rank=[]
rank_code=[]
rank_beta=[]
rank_name=[]
for i in range(0,len(stock_info)):
if i > 0 and i % 120 == 0:
time.sleep(60)
code = stock_info.at[i,'ts_code']
change = pro.daily(ts_code=code,start_date=startdate,end_date=enddate)
if change.empty == False:
std = change.std()
change_std = std.pct_chg
if code[7:] == 'SH':
cov = SH_std.pct_chg * change_std
beta = cov / SH_var.pct_chg
elif code[7:] == 'SZ':
cov = SZ_std.pct_chg * change_std
beta = cov / SZ_var.pct_chg
beta_value[stock_info.at[i,'ts_code']] = (beta,stock_info.at[i,'name'])
else:
continue
rank = sorted(beta_value.items(),key=lambda x:x[1],reverse=True)
print(rank)
for i in range(0,len(rank)):
rank_code.append(rank[i][0])
rank_name.append(rank[i][1][1])
rank_beta.append(rank[i][1][0])
data={
'股票代码':rank_code,
'股票名称':rank_name,
'beta':rank_beta,
}
df = DataFrame(data)
df.to_excel('贝塔系数.xlsx')