关于算法:R语言计算资本资产定价模型CAPM中的Beta值和可视化

159次阅读

共计 5433 个字符,预计需要花费 14 分钟才能阅读完成。

原文链接:http://tecdat.cn/?p=22588 

明天咱们将计算投资组合收益的 CAPM 贝塔。这须要拟合一个线性模型,失去可视化,从资产收益的角度思考咱们的后果的意义。

简略的背景介绍,资本资产定价模型(CAPM)是由威廉·夏普(William Sharpe)创立的一个模型,它依据市场收益和资产与市场收益的线性关系来估算资产的收益。这种线性关系就是股票的贝塔系数。
计算 CAPM 的 betas 能够作为一个团队工作中更简单的模型的一个很好的模板。
咱们将专一于 CAPM 的一个特定方面:β 值。正如咱们下面所指出的,贝塔系数是指一项资产的收益率回归到市场收益率的后果。它抓住了资产与市场之间的线性关系

在计算该投资组合的贝塔值之前,咱们须要找到投资组合的月度收益率。

pri <- 
  getSymbols(symbols, src = 'yahoo', 
             from = "2013-01-01",
             to = "2017-12-31",
             auto.assign = TRUE, warnings = FALSE) %>% 
monthly <- to.monthly(pri

咱们将两个投资组合收益和一个资产收益一起剖析。

CAPM 和市场收益

咱们的第一步是做出抉择,用哪种资产作为市场收益的代理,咱们将抉择 SPY ETF,将规范普尔 500 指数视为市场收益。

让咱们计算一下 SPY 的市场收益。留神开始日期是 “2013-01-01″,完结日期是 “2017-12-31″,所以咱们将应用五年的收益。

getSymbols("SPY", 
               src = 'yahoo', 
               from = "2013-01-01", 
               to = "2017-12-31",
             auto.assign = TRUE, 
             warnings = FALSE) %>% 

return <-
  Return.calculate(monthl, method = "log") %>%

 咱们还想要一个市场收益率的 data.frame 对象,并转换 xts 对象。

returns_tidy <-
  returns_xts %>% 
    tk\_tbl(preserve\_index = TRUE, rename_index = "date") %>%

 

咱们有一个 market\_returns\_tidy 对象。咱们确保它的周期性与投资组合周期统一

monthly %>% 
  mutate(market\_returns = returns\_tidy$returns) %>%
  head()

如果周期性不统一,mutate()就会抛出一个谬误。

计算 CAPM 贝塔

计算投资组合的 β 值,首先让咱们看看这个方程式。

投资组合 β 等于投资组合收益和市场收益的协方差,除以市场收益的方差。

咱们能够用 cov 计算分子,即投资组合和市场收益的协方差,用 var 计算分母。

咱们的投资组合 β 值等于。

cov(monthly,returns)/var(returns)

这个 β 值相当靠近于 1,毕竟 SPY 是这个投资组合的一个重要局部。

咱们也能够通过找到咱们每个资产的贝塔值,而后乘以资产权重来计算组合贝塔值。也就是说,投资组合贝塔值的另一个方程式是资产贝塔值的加权和。

 

为了在 R 中应用这种办法,咱们首先要找到咱们每个资产的 β 值。

咱们须要将每项资产的收益率回归到市场收益率上。咱们能够用 lm()对资产 1 进行回归,而后再用 lm()对资产 2 进行回归,等等。但如果咱们有一个 50 个资产的投资组合,这将是不事实的。相同,咱们写一个代码流程,应用 map()来回归咱们所有的资产,并通过一次调用计算 betas。

咱们将从咱们的 returns_long 参差的数据框架开始。

assets

nest(-asset)扭转了咱们的数据框架,所以有两列:一列叫做 asset,保留咱们的资产名称,一列叫做 data,保留每个资产的 收益 列表。当初咱们曾经将 收益 列表 "嵌套" 在一列中。

当初咱们能够应用 map()对每个嵌套的列表利用一个函数,并通过 mutate()函数将后果存储在一个新的列中。整个管道命令是 mutate(model = map(, ~ lm())

long %>% 

  mutate(map(data, ~ lm(returns ~ returns) 
assets

咱们当初有三列:之前的资产,之前的数据,以及咱们刚刚增加的模型。模型一栏是咱们对每项资产进行回归的后果 lm()。这些后果是咱们每个资产的 β 值和截距。

让咱们用 tidy()函数整顿一下咱们的后果。咱们想将该函数利用于咱们的模型列,并将再次应用 mutate()和 map()组合。

mutate(model = map(data, ~ lm(returns ~ returns)) %>%
  mutate(model = map(model, tidy))

咱们当初曾经很靠近了,然而模型栏里有嵌套的数据框。它们是格式化很好的数据框架。

beta_assets$model

不过,我不喜爱最终呈现嵌套的数据框架,所以咱们调整模型列。

mutate(model = map(data, ~ lm(returns ~returns)) %>%
unnest(model)

当初,这看起来比拟整洁。咱们将做进一步的清理,去掉截距,因为咱们须要贝塔值。

  mutate(map( ~ lm(returns ~ returns)) %>% 
  filter(term == "returns") %>%

疾速查看应该发现 SPY 与本身的贝塔为 1。

bet %>% filter(asset == "SPY")

当初让咱们看看咱们对这些资产的组合如何影响投资组合的 β 值。

让咱们依照下面的抉择来调配投资组合的权重。

当初咱们能够应用这些权重来取得咱们的投资组合的 β 值,基于每个资产的 β 值。

  w\[1\] * beta$estimate\[1\] + 
  w\[2\] * beta$estimate\[2\] + 
  w\[3\] * beta$estimate\[3\] +
  w\[4\] * beta$estimate\[4\] +
  w\[5\] * beta$estimate\[5\]

这个贝塔值与咱们下面用协方差 / 方差法计算的是一样的,当初咱们晓得投资组合收益和市场收益的协方差除以市场收益的方差等于咱们把每项资产的收益回归到市场收益上失去的加权预计。

xts 计算 CAPM 的 Beta 值

应用内置 CAPM.beta()函数。该函数须要两个参数:咱们心愿计算其 β 值的投资组合(或任何资产)的收益,以及市场收益。

 CAPM.beta(\_monthly, returns\_xts)

在 Tidyverse 中计算 CAPM Beta

首先,咱们将应用 dplyr 来抓取咱们的投资组合贝塔。咱们稍后会进行一些可视化,但当初将提取投资组合的 β 值。

为了计算贝塔值,咱们调用 do(model = lm())。而后咱们应用 tidy()函数,使模型后果更容易看懂。

do(model = lm(returns ~return)) %>% 
  mutate(term = c("alpha", "beta"))

Tidyquant 计算 CAPM 的 β 值

应用 tidyquant 函数。可能将 CAPM.beta()函数利用于一个数据框架。

  tq_performance(Ra = returns, 
                 Rb = return, 
                 performance_fun = CAPM.beta)

稳固的后果和靠近 1 的贝塔值是比拟现实的,因为咱们的投资组合有 25% 调配给规范普尔 500 指数。

CAPM beta 的可视化

在可视化之前,咱们须要计算投资组合的收益,而后计算投资组合波及到的单个资产的 CAPMβ。

可视化投资组合收益、危险和市场收益之间的关系

CAPM 的 β 值通知咱们投资组合收益与市场收益之间的线性关系。它还通知咱们投资组合的风险性 – 投资组合绝对于市场的稳定水平。在咱们探讨贝塔系数自身之前,让咱们先看看咱们的资产的预期月度收益与咱们个别资产的月度危险的比照。

  ggplot(aes(x = sdev, y = ex_return)) +
  geom_point(size = 2) +

咱们的投资组合在这个散点图上的地位如何?让咱们用 geom_point()把它增加到 ggplot()中。

  ggplot(aes(x = stdev, y = expreturn)) +
  geom_point(size = 2) +
  geom_point(aes(x = sd(returns),

咱们的投资组合收益 / 危险看起来都不错,只管 SP500 指数的预期收益率更高,只是危险更大一些。在过来的五年里,要战败市场是很艰难的。EEM 和 EFA 有较高的危险和较低的预期收益,而 IJS 有较高的危险和较高的预期收益。

一般来说,散点是为咱们的投资组合提供一些收益 - 危险的背景。它不是 CAPM 的间接组成部分。

接下来,让咱们更间接地转向 CAPM,用 X 轴上的市场收益和 Y 轴上的投资组合收益的散点图来直观地显示咱们的投资组合与市场之间的关系。首先,咱们将通过调用 mutate()将市场收益增加到咱们的投资组合 tibble 中。而后,咱们用 ggplot()设置咱们的 x 轴和 y 轴。

  ggplot(aes(x = market_returns, y = returns)) + 
  geom_point() +

这个散点图与 β 计算传播了雷同的强线性关系。咱们能够用 geom_smooth()给它增加一个简略的回归线。

ggplot(aes(x = market_returns, y = returns)) + 
  geom_point() +
  geom_smooth(method = "lm") +

线性回归

在完结 CAPM beta 的剖析之前,让咱们来探讨一下如何创立更乏味的可视化数据。

上面的代码块从 lm()的模型后果开始,它将咱们的投资组合收益率回归到市场收益率上。咱们将后果存储在一个名为 model 的列表列中。接下来,咱们调用 augment(),将预测值增加到原始数据集,并返回一个 tibble。

这些预测值将被放在.fitted 列中。

  do(model = lm(returns ~ returns)%>% 
  augment(model) %>% 
  mutate(date = date)
head(portfolio_model)

让咱们用 ggplot()来看看拟合的收益值与理论收益值的匹配水平。

portfolio\_model\_augmented %>% 
  ggplot(aes(x = date)) + 
  geom_line(aes(y = returns, color = "actual returns")) + 
  geom_line(aes(y = .fitted, color = "fitted returns")) +
  scale\_colour\_manual("", 
                      values = c("fitted returns" = "green", 
                                 "actual returns" = "cornflowerblue")) +
  xlab("date") + 
  ggtitle("Fitted versus actual returns")

这些月度收益和拟合值仿佛重合得不错。让咱们把理论收益和拟合收益都转换为一元的增长,并进行同样的比拟。

  ggplot(aes(x = date)) + 
  geom_line(aes()) + 
  geom_line(aes)) +

咱们的拟合增长很好地预测了咱们的理论增长,只管在大部分工夫里,理论增长低于预测值。

参考文献 

The Capital Asset Pricing Model: Theory and Evidence Eugene F. Fama and Kenneth R. French, The Capital Asset Pricing Model: Theory and Evidence, The Journal of Economic Perspectives, Vol. 18, No. 3 (Summer, 2004), pp. 25-46 


最受欢迎的见解

1. 在 python 中应用 lstm 和 pytorch 进行工夫序列预测

2.python 中利用长短期记忆模型 lstm 进行工夫序列预测剖析

3. 应用 r 语言进行工夫序列(arima,指数平滑)剖析

4.r 语言多元 copula-garch- 模型工夫序列预测

5.r 语言 copulas 和金融工夫序列案例

6. 应用 r 语言随机稳定模型 sv 解决工夫序列中的随机稳定

7.r 语言工夫序列 tar 阈值自回归模型

8.r 语言 k -shape 工夫序列聚类办法对股票价格工夫序列聚类

9.python3 用 arima 模型进行工夫序列预测

正文完
 0