量化投资中经常提到的alpha(收益)和beta(收益)是从资本资产定价模型(CAPM)中衍生出来的概念。CAPM是一个给风险定价的基本模型,它认为只有系统风险(Systematic risk)才能带来收益。这是因为非系统风险(Nonsystematic risk)可以通过投资组合的方式消除掉,如果非系统风险也可以带来收益,就意味着人们可以通过构建投资组合的方式不承担风险而白得收益,这种情况下逐利的资本蜂拥而至,从而推高这种资产的价格,使其收益下降直至为零。CAPM可以写为如下的形式:
表示资产i的风险收益只与市场的风险收益挂钩,其中系数beta度量了资产i的系统风险的相对大小。式(1)的收益率给出的是期望收益率,换成实际收益率可以写成:
或者是
beta的大小如何计算?
上文提到beta度量的是资产i的系统风险,所谓系统风险也可以理解成和市场相关的风险,可以写成协方差的形式,根据式(3)中资产收益率与市场收益率的关系有:
又因为无风险利率的风险为零,随机项ei 与Rm 相互独立,式(4)可以推导为:
从而得到:
熟悉回归的朋友可以看出这里的beta恰好是式(7)一元回归方程中的回归系数:
式(7)中的截距项alpha即式(3)中的,与我们这里讲的alpha还有所不同。理解这里说的alpha或者alpha收益,还要回到CAPM模型。式(1)给出的CAPM模型是一个理论模型,实际收益率可能与之有一定的差别,事实上实际收益率可以写成式(8)的形式:
也就是说资产i的实际收益率由两部分组成,一部分是由CAPM模型计算得出的因承担了系统风险而获得的收益,即
称为beta收益,剩余的实际收益率和理论收益率相差的部分称为超额收益,也就是常说的alpha收益:
R语言中常用的量化分析工具包括quantmod包和PerformanceAnalytics包等,其中PerformanceAnalytics包中内置计算alpha和beta的函数。
CAPM.alpha(Ra, Rb, Rf = 0)
CAPM.beta(Ra, Rb, Rf = 0)
Ra 表示要计算alpha和beta的资产的收益率
Rb 表示市场(基准)的收益率
Rf 表示无风险利率,默认值为0
收益率的格式可以是xts、vector、matrix、data frame、timeSeries、zoo等。
下面我们以上证综合指数为基准,在无风险利率为0的情况下计算600030.SH这只股票的beta和alpha(数据的下载可以参考R语言量化:使用windR下载wind数据)。
library(quantmod)
library(PerformanceAnalytics)
library(rvest)
w.start()
## 读取数据
data_sh <- w.wsd('000001.SH','open,high,low,close,volume,amt,adjfactor', '19901219')
data_zx <- w.wsd('600030.SH','open,high,low,close,volume,amt,adjfactor', '20030106')
## 转化为xts格式
data_sh <- xts(data_sh$Data[, 2:8], order.by =as.Date(data_sh$Data[, 1]))
data_zx <- xts(data_zx$Data[, 2:8], order.by =as.Date(data_zx$Data[, 1]))
## 价格复权
p_sh <- data_sh$CLOSE * data_sh$ADJFACTOR
p_zx <- data_zx$CLOSE * data_zx$ADJFACTOR
## 计算收益率
r_sh <- allReturns(p_sh)
r_zx <- allReturns(p_zx)
## 以日收益率计算beta和alpha值
beta <- CAPM.beta(r_zx$daily, r_sh$daily)
alpha <- CAPM.alpha(r_zx$daily, r_sh$daily)
计算得到的收益率如下:
计算得到的beta和alpha如下:
也可以使用回归的方法计算beta和alpha:
## 截取两个序列时间重合的部分
r_1 <- r_zx$daily[!is.na(r_zx$daily)] # 去除缺失值
r_2 <- r_sh$daily[!is.na(r_sh$daily)] # 去除缺失值
date_1 <- index(r_1) # 序列1的日期
date_2 <- index(r_2) # 序列2的日期
date_both <- intersect(date_1, date_2) # 共同的部分
v_1 <- r_1[date_1 %in% date_both] %>% as.vector # 序列1中数据转化为vector
v_2 <- r_2[date_2 %in% date_both] %>% as.vector # 序列2中数据转化为vector
# 回归
lm<- lm(v_1 ~ v_2)
summary(lm)
二者计算得到的alpha和beta是一样的。
参考资料:CFA一级教材 Corporate Finance and Portfolio Management