R语言量化:alpha值和beta值

  量化投资中经常提到的alpha(收益)和beta(收益)是从资本资产定价模型(CAPM)中衍生出来的概念。CAPM是一个给风险定价的基本模型,它认为只有系统风险(Systematic risk)才能带来收益。这是因为非系统风险(Nonsystematic risk)可以通过投资组合的方式消除掉,如果非系统风险也可以带来收益,就意味着人们可以通过构建投资组合的方式不承担风险而得收益,这种情况下逐利的资本蜂拥而至,从而推高这种资产的价格,使其收益下降直至为零。CAPM可以写为如下的形式:

        

表示资产的风险收益只与市场的风险收益挂钩,其中系数beta度量了资产的系统风险的相对大小。式(1)的收益率给出的是期望收益率,换成实际收益率可以写成:

      

  或者是

      

  beta的大小如何计算?

  上文提到beta度量的是资产的系统风险,所谓系统风险也可以理解成和市场相关的风险,可以写成协方差的形式,根据式(3)中资产收益率与市场收益率的关系有:

      

  又因为无风险利率的风险为零,随机项ei Rm 相互独立,式(4)可以推导为:

      

  从而得到:

      

  熟悉回归的朋友可以看出这里的beta恰好是式(7)一元回归方程中的回归系数:

      

  式(7)中的截距项alpha即式(3)中的,与我们这里讲的alpha还有所不同。理解这里说的alpha或者alpha收益,还要回到CAPM模型。式(1)给出的CAPM模型是一个理论模型,实际收益率可能与之有一定的差别,事实上实际收益率可以写成式(8)的形式:

       

  也就是说资产的实际收益率由两部分组成,一部分是由CAPM模型计算得出的因承担了系统风险而获得的收益,即

称为beta收益,剩余的实际收益率和理论收益率相差的部分称为超额收益,也就是常说的alpha收益:

  R语言中常用的量化分析工具包括quantmod包和PerformanceAnalytics包等,其中PerformanceAnalytics包中内置计算alphabeta的函数。

  CAPM.alpha(Ra, Rb, Rf = 0)

  CAPM.beta(Ra, Rb, Rf = 0)

  Ra  表示要计算alphabeta的资产的收益率

  Rb  表示市场(基准)的收益率

  Rf   表示无风险利率,默认值为0

  收益率的格式可以是xtsvectormatrixdata frametimeSerieszoo等。

  下面我们以上证综合指数为基准,在无风险利率为0的情况下计算600030.SH这只股票的betaalpha(数据的下载可以参考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)


计算得到的收益率如下:

R语言量化:alpha值和beta值_第1张图片

R语言量化:alpha值和beta值_第2张图片

计算得到的betaalpha如下:

  也可以使用回归的方法计算betaalpha

## 截取两个序列时间重合的部分
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)
R语言量化:alpha值和beta值_第3张图片

  二者计算得到的alphabeta是一样的。

 

参考资料:CFA一级教材 Corporate Finance and Portfolio Management

你可能感兴趣的:(R语言,量化)