资本资产定价模型(CAPM)
投资的收益可以由收益中的非风险部分、受整个市场影响的部分,以及误差部分三者之和组成,通过资本资产定价模型(CAPM)可以得出α和β,然后确定某金融商品的风险程度:
其中,y为某种金融商品预期收益率;截距α为收益中非系统风险部分,是超额收益;斜率β为是系统风险部分;c为误差项,即残余收益(随机因素产生的剩余收益);x为整个市场的预期总体收益率;i为无风险收益。
alpha,beta系数
CAPM模型中的α,β即为alpha,beta系数:
- alpha系数是指一个人在操作某一投资中所获得的超出指数或基准回报的那部分收益,表示大盘不变时个股的涨跌幅度,表示一定程度的固定收益。
- beta系数是用以度量一项资产系统风险的指针,是用来衡量一种证券或一个投资组合相对总体市场的波动性(volatility)的一种风险评估工具。
利用机器学习获取股票的alpha,beta系数
本文利用JQData的本地sdk和python的sklearn包,实现了获取任意时间段内的任意一组股票相对于任意一种指数的alpha,beta系数的方法,并封装成一个函数。代码如下:
from sklearn.linear_model import LinearRegression
import pandas as pd
import numpy as np
from jqdatasdk import *
'''
函数参数:
stock_code:股票代码,可以是str类型的某个代码,也可以是str类型的代码列表
index:指数代码,str类型
start_date, end_date:起止时间,str类型,例如:'2019-4-25'
i:无风险年化收益率,float类型,例如:3%的年化要写成0.03
返回值:dataframe,行索引是股票代码,列索引是alpha,beta
'''
def ab(stock_code, index, start_date, end_date, i):
if type(stock_code) == str:
return ab([stock_code], index, start_date, end_date, i)
else:
# 将年化收益率转化为日收益率,一年按250个交易日计算
i = pow(i 1, 1/250) - 1
# 获取股票和指数的close,pre_close
auth(id, password) # 登录JQData,可自行修改id, password
stock_daily = get_price(stock_code, start_date=start_date, end_date=end_date, frequency='daily', fields=['close', 'pre_close'])
index_daily = get_price(index, start_date=start_date, end_date=end_date, frequency='daily', fields=['close', 'pre_close'])
# 构造指数的收益率
x = np.array((index_daily['close'] - index_daily['pre_close'])/index_daily['pre_close'] - i)
x = x.reshape(len(x), 1)
# alpha,beta结果数组
ab_list = []
for stock in stock_code:
# 构造股票的收益率
pre_close_series = stock_daily['pre_close'][stock]
close_series = stock_daily['close'][stock]
y = np.array((close_series-pre_close_series)/pre_close_series - i)
y = y.reshape(len(y), 1)
# 线性回归
line_reg = LinearRegression()
# 训练数据集,训练完成后,参数会保存在对象line_reg中
line_reg.fit(x, y)
# line_reg.intercept_为截距,就是w0,line_reg.coef_为其他参数,coef的全拼为coefficient
ab_list.append([line_reg.intercept_[0], line_reg.coef_[0][0]])
return pd.DataFrame(data=ab_list, index=stock_code, columns=['alpha', 'beta'])
测试代码:
stock_code = ['000001.XSHE', '000002.XSHE', '000001.XSHG']
# stock_code = '000001.XSHE'
print(ab(stock_code, '000001.XSHG', '2018-1-1', '2018-12-31', 0.03))
结果:
alpha beta
000001.XSHE 2.601443e-04 1.265507
000002.XSHE 1.025757e-03 1.431330
000001.XSHG 8.673617e-19 1.000000
附:
关于JQData: JQData
关于sklearn包:sklearn
关于LinearRegression:LinearRegression