原文链接: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模型进行工夫序列预测