「⼿把⼿教你」Python计算股票收益率、Alpha和Beta值
本⽂作为⾦融量化分析的⼊门基础之⼀,⼿把⼿带领⼤家使⽤Python计算股票的收益率,重点展⽰如何利⽤Python对⽇收益率数据向⽉、年收益率转换,然后演⽰个股Alpha和Beta值的计算。
管理系统服务#先引⼊后⾯可能⽤到的包(package)
import pandas as pd
import numpy as np
from scipy import stats
import tushare as ts
import matplotlib.pyplot as plt
%matplotlib inline
#正常显⽰画图时出现的中⽂和负号
from pylab import mpl
收益率转化
对⽇期进⾏处理,分别将⽇对数收益率转化为⽉和年收益率。主要有三个步骤:
(1)估计股票每⽇对数收益率;
(2)加总对数收益率到每⽉(年);
python入门教程非常详细电子书(3)将⽉(年)收益率转化为百分⽐收益率
stock='sh'
_k_data(stock,start='1990-12-20')
使⽤tushare中的get_k_data()得到的数据框索引是顺序数字,⽽不是⽇期序列,因此,为分析⽅⾯,需要进⾏变换,即使
⽤“date”作为索引。
df._datetime(df.date)
#del df['date'] #删掉该列
df.tail() #这时候可以看到索引已经是date了
遇到问题没⼈解答,⼩编创建了⼀个Python学习交流裙:五⼆⼋ 三九七 六⼀七, 寻有志同道合的⼩
伙伴,互帮互助,⾥还有不错的学习视频教程和PDF电⼦书分享!
好看简单的花边步骤⼀:计算对数收益率
#计算的时候第⼀个数成为缺失值,删掉
sguardupdate是什么意思lograte=np.log(df.close/df.close.shift(1))[1:]
expose的用法固定搭配步骤⼆:加总对数收益率到每⽉
month=[]
index=lograte.index
for i in range(0,np.size(lograte)):
month.append(''.join([index[i].strftime("%Y"),index[i].strftime("%m")])) y=pd.DataFrame(lograte.values,month,columns=['⽉收益率'])
y.tail()
步骤三:将⽉(年)收益率转化为百分⽐收益率
ret_upby(y.index).sum()
ret_monthly.tail()
#将⽇收益率转化为年收益率
stock='601318'
df = ts.get_k_data(code=stock, ktype='D', autype='qfq', start='2007-3-1') df._datetime(df['date'])
logret=np.log(df.close/df.close.shift(1))[1:]
year=[]
d0=df.index
for i in range(0,np.size(logret)):
year.append(d0[i].strftime("%Y"))
y=pd.DataFrame(logret.values,year,columns=['年收益率'])
ret_upby(y.index).sum())-1
ret_annual
计算股票的$\beta$系数和$\alpha值$
这⾥的beta和alpha系数都来⾃资本资产定价模型,先来看看CAPM:
E(ri)=rf+β(E(rm)−rf),
其中,E(ri)是股票i的预期收益率,rf是⽆风险利率,E(rm)是市场指数收益率;
β系数是系统性风险,在评估股市波动风险与投资机会的⽅法中,常⽤来衡量结构性与系统性风险,可以简单理解为个股波动相对⼤盘波动的偏离程度。CAPM的计量模型可以表⽰为:
ri=α+βrm+ε,
其中α可以理解为超额收益率,ε是随机扰动,可以理解为个体风险。
#先定义获取股票数据和计算收益率的函数
def get_return(code,startdate,endate):
_k_data(code,ktype='D',autype='qfq',
start=startdate,end=endate)
p1=np.array(df.close[1:])
p0=np.array(df.close[:-1])
logret = np.log(p1/p0)
rate=pd.DataFrame()
rate[code]=logret
rate.index=df['date'][1:]
return rate
#定义求beta和alpha的函数
def alpha_beta(code,startdate,endate):
mkt_ret=get_return('sh',startdate,endate)
stock_ret=get_return(code,startdate,endate)
(mkt_ret,stock_ret,left_index=True,right_index=True) x=df.iloc[:,0]
y=df.iloc[:,1]
beta,alpha,r_value,p_value,std_err=stats.linregress(x,y)
return (alpha,beta)
#定义求⼀系列股票在某个时间段的股票
def stocks_alpha_beta(stocks,startdate,endate):
df=pd.DataFrame()
alpha=[]
beta=[]
for code in stocks.values():
a,b=alpha_beta(code,startdate,endate)
alpha.append(float('%.4f'%a))
beta.append(float('%.2f'%b))
df['alpha']=alpha
df['beta']=beta
df.index=stocks.keys()
return df
startdate='2017-01-01'
endate='2018-11-09'
stocks={'中国平安':'601318','格⼒电器':'000651',
getparameter获取int型'招商银⾏':'600036','恒⽣电⼦':'600570',
'中信证券':'600030','贵州茅台':'600519'}
stocks_alpha_beta(stocks,startdate,endate)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论