因子建模(附代码)

因子建模(附代码)

标星★置顶公众号     爱你们   

作者:Matthew        编译:方的馒头

1

准备工作

用于分析投资组合风险的最受欢迎的模型是因子模型,因为股票具有共同移动的趋势。证券的主要组成部分经常会解释很大一部分差异。由于我们主要关注构成投资组合的多种资产,因此需要对此进行说明。有些问题可能是为什么低市净率的股票要比具有较高市净率的股票好吗?在此,比率的“价格”部分仅是股价(每股),比率的“帐面”部分是“股东权益” /“流通股”,这是公司资产负债表上的项目。

因子模型流行的另一个重要原因是维度。假设N资产随后具有N方差和N(N-1)/2相关性。如果我们有一个有F因子的因子模型,它有N个特质方差、F个因子方差和NF个贝塔。只要:

因子建模(附代码)

因子模型的参数较少。

资本资产定价模型Sharpe(1964)是由单个因子组成的最简单因子模型。

因子建模(附代码)

平均方差参数为:

因子建模(附代码)

因子建模(附代码)

因此bi是:

因子建模(附代码)

或者表示为:

因子建模(附代码)

其中b是回归线的斜率,它使收益的平方距离最小化,a是截距或者阿尔法用一行a+bf表示。

我们将使用基础R函数进行这些计算,但是首先我们需要一些数据和R的一些库文件:

我们从Yahoo Finance使用quantmod或tidyquant的包装器将每日价格数据下载到了quantmod包中。区别在于,quantmod收集数据并将其存储为xts对象,tidyquant收集数据并将其存储为tibble,从这里我们可以更轻松地使用tidyverse处理数据的功能,将数据转换回使用timetk包中的tk_xts函数将其添加到xts对象。

公司是苹果,哈雷戴维森,英伟达,微软,AMD,福特,通用电气,3M,英特尔和亚马逊。(本文基于R语言实现

因子建模(附代码)

数据如下所示,我们删除了Open,High,Low,Close和Volume数据,仅保留了Adjusted价格,其中每个资产都是其自己的列,数据已转换为时间序列对象或xts对象, data存储为索引(或行名),在下表中不可见。

因子建模(附代码)

我们还用同样的方法收集了标普500指数数据:

因子建模(附代码)

看起来类似于单个资产的价格。

因子建模(附代码)

我们可以用chartSeries函数绘制数据:

因子建模(附代码)

我们在portfolio_returns和SPY收益中对所有资产计算每日对数收益:

因子建模(附代码)

每项资产的收益数据:

因子建模(附代码)

我们可以使用autoplot功能通过ggplot功能绘制xts或者时间序列数据(我们仅绘制前3项资产):

因子建模(附代码)

因子建模(附代码)

2

R实现

接下来,我们首先需要定义以下几点:

  • 我们在投资组合中拥有的资产数量,以前表示为N

  • 我们应用模型的天数,通常表示为T。

因子建模(附代码)

a. 我们可以计算如下所示:

因子建模(附代码)

其中收益:

因子建模(附代码)

然而,为了更好的理解它,我们可以将其分解为每个计算:

beta公式的cov协方差矩阵部分如下所示:

因子建模(附代码)

我们可以使用基础R来计算协方差如下:

因子建模(附代码)

其中xi是我们的资产,yi是SPY500。代码:

因子建模(附代码)

它对应于cov(portfolio_returns,SPY_returns)计算中的第一个结果AAPL。我们可以将x = Portfolio_returns[,1]中的更改为,,…,以计算每项资产(分别为HOG,NVDA和MSFT)的协方差,也可以将以上内容包装到for循环中以计算所有资产。注意:我只在for循环中将上述方程式中的更改为,其他所有内容都是不变的。

因子建模(附代码)

SPY收益的方差为

因子建模(附代码)

其中计算为:

因子建模(附代码)

在R中我们可以像这样简单计算它:

因子建模(附代码)

将所有这些放在一起,我们可以计算beta。回想一下:

因子建模(附代码)

其中此处的ri是在我们的投资组合中的每一项资产,y是市场收益率或SPY500收益率。

使用R为我们资产的每一项计算beta,我们可以将上述代码包装到一个函数中:

因子建模(附代码)

我们可以将这个函数应用于数据中的单项资产,然后将所有这些资产:

因子建模(附代码)

这里的解释是,值等于1表示资产与市场的移动完全相关,值>1表示资产的移动比市场的移动更多,或者当市场移动时波动性更大,而值<1表示资产的移动少于市场的移动。

通常,科技股的市场beta较高,而成熟的非科技股的市场beta较低。也就是说,AAPL,NVDA,MSFT和AMD的beta均大于1,而HOG和Ford(F)的beta均小于1。    

b. 阿尔法被定义为:

因子建模(附代码)

其中_ri是我们投资组合中单项资产的平均收益率,βi是我们样本期内每个资产的beta值,_f是SPY的平均收益率。因此,我们可以像这样计算alpha:

因子建模(附代码)

我们资产的阿尔法或者如下:

因子建模(附代码)

还有其他方法计算,但是对于单因子模型我们可以从PerformanceAnalytics包中使用CAPM.alpha。

因子建模(附代码)

比我们刚刚做的要简单多了。Ra是资产收益率,Rb是市场收益率,Rf是无风险收益率。

在研究了PerformanceAnalytics包中的CAPM.beta函数之后,我们注意到它们具有CAPM.beta.bull和CAPM.beta.bear的函数,因此我想看看每项资产的绘制出来如何。

因子建模(附代码)

因子建模(附代码)

3

可视化收益的协方差矩阵

为了可视化协方差矩阵,需要一些更深入的研究。

最终,我们要计算以下内容:

因子建模(附代码)

其中

因子建模(附代码)

我们从之前使用beta和alpha结果,同理。我创建了一个函数,该函数接受资产并计算残差和Sigma值。我们在这里计算的是以下内容:

err

因子建模(附代码)

其中i=1,···,N

Sigma

因子建模(附代码)

以上等式在基础R中的代码为:

因子建模(附代码)

现在我们有值。我们想要创建一个矩阵,其Sigma值位于对角线下方。

因子建模(附代码)

这将是我们创建的对角矩阵,如下所示:

因子建模(附代码)

现在我们有我们的对角矩阵Diag(@),我们可以使用收益计算对角矩阵:

因子建模(附代码)

然后从stats包中使用cov2cor函数。

因子建模(附代码)

因子建模(附代码)

相关表如下所示:

因子建模(附代码)

4

ETF分析和随机抽样的投资组合

由于因子建模全部是关于风险和投资组合分析的,所以我们认为比较一些美国交易所交易基金(ETFs)和标普500指数随机选择的资产投资组合的表现会很有趣。

为了构建随机创建的投资组合,我们首先删除了*页面中包含标普500指数公司的列表以及其交易代码,然后筛选出所有A、B和C类股票,因为一些公司具有多种资产类别,而我不想要对两种相同资产进行采样。

就像之前一样,我们收集数据并将其放入时间序列格式。

因子建模(附代码)

如下所示:

因子建模(附代码)

接下来,我们收集了美国ETFs:

因子建模(附代码)

数据如下所示:

因子建模(附代码)

SPY500:

因子建模(附代码)

如下:

因子建模(附代码)

现在,我们有一系列的3个数据集,分别是从SPY500维、ETFs和SPY500中随机选择的资产调整后的收盘价。接下来,计算每日收益率。

因子建模(附代码)

asset_returns如下所示:

因子建模(附代码)

然而,我们想要假设我在一个投资组合中拥有所有这些资产。对行进行平均,并将数据加入ETFs,并将其称为all_returns。

因子建模(附代码)

all_returns数据如下所示,其中我们可以看到myPortfolio已经添加了ETF数据集。

因子建模(附代码)

接下来,我们计算(像之前一样)投资组合的和。这次只用PerformanceAnalytics包中的CAPM.beta和CAPM.alpha函数。

因子建模(附代码)

根据它们的值排名了ETF’s。我们可以看到GDX有最高值和最低值是有道理的,因为它的Goldminers ETF追踪了Arca黄金矿业指数(GDMNTR),该指数跟踪了从事黄金矿业的公司的业绩。据我所知,SPY500上市的金矿公司很少。但是,这是一种按其值展示和排名ETFs并查看其相应值的好方法。

因子建模(附代码)

因子建模(附代码)

我们还可以通过阿尔法和贝塔的比值来排名阿尔法和贝塔,并绘制结果。

因子建模(附代码)

因子建模(附代码)

更改几行代码,我们可以绘制并看到负alpha的对beta比值最糟糕的表现。

因子建模(附代码)

因子建模(附代码)

我们可以先获得我们ETF的Bata和alpha值,再计算alpha:

因子建模(附代码)

最终,对ETF进行了随机抽样(由于要分析的样本太多),并绘制了ETF之间的相关性。

因子建模(附代码)

因子建模(附代码)

5

夏普比率、CAPM、Fama-French因子分析

使用简单的图仍无法为我们提供有关ETF、投资组合或资产的足够信息。夏普比率Sharpe(1966)是更好的度量。夏普(Sharpe)比率是一种报酬变动比率,它允许我们能够在调整风险之后将投资组合的表现与无风险资产进行比较。这需要之间的区别投资组合的收益率和无风险收益率,然后将其除以标准差(衡量投资组合的波动性)。

夏普比率告诉我们,每单位风险增加我们可以期望增加多少收益单位。夏普比率定义为:

因子建模(附代码)

其中

因子建模(附代码)

仅具有市场因素的单一资产模型如下:

因子建模(附代码)

在t时我们获得x和y的期望:

因子建模(附代码)

方差:

因子建模(附代码)

因此,夏普比率变为:

因子建模(附代码)

回想:

因子建模(附代码)

我们只需插入之前定义的

因子建模(附代码)

因子建模(附代码)

即可,方程式变为:

因子建模(附代码)

经过一些代数运算,我们可以获得:

因子建模(附代码)

最终我们得出以下结论:

因子建模(附代码)

   

我们可以用

因子建模(附代码)

表示夏普比率,其中x_是x从t=1到T这个历史期间的平均值,简单计算为

因子建模(附代码)

在R中我们可以简单的使用:colMeans(all_returns)/sqrt(diag(var(all_returns)))。

机器学习和集群

我们可以根据其bate、alpha和夏普比率值对ETF进行聚类。我们为什么要这样做?该模型可能具有比此处3个变量更多的变量,因此可以将这些公司聚集在一个较高维度的空间中,因此我们可以基于这些簇选择ETF,并将其用作投资组合多元化工具,即一个集群可能包含风险较高的ETF,而另一个可能包含价值股或成长股。由于这里的变量很少,因此无法正常工作,但是有了更多的变量,我们可以更好地分类ETF。

因子建模(附代码)

因子建模(附代码)

beta_alphas_sharpe数据如下所示:

因子建模(附代码)

我们可以在一个3D图中绘制bate、alpha和夏普比率,并从kmeans模型中根据簇来对它们上色。这也给机会使用我们可以与之交互的threejs包。

因子建模(附代码)

因子建模(附代码)

6

Fama和French因子模型

最后,我分析了各种ETF的表现。CAPM公式试图通过单因子(整个市场)来解释投资组合的表现。CAPM定义如下:

因子建模(附代码)

我们可以通过在模型中添加因子来进一步扩展模型。因此,三因子模型看起来像:

因子建模(附代码)

它从CAPM中获取了市场因子,并增加了两个新因子,SMB和HML或Small-minus-Big和High-minus-Low。SMB试图发挥规模效应,从长远来看,小型市值公司应跑赢市场。HML其目的是通过根据较高的市销率对资产进行分类来捕获价值与增长效应。通常,市净率高的公司是价值股,而市净率低的公司是成长股,文献还显示,从长远来看,价值股的表现要优于成长股。

Fama French因子模型使我们能够分析基金经理的业绩,因为如果Fama French因子可以解释资产管理者的投资组合,那么该基金经理就不会通过选择投资组合和技能来增加任何价值,因此也就没有获得alpha值。

更正式地说,我们的等式变为:

因子建模(附代码)

在R中使用以下来解决:

1、像以前一样下载数据,并将每日价格转换为每日收益-(我们设置了一个seed,以便使用set.seed收集相同的数据)。


因子建模(附代码)因子建模(附代码)

2、下载ETF并转换成每日收益。

因子建模(附代码)

3、将随机选择的股票的平均每日收益作为数据,并将数据与ETF合并,然后将数据设置为时间序列对象。我们还从Kenneth French网站上下载了每日Fama French 3因子,并整理了一下数据。

因子建模(附代码)

最终我们可以计算解为:

因子建模(附代码)

我们可以看到:

因子建模(附代码)

相反,我们可以使用线性回归模型来估计它们。对于我的随机投资组合myPortfolio,我们可以使用lm函数来建立线性模型,然后使用broom包中的tidy函数将输出整理整齐:

因子建模(附代码)

我们可以使用apply命令并应用我们自己的自定义lm函数将其应用于数据中的所有ETF。

因子建模(附代码)

我们还可以将tidy命令应用于各个ETF,然后使用stars.pval使数据更加整洁。

因子建模(附代码)

因子建模(附代码)

最后,我们可以使用lapply函数整理数据,使用map函数将p值变异或转换为星形,从而对所有ETF应用相同的方法。然后随机抽取5个ETF回归样本。

因子建模(附代码)

因子建模(附代码)因子建模(附代码)

这里有一些注意事项:我们应该对ETF的超额收益建模,而不仅仅是ETF收益。替换非常简单,例如与lm回归的中的myPortfolio,其中RF3为Fama和French数据附带的无风险利率。我们也应该通过运行coeftest(myPortfolioReg,NeweyWest(myPortfolioReg,lag = N,prewhite =FALSE))使用NewyWest调整后的标准误差。文献表明应该使用

因子建模(附代码)

滞后,其中N是观察数。我们可以像以前一样根据ETF的alpha对ETF进行排名,并在高alpha上做多,在低alpha上做空。通过此处的Fama French回归来运行我们的对冲投资组合,看看我们是否能够获得更好的表现。

最后,在这里我只使用了3因子模型。我们可以使用文献中的更多因子。在Kenneth French网站上,我们可以收集有关Market,SMB,HML,RMW,CMA和MOM的数据。其中RMW是利润因子,CMA是投资因子,而MOM是动量因子。

在下面,将提取每日Fama和French 5 因子模型并将其绘制出来。


因子建模(附代码)因子建模(附代码)

因子建模(附代码)

2020年第33篇文章

量化投资与机器学习微信公众号,是业内垂直于Quant、MFE、Fintech、AI、ML等领域的量化类主流自媒体。公众号拥有来自公募、私募、券商、期货、银行、保险资管、海外等众多圈内18W+关注者。每日发布行业前沿研究成果和最新量化资讯。

因子建模(附代码)

你点的每个“在看”,都是对我们最大的鼓励