蒙特卡罗模拟
蒙特卡洛模拟通常用于对随机(随机)系统的行为进行建模。本用户指南的此部分涵盖了使用 Math Expressions 执行蒙特卡洛模拟的基础知识。
随机时间序列
股票价格的每日变动通常被描述为“随机游走”。但这真正意味着什么,它与随机时间序列有何不同?以下示例将使用蒙特卡洛模拟来探索“随机游走”和随机时间序列。
理解差异的一个有用的第一步是将每日股票收益可视化为时间序列,计算为收盘价减去开盘价。
以下示例使用 search
函数返回股票代码为 CVX(雪佛龙)的 1000 天每日股票收益。然后将 change_d
字段(即当天的价格变化)绘制为时间序列。
请注意,每日价格变化的时间序列在零以上和零以下随机移动。有些日子股票上涨,有些日子下跌,但似乎没有明显的模式或步骤之间的任何依赖性。这提示这是一个随机时间序列。
自相关
自相关衡量信号与其自身相关程度。自相关可用于确定向量是否包含信号或时间序列中的值之间是否存在依赖性。如果时间序列中的值之间没有信号和依赖性,则时间序列是随机的。
绘制 change_d
向量的自相关以确认它确实是随机的很有用。
在以下示例中,搜索结果被设置为一个变量,然后 change_d
字段被矢量化并存储在变量 b
中。然后使用 conv
(卷积)函数对 change_d
向量进行自相关。请注意,conv
函数只是将 change_d
向量与其自身的反向副本“卷积”。这是使用卷积执行自相关的方法。用户指南的数字信号处理部分详细介绍了卷积和自相关。在本节中,我们只讨论绘图。
该图显示了相关性强度,该强度是通过将 change_d
向量通过 conv
函数沿自身滑动来计算的。请注意,在该图中,有一段长时间的低强度相关性,似乎是随机的。然后在中心有一个高强度相关性的峰值,其中向量直接排列。随后是另一段长时间的低强度相关性。
这是纯噪声的自相关图。每日股票变化似乎是随机的时间序列。
可视化分布
无法预测股票价格的随机每日变化,但可以用概率分布对其进行建模。为了对时间序列进行建模,我们将首先使用 empiricalDistribution
函数可视化 change_d
向量的分布,以创建数据的 11 个箱体直方图。请注意,该分布似乎是正态分布。每日股票价格变化确实倾向于正态分布,尽管由于这个特征,本示例专门选择了 CVX。
拟合分布
ks
测试可用于确定数据向量的分布是否符合参考分布。在以下示例中,ks
测试使用 正态分布执行,其中 均值 (mean
) 和 标准差 (stddev
) 作为 change_d
向量的参考分布。ks
测试将参考分布与 change_d
向量本身进行比较,以查看它是否符合正态分布。
请注意,在以下示例中,ks
测试报告的 p 值为 .16278。通常使用 .05 或更小的 p 值来否定测试的原假设,即该向量可能来自参考分布。
ks
测试(通常比较敏感)已确认似乎是正常的可视化。因此,在以下蒙特卡罗模拟中,具有 change_d
向量的 均值和 标准差 的正态分布将用于表示雪佛龙的每日股票收益。
蒙特卡罗
现在,我们已经将分布拟合到每日股票收益数据,我们可以使用 monteCarlo
函数来运行使用该分布的模拟。
monteCarlo
函数运行指定次数。在每次运行中,它都会设置一系列变量并运行一个最终函数,该函数返回一个数字值。monteCarlo
函数将每次运行的结果收集到一个向量中并返回该向量。最终函数通常具有一个或多个变量,这些变量在每次运行时都从概率分布中提取。sample
函数用于提取样本。
然后,可以将模拟结果数组视为经验分布,以了解模拟结果的概率。
以下示例使用 monteCarlo
函数模拟 100 天股票收益的总收益分布。
在该示例中,从 change_d
向量的均值和标准差创建 normalDistribution
。然后,monteCarlo
函数从正态分布中抽取 100 个样本,以表示 100 天的股票收益,并将样本向量设置为变量 d
。
然后,add
函数计算 100 天样本的总收益。monteCarlo
函数收集 add
函数的输出。重复此过程 50000 次,每次运行都从正态分布中抽取一组不同的样本。
模拟结果设置为变量 s
,其中包含 50000 次运行的总收益。
然后使用 empiricalDistribution
函数将模拟输出可视化为 50 个箱的直方图。该分布可视化了股票代码 CVX 的 100 天股票收益的不同总收益的概率。
然后可以使用 probability
和 cumulativeProbability
函数来了解有关 empiricalDistribution
的更多信息。例如,probability
函数可用于计算 100 天股票收益的非负收益的概率。
以下示例使用 probability
函数从模拟的 empiricalDistribution
中返回 0 到 40 范围内的收益的概率。
随机游走
monteCarlo
函数还可用于对来自每日股票收益的 normalDistribution
的每日股票价格进行随机游走建模。随机游走是一种时间序列,其中每一步都是通过将随机样本添加到前一步来计算的。这会创建一个时间序列,其中每个值都依赖于前一个值,从而模拟股票价格的自相关性。
在以下示例中,随机游走是通过在每次蒙特卡罗迭代中将随机样本添加到变量 v
来实现的。变量 v
在迭代之间保持不变,因此每次迭代都使用 v
的前一个值。double
函数是每次迭代运行的最后一个函数,它只是将 v
的值作为双精度数返回。该示例迭代 1000 次以创建具有 1000 个步骤的随机游走。
请注意,由于步骤之间的依赖性,每日股票价格中的自相关性产生的曲线与股票价格的随机每日变化大不相同。
多变量正态分布
multiVariateNormalDistribution
函数可用于对两个或更多个正态分布变量进行建模和模拟。它还将变量之间的相关性纳入模型,以便研究相关性如何影响可能的结果。
在下面的示例中,探讨了对两只股票的每日总收益进行模拟。ALL 代码(Allstate)与前一个示例中的 CVX 代码(Chevron)一起使用。
相关性和协方差
多元模拟显示了相关性对可能结果的影响。在开始进行实际模拟之前,首先了解 Allstate 和 Chevron 股票收益之间的相关性和协方差非常有用。
下面的示例运行两次搜索以检索 Allstate 和 Chevron 的每日股票收益。将两个收益中的 change_d
向量读入变量(all
和 cvx
),并使用 corr
函数计算两个向量的皮尔逊相关性。
协方差是相关性的非缩放度量。协方差是多元模拟中使用的度量,因此计算两个股票收益的协方差也很有用。下面的示例计算协方差。
协方差矩阵
multiVariateNormalDistribution
实际上需要协方差矩阵,因为它包含两个股票收益向量的方差和两个向量之间的协方差。cov
函数将计算矩阵列的协方差矩阵。
下面的示例演示了如何通过将 all
和 cvx
向量作为行添加到矩阵来计算协方差矩阵。然后使用 transpose
函数对矩阵进行转置,以便 all
向量为第一列,cvx
向量为第二列。
然后,cov
函数计算矩阵列的协方差矩阵并返回结果。
协方差矩阵是一个方阵,其中包含每个向量的方差和向量之间的协方差,如下所示
all cvx
all [0.12294442137237226, 0.13106056985285258],
cvx [0.13106056985285258, 0.7409729840230235]
多元模拟
下面的示例演示了使用 multiVariateNormalDistribution
对两只股票代码进行蒙特卡罗模拟。
在该示例中,检索具有 change_d
字段的结果集,其中包括两只股票代码 all
(Allstate)和 cvx
(Chevron),并将其读入向量。
然后,从这两个向量中创建矩阵并对其进行转置,以便矩阵包含两列,一列包含all
向量,另一列包含cvx
向量。
然后,使用两个参数创建multiVariateNormalDistribution
。第一个参数是mean
值的数组。在这种情况下,all
向量的均值和cvx
向量的均值。第二个参数是从这两个向量的两列矩阵创建的协方差矩阵。
然后,monteCarlo
函数通过在每次迭代中从multiVariateNormalDistribution
中抽取 100 个样本执行模拟。每个样本集都是一个矩阵,包含 100 行和 2 列,其中包含来自all
和cvx
分布的股票收益样本。列的分布将与用于创建multiVariateNormalDistribution
的正态分布相匹配。样本列的协方差将与协方差矩阵相匹配。
在每次迭代中,grandSum
函数用于对样本矩阵的所有值求和,以获得两种股票的总股票收益。
模拟的输出是一个向量,可以像单一股票代码模拟一样完全相同的方式将其视为经验分布。在此示例中,它以 50 个箱的直方图绘制,该直方图可视化从股票代码all
和cvx
的 100 天股票收益中获得的不同总收益的概率。