作者:Stuart J
编译:波哥大 | 公众号翻译部
近期原创文章:
♥ 5种机器学习算法在预测股价的应用(代码 数据)
♥ Two Sigma用新闻来预测股价走势,带你吊打Kaggle
♥ 2万字干货:利用深度学习最新前沿预测股价走势
♥ 一位数据科学PhD眼中的算法交易
♥ 基于RNN和LSTM的股市预测方法
♥ 如何鉴别那些用深度学习预测股价的花哨模型?
♥ 优化强化学习Q-learning算法进行股市
♥ WorldQuant 101 Alpha、国泰君安 191 Alpha
♥ 基于回声状态网络预测股票价格(附代码)
♥ AQR最最最新 | 计量经济学应用投资失败的7个原因
♥ 关于高盛在Github开源背后的真相!
♥ 新一代量化带货王诞生!Oh My God!
♥ 独家!关于定量/交易求职分享(附真实试题)
♥ Quant们的身份危机!
♥ 拿起Python,防御特朗普的Twitter
正文
在这篇文章中,我们将比较蒙特卡洛分析(Monte Carlo analysis)和自举法(Bootstrapping)中的一些概念,这些概念与模拟收益序列以及生成与投资组合潜在风险和回报相关的置信区间有关。
这两种方法都用于为给定的资产或资产组合生成模拟的价格路径,但它们使用的方法略有不同,对于以前没有遇到过的人来说,这两种方法之间可能显得有些微妙。从技术上讲,自举法(Bootstrapping)是蒙特卡洛模拟(Monte Carlo analysis)的一个特例,所以乍一看这两个方法可能有点令人困惑。
对于蒙特卡罗分析(这里我们主要谈论“参数化的”蒙特卡罗方法),我们的想法是基于一些潜在的模型特征来生成数据。所以,例如,我们基于正态分布生成数据,指定我们对模型的期望输入,在这里就是平均值和标准差。那我们从哪里获得这些输入数据,人们往往会根据所讨论资产的历史实际价值来设置这些输入量。
因此,如果我们试图运行一些参数化的蒙特卡罗运行来生成模拟数据,例如股票上的应用,我们倾向于测量并计算该股票在一段时间内实际历史回报率的平均值和标准差,并将其用作模型的输入值。这就是这种方法的缺点之一,因为这样模型的输出值和相应的推论会依赖于这样一个假设,即股票的未来回报率会有与历史回报率相同的特征(至少这会用于计算模型的输入值)。
那么什么是Bootstrapping以及它有何不同?Bootstrapping也使用历史回报率作为模型输入,但这种方法使用历史数据更加明确。我们实际上是通过从历史回报率的分布去抽样来生成我们的数据,而不是计算回报率的基本特征然后将它们插入到参数化的模型中。
值得注意的是,Bootstrapping是一个涉及“替换”,并且属于“替换采样”方法的概念。
这意味着当一个随机样本从历史回报率的分布中被提取时,它不会被“抛弃”并从“帽子”中移除,而是将其替换并放回,以便在接下来的抽样期间被再次进行选择。
这有一个需要注意的关键点,就是这种方法会导致一个根本不同的结果,即如果一个是“无需替换的样本”,那么在任何时候一个数据点被选中,它将从样本中被移除。
Bootstrapping方法背后的逻辑是,如果我们使用带有替换性的抽样,如果是随机的情况下,那么抽取的每个样本将具有在“现实生活”中相同的出现频率——比如上述在实际市场中出现那个特定的股票(这再次依赖于上述的那个假设,即基于抽取的样本,未来的收益分配将保留与历史收益相同的分布特征。也就是说,未来和过去的收益分布均来自相同的“总体”)。
为了解释这个问题,我们会收集一篮子资产的数据去创建一个同等权重的投资组合,然后运行参数化的蒙特卡罗方法和Bootstrapping模拟,接着比较这两个结果——看看它们的结果有多么相似!
首先是一些基本的导入和其他变量设置(图表的样式,“魔术”指令调用,在Jupyter notebooks中启用matplotlib绘图,并设置“figsize”变量以便用于图表调用)。
现在我们使用“pandas_datareader”从雅虎(Yahoo)下载一些价格数据用于各种股票指数,并将它们全部重新设置为从1开始以便进行比较。
接下来让我们为下载的资产数据绘制我们的价格序列。
现在,当对资产组合进行Bootstrapping时,我们要确保我们做法是正确的,这一点至关重要。我们的方法必须能够解释资产之间的任何相关性,如果我们不这样做,我们将得到偏离现实的结果。
例如,两个强负相关的股票,如果我们在进行随机抽样时对每个股票进行独立抽样,我们可能会抽取股票1在某个特定日的的样本,以及股票2在另一天的样本。好吧,如果我们这样做,我们可能就会看到这个样本对股票1有强正相关性,对于股票2而言,我们真的可以相信这是一种真正代表这两个股票之间真实关系的情况吗?
答案是否定的,因为我们正在比较“苹果和橙子”——我们需要从同一时间段抽取我们的投资组合成分的样本,只有这样的随机样本才能正确地捕获所有资产之间的相关性。
因此,我们可以从我们所有投资组合成分的历史回报率序列中生成多个随机抽样(替换),然后相应地对它们进行加权,最终将加权回报相加并将相应的输出记录为我们的自举法的(Bootstrapped) “投资组合回报”。 然后我们会多次重复此过程,每次记录模拟的“投资组合回报” ——这个模拟回报路径的集合就是我们的自举法的输出。
或者,我们可以通过相应地对组合历史回报进行加权,将它们相加,然后对该单一组合历史回报分布执行Bootstrapping过程来构建投资组合回报。 这个结果非常类似,因为在第二种方法中的构建投资组合的方式也固有地保留了组成资产之间所有相关性,因为回报序列是使用同一天发生的加权成分收益计算的。所以我们可以只自举单个组合,再次生成多个模拟收益路径,这些路径的集合将是我们的Bootstrapped输出。
让我们从第二种方法开始,创建我们同等加权的投资组合回报序列。我们只对相同权重的投资组合的单个成分收益取均值 - 这很简单。 然后让我们根据各个组合成分绘制我们投资组合的“价格序列”。
正如你所期望的那样,回报最终会在位于单个回报的中间位置。事实上,由于这是一个同等加权的投资组合,它最终会完全精确地位于成分收益的“中间”。
现在让我们在投资组合收益序列中执行Bootstrapping过程并绘制结果。
我们在下面这样做只是为了证明从另一个方法去完成上述目标是类似的。我们采用单个成分收益序列的样本,并使用它们来创建我们的Bootstrapped模拟量。我们以相同的结果结束(这里或者那里,当然有一个随机元素,即使基于相同的方法也会使每个得到的模拟量都不同)——下面是实现它的代码。
最后,我们看下使用参数化的蒙特卡罗方法,之后我们可以快速比较各种方法之间的结果。
如前所述,参数化的蒙特卡罗方法涉及使用基础总体的特征来生成随机样本的值。我们在这里讨论的特征是历史回报分布的均值和标准差(或方差)。然后将这些值输入到模型中,该模型从一个正态分布中随机采样,其平均值和标准差等于历史回报的平均值和标准差。
让我们首先从我们的投资组合中提取这些数据。我们就有了早期的历史收益序列。
现在我们从均值为0.04%,标准差为0.85%的正态分布中产生必要的样本。
现在让我们最终运行蒙特卡罗模拟方法,但这次从每个单独的资产分布中创建随机样本,然后构建我们的投资组合,看看结果是否有任何差异。
为每个单独的资产创建模拟资产回报的DataFrame,并将它们存储在列表中。
使用列表推导来遍历资产回报DataFrames列表,并将值除以资产数量以表示同等加权的投资组合。
使用“functools”库中的“reduce”函数将DataFrame值加在一起(顺便说一句,对于这样的大型库,加载的函数非常有用,绝对值得一试)。
最后,我们绘制了蒙特卡罗组合值模拟结果。
我们可以立即发现有些东西看起来不同!或者,也许不是立即,但有些东西应该跳出来到我们面前。如果你注意到,所有以前的模拟,无论是Bootstrapping还是Monte Carlo,产生的模拟值都在0.8到1.6的结束值范围内。 但在最后一个图中,我们看到这些界限已经收紧到0.9到1.3左右。
这是一个显着的差异,而且不能仅仅考虑随机性的影响。如果你重新运行所有这些模拟几次,你会发现结果仍然相似,并且最后一种方法几乎总会产生更紧密的结束值范围。
那你为什么要问这个呢!
还记得当我们提到个别资产之间的相关性的影响,以及我们在运行模拟时必须小心捕获这种影响的事实吗?它只是最后一种无法捕获这种相关性关系的方法。
让我们快速浏览一下我们选择的“资产范围”中资产成分回报之间的历史相关性。
注 - 重要的是计算资产收益之间的相关性,而不是它们的价格(可能在未来的文章中更多地提及)。
让我们创建一个漂亮的小相关热力图来看看。
从上述数值来看,我们可以看到所有资产在某种程度上都是正相关的,有些值更大,重要的是所有的值都是正的。
要说明为什么我们的最后一个情节和最后一个模拟方法(对成分资产进行参数蒙特卡罗模拟然后加权并求和以表示我们的投资组合)导致更窄范围的结束值,这有许多要解释。
逻辑相当简单——当两个资产相关时,它们往往会同时向同一个方向移动——所以如果一个值上升,那么另一个一般也会如此(有一些警告——再次,或许更多在未来的文章中)。这导致包含正相关资产的投资组合,平均而言,比完全不相关资产的投资组合会有更多极端的值,或者实际上是负相关资产的投资组合。
这是因为如果所有成分资产高度相关,它们都会同时上下移动,导致价值波动更大。
那么这与我们的情况有什么关系?为什么它会导致最后一个模型中结果差异?
前三种方法都捕获了组成资产之间存在的内在相关性,而我们的最后一种方法却没有。
方法1使用真实的历史日收益值创建了我们的投资组合,这些值实际上是在市场上同一天发生的——因此所采用的移动是由真实的动作产生的,这些移动是由可以解释的标的资产运动过程产生的,并且这一过程受的资产之间的真实相关性影响。
方法2的逻辑相同——尽管我们这次为我们的个人资产提供了Bootstrapped回报,然后形成了投资组合,但再次仔细选择了Bootstrapped的初始回报,以便一次抽取的所有回报都来自同一天的每个资产。这再次确保我们提取的值是实际发生在一天的实际值,并且再次由真实的标的资产运动过程生成,这隐含地解释了资产之间的相关性。
现在,对于方法3和方法4的差异,它变得稍微微妙一些。
通过方法3,我们使用真实的单个资产回报创建了我们的投资组合,然后运行参数化的Bootstrap过程,根据投资组合的基本特征模拟回报序列。现在这里是重要的部分——因为投资组合首先是通过使用个别资产的加权每日收益的实际值创建的,价格序列隐含地解释了资产之间的相关性。然后,当运行蒙特卡罗模拟时,输入的参数是在具有隐含内置的相关关系的历史价格序列上计算的。因此,该方法DID捕获了相关性的影响。
但是,对于方法4,我们未能正确地模拟资产之间的相关性。对于每个资产单独的蒙特卡罗模拟都使用基于完全相互独立的计算值计算的参数。
一项资产的均值和标准差的计算是在“真空”中进行的,在某种程度上,完全独立于其他资产。
由于抽样样本来自正态分布,这意味着每个资产每天抽取的单个值确实是“随机的”——也就是说,不管其他资产的结果如何,每个单独资产的结果可能有相等的机会是正面的或负面的。
这听起来非常像我们对一系列完全不相关的资产所期望的——每个资产随机移动,而不管其他资产的移动。
突然间,我们开始模拟一篮子不相关资产的模拟价格系列!
这不是我们想要的......所以在执行这些方法时要小心,并确保正确建模你实际想要建模的内容!
—End—